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

yruzcnhs  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(282)

大家好,我是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");         
        }

    }

这里不是创建每个对象,而是使用一个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中是可以实现的吗?我在谷歌上搜索,找不到相关的问题。请帮帮我。提前谢谢。
note:- i 我不想要一个解决方法,我只想知道是否可以使用我不知道的任何高级java概念来实现逻辑。

f1tvaqid

f1tvaqid1#

如果要根据字符串输入示例化不同子类的对象,至少有两个选项:
反射
生成器模式

反射

正如nikolaus所说,一种方法是使用java的反射工具。这是一种“神奇”的方法,在运行时可以找到与字符串输入匹配的类名。例如, "Tesla" 字符串将引导您加载类型为的对象 Class 代表 Tesla 在编译时编写的类。你可以在上面调用方法 Class 对象来创建子类的示例。换句话说,您正在以编程方式对代码进行迂回替换 new Tesla(…) .
我不建议走反思路线。这不是“正常的”java应用程序编程。反射通常只在特定类型的框架和特殊情况下进行。

生成器模式

另一种更常用的方法是构建器模式。你定义了另一个类,叫做 CarBuilder . 将文本值传递给此类型对象的一个或多个方法 CarBuilder . 这些方法验证了输入。
设置完各种输入后,您最终会调用一个常规调用的方法 build . 该方法生成并返回类型为的对象 Car . 那个 Car 对象实际上来自一个子类,实际上是一个 Tesla 或者 Ford .

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

goqiplq22#

与其创建继承自超类(car)的不同类(tesla、ford),不如将参数传入car类方法:

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类中。它唯一的责任就是运行程序而不是别的。这样,就可以将实现模型(car…)的类与用于运行程序的类解耦。
此外,我的例子是有点弱的意义上,我必须通过在每个方法的品牌。相反,您应该在car类中引入构造函数的概念和类属性的概念。你的代码就会变成

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 and sell重命名为buy and sell。
您的第二个要求也是参数化操作(购买或出售)。您可以应用相同的原则,即有一个通用方法(doaction()),现在将接受两个参数:汽车品牌和您要执行的操作。但我觉得这太过分了,失去了价值。

相关问题