大家好,我是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概念来实现逻辑。
2条答案
按热度按时间f1tvaqid1#
如果要根据字符串输入示例化不同子类的对象,至少有两个选项:
反射
生成器模式
反射
正如nikolaus所说,一种方法是使用java的反射工具。这是一种“神奇”的方法,在运行时可以找到与字符串输入匹配的类名。例如,
"Tesla"
字符串将引导您加载类型为的对象Class
代表Tesla
在编译时编写的类。你可以在上面调用方法Class
对象来创建子类的示例。换句话说,您正在以编程方式对代码进行迂回替换new Tesla(…)
.我不建议走反思路线。这不是“正常的”java应用程序编程。反射通常只在特定类型的框架和特殊情况下进行。
生成器模式
另一种更常用的方法是构建器模式。你定义了另一个类,叫做
CarBuilder
. 将文本值传递给此类型对象的一个或多个方法CarBuilder
. 这些方法验证了输入。设置完各种输入后,您最终会调用一个常规调用的方法
build
. 该方法生成并返回类型为的对象Car
. 那个Car
对象实际上来自一个子类,实际上是一个Tesla
或者Ford
.goqiplq22#
与其创建继承自超类(car)的不同类(tesla、ford),不如将参数传入car类方法:
我还将把main方法移到一个单独的runner类中。它唯一的责任就是运行程序而不是别的。这样,就可以将实现模型(car…)的类与用于运行程序的类解耦。
此外,我的例子是有点弱的意义上,我必须通过在每个方法的品牌。相反,您应该在car类中引入构造函数的概念和类属性的概念。你的代码就会变成
最后一件事:在java中,方法通常不以大写字母开头,因此应该将buy and sell重命名为buy and sell。
您的第二个要求也是参数化操作(购买或出售)。您可以应用相同的原则,即有一个通用方法(doaction()),现在将接受两个参数:汽车品牌和您要执行的操作。但我觉得这太过分了,失去了价值。