Как следует отслеживать Java-программу с наследованием? - PullRequest
3 голосов
/ 09 апреля 2019

Я ищу способ объяснить, как следует отслеживать следующую Java-программу (какой метод вызывается и т. Д.), Особенно как модификатор доступа и наследование влияют на вызов метода.

У меня есть два класса A и B, где B расширяет A. Класс А имеет закрытый метод process() Класс B имеет открытый метод process() Класс A имеет открытый метод callProcess(), который вызывает process(). В основной программе я создаю объект B и вызываю метод callProcess().

class A {
    private void process(){
        System.out.println("Process A.");
    }
    public void callProcess(){
        process();
    }
}
class B extends A {
    public void process(){
        System.out.println("Process B.");
    }
}
class MethodTest{
    public static void main(String[] args){
        B b1 = new B();
        b1.callProcess();
    }
}

Я ожидаю, что process() из B вызывается, поскольку объект, который вызывает process(), относится к типу B, но происходит то, что process() из A вызывается. Что страннее, если я изменю модификатор process() в A на public, тогда будет вызван process() в B.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Поскольку process из A является методом private, B полностью не знает о его существовании и его нельзя переопределить.

Аналогично, когда вы вызываете callProcess в экземпляреB, он вызывает A.callProcess (поскольку он не был переопределен в B).A знает только о своем собственном методе process (который не может быть переопределен) и вызывает его.

Если бы вы изменили видимость метода process в A на public или protected, тогда он может быть переопределен в B, если подпись совпадает, т.е. они должны иметь одинаковую видимость.

0 голосов
/ 09 апреля 2019

Да, чтобы переопределение было неявным, переопределенный метод не может иметь более ограниченный уровень доступа, чем переопределяющий.

...