对象创建语法之间的区别
请解释对象一和二之间的区别:
car one = new opel(); opel two = new opel();
类欧宝扩展了类车。
您可以将one
重新分配给car
其他子类的对象:
one = new Ford(...);
但你不能像这样重新分配two
,因为它仅限于成为一个opel
。
如果m
是在opel
类中定义但不在car
类中定义的方法,那么如果执行此操作,编译器将给出错误:
one.m();
但这没关系:
two.m();
因为它知道two
被限制为一个opel
,所以它知道方法m
将存在。
通常,您希望将变量声明为最广泛的类型。 也就是说,如果你只是在car
使用方法,那么用car
类型声明它(就像你用的那样),因为你告诉读者这个算法只需要知道one
是car
,它不需要知道它是什么样的车。
更多:有必要了解变量同时具有编译时类型和运行时类型 。 编译器将one
视为car
,因为它不知道变量在任何给定时间的car
类型。 但两者的运行时类型都是opel
。 如果你有一个为car
定义的方法mm
,然后为opel
重写, one.mm()
和two.mm()
都将调用相同的方法。 一旦编译器查看编译时类型并确定调用是合法的,那么在程序运行时调用哪一个取决于运行时类型。
在你的例子中没有任何区别,变量1和2引用了类’opel’的两个独立实例。 标题为“one”的变量可以分配给任何其他扩展汽车或汽车本身的对象,其中变量2只能分配给opel类型的对象。
您可能使用基类声明变量而不分配它的一个原因可能是因为您不知道在运行时将使用哪个特定类,比如说
private Car buildCar(string brandOfCar){ Car car; switch (brandOfCar){ case "Honda": car = new Honda(); break; case "Opel": car = new Opel(); break; } return car; }
你也可以创建一个Car数组,并用扩展Car的对象混合它,如果你创建了一个Opel数组,它只能包含Opels。
也就是说,汽车不是很好的例子,因为汽车的品牌应该只是汽车的一个属性,而不是一个延伸汽车的实际类别。
public class Opel extends Car{ private Car car; private String TypeofCar; public Opel(){ TypeofCar="Honda"; } public void display(){ System.out.println("Car :" + TypeofCar); }