SuperClass s = new SubClass();是什么意思?

时间:2016-09-28 11:34:36

标签: java object inheritance polymorphism abstraction

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

1 个答案:

答案 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() }

您应该真正了解compile time polymorphismruntime polymorphism