SuperClass s=new SubClass(); 是什么意思?
What is the meaning of SuperClass s=new SubClass();?
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.
}
}
我在 Whosebug 上阅读了一些与此相关的问题,但我不理解 SuperClass s=new SubClass();
的含义。
同样在输出中,如果测试对象可以访问 Test2 的 go()
方法,那么为什么它不能访问 back()
方法。
这是多态的一个例子,这意味着我们可以使用超类型的引用来引用子类型对象。
back()
方法没有为 Test
类型定义。您正在对无效的 Test
类型变量调用 back()
方法。
当你声明
Test t = new Test2();
- 您正在创建类型为
Test
的引用变量 t
- 您指的是类型为
Test2
的对象,使用
多态引用。
Also in output if Object of Test can access the go() method of Test2 then why it cannot access back() method.
由于t
是Test
类型,它只能知道Test
class中定义的方法。它无法知道 subclass Test2
中定义的方法
关于您在评论中提出的问题,
- 当你说
t.go()
时,编译器正在考虑 go()
方法
Test
class 正在呼叫。在编译时不知道哪个
将要创建对象。
- 您的声明
Test t = new Test2();
在运行时创建 Test2
对象,该对象又从 Test2
调用 go()
方法,因为它覆盖了 go()
12=]
你真的应该读一读 compile time polymorphism and runtime polymorphism
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.
}
}
我在 Whosebug 上阅读了一些与此相关的问题,但我不理解 SuperClass s=new SubClass();
的含义。
同样在输出中,如果测试对象可以访问 Test2 的 go()
方法,那么为什么它不能访问 back()
方法。
这是多态的一个例子,这意味着我们可以使用超类型的引用来引用子类型对象。
back()
方法没有为 Test
类型定义。您正在对无效的 Test
类型变量调用 back()
方法。
当你声明
Test t = new Test2();
- 您正在创建类型为
Test
的引用变量 - 您指的是类型为
Test2
的对象,使用 多态引用。
t
Also in output if Object of Test can access the go() method of Test2 then why it cannot access back() method.
由于t
是Test
类型,它只能知道Test
class中定义的方法。它无法知道 subclass Test2
关于您在评论中提出的问题,
- 当你说
t.go()
时,编译器正在考虑go()
方法Test
class 正在呼叫。在编译时不知道哪个 将要创建对象。 - 您的声明
Test t = new Test2();
在运行时创建Test2
对象,该对象又从Test2
调用go()
方法,因为它覆盖了go()
12=]
你真的应该读一读 compile time polymorphism and runtime polymorphism