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()方法。

由于tTest类型,它只能知道Test类中定义的方法。它无法知道子类Test2中定义的方法

关于你在评论中的问题,

当你说t.go()时,编译器正在考虑go()方法来自 Test 类正在被调用。在编译时不知道哪个 对象将被创建。 您的声明 Test t = new Test2(); 在运行时创建 Test2 对象,该对象又从 Test2 调用 go() 方法,因为它覆盖了来自 Testgo()

你真的应该阅读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构造函数继承变量?

.啥是多态?面向对象程序设计为啥要引入多态的特性?使用多态有啥优点?

寄生组合式继承

js继承函数封装

什么是多态?