Что означает 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. 
 }

 }

Я читал некоторые проблемы с stackoverflow по этому поводу, но я не понял значения SuperClass s=new SubClass();. Также в выводе, если объект тестирования может получить доступ к go() методу Test2, то почему он не может получить доступ к методу back().


person Ashraf Mulla    schedule 28.09.2016    source источник
comment
См. Также официальное языковое руководство: docs.oracle.com/javase/tutorial /java/IandI/polymorphism.html   -  person Jason C    schedule 28.09.2016


Ответы (1)


Это пример полиморфизма, который означает, что мы можем ссылаться на объект подтипа, используя ссылку супертипа.

back() метод не определен для типа Test. Вы вызываете метод back() для недопустимой переменной типа Test. Когда вы заявляете

Test t = new Test2();
  • Вы создаете ссылочную переменную t типа Test
  • Вы имеете в виду объект типа Test2, используя полиморфную ссылку.

Также в выводе, если Object of Test может получить доступ к методу go () Test2, то почему он не может получить доступ к методу back ().

Поскольку t относится к типу Test, он может знать только о методах, определенных в классе Test. Он не может знать о методах, которые определены в подклассе Test2.

Что касается вашего вопроса в комментарии,

  • Когда вы говорите t.go(), компилятор думает, что вызывается метод go() из класса Test. Во время компиляции неизвестно, какой объект будет создан.
  • Ваше объявление Test t = new Test2(); создает объект Test2 во время выполнения, который, в свою очередь, вызывает метод go() из Test2, потому что он переопределяет go() из Test

Вам действительно стоит прочитать о полиморфизме времени компиляции и полиморфизм времени выполнения

person Prasad Kharkar    schedule 28.09.2016
comment
если он не может знать о методах, которые определены в подклассе Test2, тогда вывод t.go () должен быть Test go означает, что он должен вызвать метод go () из Test. Почему он вызывает метод go () Test2? - person Ashraf Mulla; 28.09.2016
comment
@AshrafMulla prasad привел веские причины для объяснения, вы можете попробовать мой ответ для чтения, если хотите - person Pavneet_Singh; 28.09.2016
comment
Да, @PavneetSingh, этот вопрос возник из-за вашего объяснения. Это полиморфный оператор, в котором родительская ссылочная переменная может содержать ссылку на дочерний объект. и Prasad Khamkar's It не может знать о методах, которые определены в подклассе Test2. Теперь я понял процесс полиморфизма. Большое спасибо вам обоим. - person Ashraf Mulla; 28.09.2016
comment
@PrasadKharkar да, это было очень хорошее объяснение моего вопроса. Спасибо за это и дополнительные справочные ссылки. - person Ashraf Mulla; 28.09.2016
comment
Кажется, когда я пишу Test t = new Test2 (); Это переменная экземпляра Test, т.е.'t 'ведет себя так, как если бы это был экземпляр класса Test2 ИЛИ это экземпляр класса Test2, который ведет себя так, как если бы он был экземпляром Test? - person Ashraf Mulla; 29.09.2016
comment
Я взял ссылку на это предложение: полиморфизм - это способность экземпляра класса вести себя так, как если бы он был экземпляром другого класса в своем дереве наследования, чаще всего одним из его классов-предков. Например, в Java все классы наследуются от Object. Следовательно, вы можете создать переменную типа Object и присвоить ей экземпляр любого класса. - person Ashraf Mulla; 29.09.2016
comment
Есть только один экземпляр, Test2 (), на который ссылается ссылочная переменная t типа Test. Больше ничего. Test2 не ведет себя как экземпляр Test. Test t = new Test2 () просто означает, что мы создаем экземпляр Test2, и на него ссылается ссылочная переменная t типа Test. Это возможно, потому что Test2 расширяет Test и t является полиморфной ссылкой на экземпляр Test2. - person Prasad Kharkar; 29.09.2016