[英]Using variables for creating objects and calling methods in Java
大家好我是 java 的初學者,遇到了一個問題,比如我可以使用變量來創建對象並調用方法來重用代碼。
特斯拉.java
public class Tesla extends Car {
@Override
public void buy(){
System.out.println("Tesla bought");
}
@Override
public void sell(){
System.out.println("Tesla Sold");
}
}
福特.java
public class Ford extends Car {
@Override
public void buy(){
System.out.println("Ford bought");
}
@Override
public void sell(){
System.out.println("Ford Sold");
}
}
汽車.java
public class Car {
public static void main(String[] args) {
String[][] arr = {{"Tesla, Buy"},{"Ford", "Sell"},{"Benz", "Sell"}};
Car car = new Tesla();
car.buy();
Car car = new Ford();
car.sell();
}
public void buy() {
System.out.println("Car bought");
}
public void sell() {
System.out.println("Car Sold");
}
}
這里不是創建每個 object,我只想使用一個 for 循環並基於數組元素創建相應的 object 和相應的方法。 邏輯如下。
public static void main(String[] args) {
String[][] arr = {{"Tesla, Buy"},{"Ford", "Sell"},{"Benz", "Sell"}};
for(int i = 0;i<arr.length-1;i++){
Car car = new arr[i][0]();
car.arr[i][1];
}
}
如何實現上述邏輯? 這在 Java 中可以實現嗎? 我在谷歌搜索找不到相關的問題或問題。 請幫我。 提前致謝。
注意:-我不想要解決方法,我只想知道使用我不知道的任何高級 java 概念是否可以實現邏輯。
而不是創建從超類(汽車)繼承的不同類(特斯拉、福特),只需將參數傳遞給您的汽車 class 方法:
public class Car {
public void Buy(String brand) {
System.out.println(brand+" bought");
}
public void Sell(String brand) {
System.out.println(brand+" Sold");
}
}
我還將主要方法移到單獨的 Runner class 中。 它唯一的職責是運行程序,而不是別的。 這樣,您可以將實現 model (Car...) 的類與用於運行程序的類分離。
此外,我的示例有點弱,因為我必須為每種方法傳遞品牌。 您應該做的是在您的 Car class 中引入構造函數的概念以及class 屬性的概念。 然后你的代碼變成
public Class Car{
private String brand;
public Car(String brand){
this.brand = brand;
}
public void Buy(String brand) {
System.out.println(brand+" bought");
}
public void Sell(String brand) {
System.out.println(brand+" Sold");
}
}
最后一件事:方法通常不以 Java 中的大寫字母開頭,因此您應該將 Buy 和 Sell 重命名為買入和賣出。
您的第二個要求也是參數化操作(買入或賣出)。 您可以應用相同的原則,即擁有一個通用方法 (doAction()),該方法現在將采用 2 個參數:汽車品牌和您想要執行的操作。 但是恕我直言,這將其推得太遠並失去了價值。
如果要根據字符串輸入實例化各種子類的對象,至少有兩種選擇:
正如Nikolaus 所評論的,一種方法是使用 Java 的反射工具。 這是“神奇”的方式,您可以在運行時找到與您的字符串輸入匹配的 class 的名稱。 例如, "Tesla"
字符串將引導您加載 Class 類型的Class
,表示您在編譯時編寫的Tesla
class。 您將調用Class
object 上的方法來創建子類的實例。 換句話說,您正在以編程方式對代碼new Tesla(…)
進行迂回替換。
我不建議走反射路線。 這不是“正常”的 Java 應用程序編程。 反射通常只在某些類型的框架和特殊的罕見情況下進行。
另一個更常用的路線是Builder模式。 您定義另一個 class 稱為CarBuilder
。 您將文本值傳遞給此類CarBuilder
的 object 的一個或多個方法。 這些方法驗證輸入。
完成各種輸入的設置后,您最終會調用一個通常稱為build
的方法。 該方法生成並返回Car
類型的 object 。 那輛Car
object 實際上是一個子類,實際上是Tesla
或Ford
。
CarBuilder builder = new CarBuilder() ;
builder.setBrand( "Tesla" ) ;
builder.set… = … ;
…
Car car = builder.build() ; // Actually a `Tesla` subclass object.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.