在 Java 中使用变量创建对象和调用方法

Using variables for creating objects and calling methods in Java

大家好我是 java 的初学者,遇到了一个问题,比如我可以使用变量来创建对象和调用方法来重用代码吗?

Tesla.java

public class Tesla extends Car {
    @Override
    public void buy(){
        System.out.println("Tesla bought");
        }
     @Override    
     public void sell(){
        System.out.println("Tesla Sold");
        }
}

Ford.java

public class Ford extends Car {
    @Override
    public void buy(){
        System.out.println("Ford bought");
        }
     @Override    
     public void sell(){
        System.out.println("Ford Sold");
        }
}

Car.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");         
        }
    
    }

在这里我不想创建每个对象,而是想使用一个 for 循环并根据数组元素创建相应的对象和相应的方法。 逻辑如下。

 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 中可以实现吗?我在 google 中搜索找不到相关的问题或问题。请帮我。提前致谢。

注意:- 我不想要解决方法,我只想知道 if 逻辑是否可以使用我不知道的任何高级 java 概念实现。

与其创建继承自超级class(汽车)的不同 classes(特斯拉、福特),不如将参数传递给您的汽车 class 方法:

public class Car {
    
        public void Buy(String brand) {
            System.out.println(brand+" bought");           
        }
        
        public void Sell(String brand) {
            System.out.println(brand+" Sold");         
        }
    
    }

我还会将 main 方法移出到一个单独的 Runner class。它的唯一职责是 运行 程序,除此之外别无其他。这样你就可以将实现模型(Car...)的 classes 与用于 运行 程序的 classes 分离。

此外,我的示例有点弱,因为我必须为每种方法传递品牌。您应该做的是在 Car class 中引入构造函数的概念和 class attribute 的概念。然后你的代码变成

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 重命名为 buy 和 sell。

您的第二个要求也是参数化操作(买入或卖出)。您可以应用相同的原则,即有一个通用方法 (doAction()) 现在将接受 2 个参数:汽车品牌和您要执行的操作。但恕我直言,这将它推得太远并失去了价值。

如果你想根据字符串输入实例化各种子class对象,你至少有两个选择:

  • 反思
  • 建造者模式

反思

一样,一种方法是使用 Java 的反射功能。这是“神奇”的方式,您可以在运行时找到与您的字符串输入匹配的 class 的名称。例如,"Tesla" 字符串会引导您加载类型为 Class 的对象,表示您在编译时编写的 Tesla class。您将调用该 Class 对象的方法来创建您的子 class 的实例。换句话说,您正在以编程方式对代码 new Tesla(…).

进行迂回替换

不推荐走反思路线。这不是“正常”Java 应用程序编程。反射通常只在某些类型的框架和特殊的罕见情况下进行。

建造者模式

另一条更常用的路线是Builder pattern。您定义另一个 class 称为 CarBuilder。您将文本值传递给此类型 CarBuilder 对象的一个​​或多个方法。这些方法验证输入。

完成各种输入的设置后,您最终会调用一个通常称为 build 的方法。该方法生成 returns 类型 Car 的对象。那个 Car 对象实际上来自一个子 class,实际上是一个 TeslaFord.

CarBuilder builder = new CarBuilder() ;
builder.setBrand( "Tesla" ) ;
builder.set… = … ;
…
Car car = builder.build() ;  // Actually a `Tesla` subclass object.