[英]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"; }
Drink
應該是一個抽象類,並提供由Beer
和Rum
重寫的抽象成員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.