在 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,实际上是一个 Tesla
或 Ford
.
CarBuilder builder = new CarBuilder() ;
builder.setBrand( "Tesla" ) ;
builder.set… = … ;
…
Car car = builder.build() ; // Actually a `Tesla` subclass object.
大家好我是 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对象,你至少有两个选择:
- 反思
- 建造者模式
反思
与 "Tesla"
字符串会引导您加载类型为 Class
的对象,表示您在编译时编写的 Tesla
class。您将调用该 Class
对象的方法来创建您的子 class 的实例。换句话说,您正在以编程方式对代码 new Tesla(…)
.
不推荐走反思路线。这不是“正常”Java 应用程序编程。反射通常只在某些类型的框架和特殊的罕见情况下进行。
建造者模式
另一条更常用的路线是Builder pattern。您定义另一个 class 称为 CarBuilder
。您将文本值传递给此类型 CarBuilder
对象的一个或多个方法。这些方法验证输入。
完成各种输入的设置后,您最终会调用一个通常称为 build
的方法。该方法生成 returns 类型 Car
的对象。那个 Car
对象实际上来自一个子 class,实际上是一个 Tesla
或 Ford
.
CarBuilder builder = new CarBuilder() ;
builder.setBrand( "Tesla" ) ;
builder.set… = … ;
…
Car car = builder.build() ; // Actually a `Tesla` subclass object.