Доступ к абстрактному методу класса - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть три разных класса:

1 -)

abstract class A {
abstract void one();
void two(){
    System.out.println("two");
one();
}
abstract void three();
 }

2 -)

abstract class B extends A {
void one() {
    System.out.println("one");
    three();//I think this method has to run
}

void three() {
    System.out.println("3");//That
}
}

3 -)

public class C extends B {
void three(){
    System.out.println("three");
}

}

в методе Main

public static void main(String [] args){
C c=new C();
c.one();
c.two();
c.three();
}

Вывод:

one
three
two
one
three
three

Но я думаю, что во втором коде метод one () должен запускать три метода, а вместо этого он должен показывать «3»«три», но этот код запускает три в классе C.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Метод three() переопределяется в C.Поскольку c содержит экземпляр C, это вывод, который вы видите.

0 голосов
/ 15 февраля 2019

Переопределение в java всегда работает на основе целевого объекта в ссылке 'c'.Поэтому, во-первых, он удастся в классе C для любой доступной переопределенной версии метода three (), в противном случае будет выполнена последующая версия родительского класса.

0 голосов
/ 15 февраля 2019

Метод three () переопределяется как в классе B, так и в классе C

Поскольку c является экземпляром класса C, любая ссылка на метод three () с объектом c будет вызывать реализацию three () в классе C

...