我们知道类A隐式扩展了Object类,但是如果我们使用类A的构造函数实例化Object类对象并尝试访问类A的print()方法,则它会显示编译时错误,而在其他情况下,类B会扩展类A和使用类B构造函数实例化的类A对象,并尝试访问print()方法工作正常。
class A{
public void print(){
System.out.println("A");
}
}
class B extends A{
public void print(){
System.out.println("B");
}
}
public class MyClass {
public static void main(String args[]) {
Object o = new A();
o.print(); // error
A a = new B();
a.print(); // print B
}
}
答案 0 :(得分:2)
此行:
o
您您知道A
实际上是{strong>类型o
的。
编译器可以知道,但是在Java中,不知道。编译器仅知道存在一个名为Object
的类型为o
的变量。
因此,编译器为在Object
上调用声明的类型npm build
不支持的方法而鼓掌!
其他语言在这些事情上“更聪明”,但是在Java中,事情就是这样。
答案 1 :(得分:1)
您的类B扩展A的示例与A扩展Object的情况不同。区别在于,在第一种情况下,超类(A
)包含print()
方法,在第二种情况下,超类(Object
)不包含print()
。如果您从print()
类中删除了A
方法,则第二部分也不起作用:
class A{
}
class B extends A{
public void print(){
System.out.println("B");
}
}
public class MyClass {
public static void main(String args[]) {
Object o = new A();
//o.print(); // error
A a = new B();
a.print(); // error
}
}
答案 2 :(得分:0)
因为Object类没有print()方法,并且引用o是Object类型,所以编译器将引发错误。 在情况2中:类A具有print()方法,这就是为什么没有编译错误的原因,并且在运行时它会调用类B的print()方法,因为我们在运行时分配了类B的引用。