Переопределение и наследование метода Java - PullRequest
2 голосов
/ 11 июня 2019
class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  void printMe() {
       System.out.println(getMe());
    }
}

class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}

В этом случае ссылка «сын» типа «Сын» и поскольку метод printMe () нестатичен, будет выполнен код метода из класса Сын.Но поскольку класс Son не переопределил метод getMe (), будет выполнен код метода из класса предка.Таким образом, мы получаем «папа».

Второй случай:

class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  String getMe() {
        return me;
   }


class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}

Рассуждение аналогичным образом, в этом случае класс Son не переопределил метод printMe (), поэтому кодМетод printMe () из класса Dad должен быть выполнен.Но мы получаем «Сын». Почему?

А что тогда с наследством?То есть, если наследник не переопределяет метод предка, то они вместе делят код метода предка?

Ответы [ 4 ]

4 голосов
/ 11 июня 2019

В первом случае son.printMe() вызывает Son printMe() (поскольку Son переопределяет этот метод), что вызывает Dad getMe() (поскольку Son не переопределяет этот метод ), который возвращает «папа».

Во втором случае son.printMe() вызывает Dad printMe() (поскольку Son не переопределяет этот метод), что вызывает Son getMe(), поскольку Son переопределяет этот метод , Поэтому "сын" печатается.

1 голос
/ 11 июня 2019

Во втором сценарии вы звоните Dad#printMe, что, в свою очередь, вызывает getMe.Поскольку Son переопределяет его, вызывается Son#getMe.Этот метод возвращает «Сын», который затем печатается как printMe.

0 голосов
/ 11 июня 2019

Случай 2: son.printMe() вызовет Dad class printMe(), что не всегда встречается в Son class. Теперь он будет искать getMe() в ближайшем классе реализации в иерархии, то есть Son классе. Теперь Son#getMe() будет искать переменную me в этом классе реализации и найдет со значением "son", поэтому печатается. Имейте в виду, что private static final String me = "dad"; и private static final String me = "son"; - это две разные частные переменные, принадлежащие двум разным классам. Если бы в классе Son не было определения переменной me, вы бы получили ошибку компиляции.

0 голосов
/ 11 июня 2019

Вы переопределяете тот же метод с классом tge diff, но параметры для этого метода tge main вызывают метод son

...