Test.java
public class Test {
public void go(){
System.out.println("Test go");
}
}
Test2.java
public class Test2 extends Test {
public void go(){
System.out.println("Test 2 go");
}
public void back(){
System.out.println("Test 2 back");
}
}
class Demo{
public static void main(String[] args) {
Test t=new Test2();
t.go(); // Output : "Test 2 go"
t.back(); //Compile time error.
}
}
我在stackoverflow上读到了一些关于此的问题,但我不理解SuperClass s=new SubClass();
的含义。
同样在输出中,如果测试对象可以访问Test2的go()
方法,那么为什么它无法访问back()
方法。
答案 0 :(得分:0)
这是多态性的一个例子,这意味着我们可以使用超类型的引用来引用子类型对象。
未为back()
类型定义 Test
方法。您在back()
类型变量上调用Test
方法,该方法无效。
当你宣布
Test t = new Test2();
t
Test
Test2
类型的对象
多态参考。同样在输出中,如果Object of Test可以访问Test2的go()方法,那么为什么它不能访问back()方法。
由于t
的类型为Test
,因此它只能了解Test
类中定义的方法。它无法了解子类Test2
关于您在评论中提出的问题,
t.go()
时,编译器正在考虑go()
方法
正在调用Test
类。在编译时,不知道是哪一个
将要创建对象。Test t = new Test2();
在运行时创建Test2
对象,后者又从go()
调用Test2
方法,因为它从{{1}覆盖go()
}