题目:
(3)对类进行动态实例化 Class.forName()
为某研究所编写一个通用程序,用来计算每一种交通工具运行 1000 公里所
需的时间,已知每种交通工具的参数都是 3 个浮点数 A、B、C 的表达式。现有
两种工具:Car 和 Plane,其中 Car 的速度运算公式为:A*B/C,Plane 的速度运
算公式为:A+B+C;需要编写三个类:ComputeTime、Plane、Car 和接口 Common,
要求在未来如果增加第 3 种交通工具的时候,不必修改以前的任何程序,只需要
编写新的交通工具的程序。
动态实例化代码:
Class.forName(args[0]).newInstance();
注意事项:
参数 args[0]应该为完整的类名。
如果对类进行动态实例化,则该类可以不定义构造方法,或者是无参的。
首先设置Common 类
public interface Common {
double getSpeed(double a,double b,double c);
}
其次依次设置Car 和Plane
public class Car implements Common {
@Override
public double getSpeed(double a, double b, double c) {
return a*b/c;
}
}
public class Plane implements Common {
@Override
public double getSpeed(double a, double b, double c) {
return a+b+c;
}
}
最后在Computer 中 main 中测试调用
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
public class Computer {
public static void main(String[] args){
String transport = "Plane";
double a = 23, b = 24, c = 25;
try {
Common newtransport = (Common) Class.forName(transport).newInstance();
System.out.println(transport+"'s speed is : "+newtransport.getSpeed(a,b,c));
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
1