SuperClass s=new SubClass(); 是啥意思? [复制]
Posted
技术标签:
【中文标题】SuperClass s=new SubClass(); 是啥意思? [复制]【英文标题】:What is the meaning of SuperClass s=new SubClass();? [duplicate]SuperClass s=new SubClass(); 是什么意思? [复制] 【发布时间】:2017-02-06 08:40:21 【问题描述】: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.
我在 *** 上阅读了一些关于此的问题,但我不明白 SuperClass s=new SubClass();
的含义。
同样在输出中,如果测试对象可以访问 Test2 的 go()
方法,那么为什么它不能访问 back()
方法。
【问题讨论】:
另见官方语言教程:docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html 【参考方案1】:这是一个多态的例子,这意味着我们可以使用超类型的引用来引用子类型对象。
back()
方法没有为 Test
类型定义。您正在对无效的 Test
类型变量调用 back()
方法。
当你声明
Test t = new Test2();
您正在创建t
类型的引用变量Test
您指的是 Test2
类型的对象,使用
多态引用。
如果Test的对象可以访问Test2的go()方法,那么为什么它不能访问back()方法。
由于t
是Test
类型,它只能知道Test
类中定义的方法。它无法知道子类Test2
中定义的方法
关于你在评论中的问题,
当你说t.go()
时,编译器正在考虑go()
方法来自
Test
类正在被调用。在编译时不知道哪个
对象将被创建。
您的声明 Test t = new Test2();
在运行时创建 Test2
对象,该对象又从 Test2
调用 go()
方法,因为它覆盖了来自 Test
的 go()
你真的应该阅读compile time polymorphism和runtime polymorphism
【讨论】:
如果“它不知道在子类 Test2 中定义的方法”,那么 t.go() 的输出必须是“Test go”,这意味着它应该从 Test 调用 go() 方法。为什么调用Test2的go()方法? @AshrafMulla prasad 给出了解释的正当理由,如果您愿意,可以尝试阅读我的答案 是的@PavneetSingh 由于您的解释“这是多态语句,其中父引用变量可以保存子对象的引用”,因此想到了这个问题。和 Prasad Khamkar 的“它不知道在子类 Test2 中定义的方法”。现在我了解了多态的过程。非常感谢你们俩。 @PrasadKharkar 是的,这很好地解释了我的问题。感谢您提供它和其他参考链接。 有人想,当我写 Test t = new Test2();是 Test 的实例变量,即't' 表现得好像它是类 Test2 的一个实例,还是它是类 Test2 的实例,它表现得好像它是一个 Test 的实例?以上是关于SuperClass s=new SubClass(); 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
java SuperClass和SubClass之间的类型转换
Subclass构造函数是否从Superclass构造函数继承变量?