请告诉我这三者在使用方面的区别: -
gen 2 = "test"
答案 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;