使用超类初始化子类对象有什么区别,反之亦然?

时间:2015-05-13 20:36:25

标签: java oop

请告诉我这三者在使用方面的区别: -

gen 2 = "test"

2 个答案:

答案 0 :(得分:3)

第一个和第三个对应的声明类型的对象 - 使用是完美的,你得到所有预期的方法。

第二个为您提供仅超类的功能,即使您实际上有一个Subclass对象,因为您将其声明为超类。

例如:

Superclass p1 = new Superclass();您的p1对象可以访问超类方法。

Superclass p2 = new Subclass();您的p2对象只能访问超类方法。该程序并不知道p2具有Subclass特定方法,因为您将其声明为超类。

Subclass p3 = new Subclass();您的p3对象可以访问所有Subclass和Superclass方法。

使用p2声明方法的注意事项:给定以下类A和B

public class A {
    public void print(){
        System.out.println("yyy");
    }
}

public class B extends A{
    public B() {
        super();
    }

    public void print() { // this overrides the print() method in A
        System.out.println("xxx");
    }

    public void printb() {
        System.out.println("second");
    }
}

这在代码中发生:

public static void main(String[] args) {
    A x =  new B();

    x.print(); // prints xxx because you actually have a B object even though you have an A reference
    x.printB(); // doesn't compile. You can't call B specific methods through an A reference.
}

答案 1 :(得分:1)

第一个和最后一个只是通常的变量声明和类实例化。

第二个

Superclass p2 = new Subclass();

声明类型为p2的变量Superclass,它可以存储Superclass实例或Superclass子类的任何实例。从p2开始,您只能访问Superclass中已提供的成员,但由于覆盖Subclass,他们的行为可能会有所不同。

此外,您可以使用p2检查instanceof中存储的实际类型。如果您知道实际类型,则可以将p2转换为子类类型的另一个变量。

if (p2 instanceof Subclass)
    Subclass p4 = (Subclass)p2;