Полиморфизм: метод изменен, но значение аргумента нет - PullRequest
1 голос
/ 07 августа 2020

Я выполнил следующий код:

public class Cycling {
    
    public static void main(String[] args) {
        
        Cycle unicycle      = new Unicycle();
        System.out.println("Unicycle name: " + unicycle.name);
        unicycle.ride();
    }
}

class Cycle {
    public String name = "cycle";
    public void ride() {
        System.out.println("Ride cycle!");
    }
}

class Unicycle extends Cycle{
    public String name = "unicycle";
    public void ride() {
        System.out.println("Ride unicycle!");
    }
}

Я ожидал такого результата:

Имя уницикла: unicycle

Ездить на одноколесном велосипеде!

Я получил этот вывод:

Название уницикла: cycle

Ездить на одноколесном велосипеде!

Метод был успешно изменен, но значение аргумента - нет. Может кто-нибудь объяснить мне, почему?

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Ваш метод - polymorphi c, ваше поле - нет, потому что поля не являются полиморфными c.

В настоящее время у вас есть 2 поля с одинаковым именем, одно поле затеняет другое. Когда вы это сделаете:

Cycle unicycle = new Unicycle();

Cycle не знает о name в классе Unicycle. Таким образом, когда вы выполняете unicycle.name, это относится к классу Cycle.

Совет: всегда держите свои поля конфиденциальными.

IDE, такая как IntelliJ Idea, выделила бы эту ошибку.

1 голос
/ 07 августа 2020

Это классический c случай полиморфизма времени компиляции и времени выполнения.

Компилятор разрешает переменные во время компиляции, но методы разрешаются JVM во время выполнения.

1 голос
/ 07 августа 2020

Это потому, что когда вы определяете переменную с тем же именем в подклассе, у нее будут оба свойства, которые имеют только одно имя. Это называется сокрытие . Если вы хотите получить доступ к значению переменной суперкласса «name», вы можете вызвать ее с помощью super.name.

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

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