对象创建语法之间的区别

时间:2014-01-21 23:00:28

标签: java object polymorphism

请解释第一和第二对象之间的区别:

    car one = new opel();    
    opel two = new opel();  

类opel扩展了class car。

3 个答案:

答案 0 :(得分:3)

您可以将one重新分配给car的其他子类的对象:

one = new Ford(...);

但你不能像那样重新分配two,因为它仅限于opel

如果m是在opel类而不是car类中定义的方法,那么编译器会在您执行此操作时给出错误:

one.m();

但这没关系:

two.m();

因为它知道two仅限于opel,所以它知道方法m将会存在。

通常,您希望将变量声明为最广泛类型。也就是说,如果您只使用car中的方法,则使用car类型声明它(就像您使用one一样),因为您告诉读者算法只需要知道onecar,它不需要知道它是什么类型的汽车。

更多:有必要了解变量同时具有编译时类型运行时类型。编译器将one视为car,因为它不知道变量在任何给定时间的car类型。但两者的运行时类型将是opel。如果您有为mm定义的方法car,然后为opel覆盖,one.mm()two.mm()将同时调用相同< / em>方法。一旦编译器查看编译时类型并确定调用是合法的,那么在程序运行时调用哪一个取决于运行时类型。

答案 1 :(得分:0)

在你的例子中没有任何区别,变量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。

也就是说,汽车不是很好的例子,因为汽车的品牌可能只是汽车的一个属性,而不是一个延伸汽车的实际类别。

答案 2 :(得分:0)

public class Opel extends Car{

    private Car car;
    private String TypeofCar;

    public Opel(){
        TypeofCar="Honda";        
    }

    public void display(){
        System.out.println("Car :" + TypeofCar);
    }