簡體   English   中英

用Java動態創建對象

[英]dynamic object creation in java

我有下面的代碼。

public class Test {
    public static void main(String args[])
    {
        int i = 0;

        if(i==0){
            Beer obj = new Beer();
        }
        else {
            Rum obj = new Rum();
        }
        System.out.println(obj.brand);  //doesn't work
    } }

class Drink {
} 
class Beer extends Drink{
    public String brand = "BeerBrand"; }

class Rum extends Drink{
    public String brand = "RumBrand"; }
  1. 有沒有一種方法可以使上述工作不使用函數重寫或動態類加載?
  2. 所有類都是在JVM中動態加載的,沒有像C中那樣的靜態加載。這是正確的嗎?

Drink應該是一個抽象類,並提供由BeerRum 重寫的抽象成員getBrand()或類似成員。

然后,您將執行以下操作:

Drink d = null;
if (...) {
   d = new Beer();
}

因此您可以適當地實例化引用。 因為它仍然是Drink類型,所以您可以參考該品牌。 Drink參考將允許您訪問任何可飲用的東西,並且實現提供了具體信息。 請注意, Drink抽象的 ,因為您無法實例化Drink您必須更加具體。

要回答您的其他問題,您可以提供一種基本方法並執行以下操作:

if (this instanceof Beer) {
   ...
}

避免壓倒一切。 但是你為什么呢?

為了回答您的第二個問題,JVM會在引用后動態加載類。 您可以通過在JVM上設置-verbose標志來觀察發生的情況。

該代碼將無法正常工作,因為'obj'的作用域僅在if-else塊內。 您需要在Drink類型的if-else塊上方聲明它。

有沒有一種方法可以使上述工作不使用函數重寫或動態類加載?

唯一的選擇是使用反射,但是固定類的設計將更簡單/更好。

所有類都是在JVM中動態加載的,沒有像C中那樣的靜態加載。這是正確的嗎?

是。 它們可以動態加載不止一次,甚至可以卸載。


使用面向對象的方法看起來像這樣。

public class Test {
    public static void main(String... args) {
        Drink drink;
        if (args.length == 0) {
            drink = new Beer();
        } else {
            drink = new Rum();
        }
        System.out.println(drink.getBrand());
    }
}

interface Drink {
    public String getBrand();
}

class Beer implements Drink {
    @Override
    public String getBrand() {
        return "BeerBrand"; 
    }
}

class Rum implements Drink {
    @Override
    public String getBrand() {
        return "RumBrand";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM