簡體   English   中英

Java中使用變量創建對象和調用方法

[英]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 實際上是一個子類,實際上是TeslaFord

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.

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