Вопрос по hiding, polymorphism, field, inheritance, java – Скрытие полей в наследовании Java

9

Внутри класса поле с тем же именем, что и поле в суперклассе, скрывает суперкласс.поле с.

public class Test {

    public static void main(String[] args) {

        Father father = new Son();
        System.out.println(father.i); //why 1?
        System.out.println(father.getI());  //2
        System.out.println(father.j);  //why 10?
        System.out.println(father.getJ()); //why 10?

        System.out.println();

        Son son = new Son();
        System.out.println(son.i);  //2 
        System.out.println(son.getI()); //2
        System.out.println(son.j); //20
        System.out.println(son.getJ()); //why 10?
    }  
}

class Son extends Father {

    int i = 2;
    int j = 20;

    @Override
    public int getI() {
        return i;
    }
}

class Father {

    int i = 1;
    int j = 10;

    public int getI() {
        return i;
    }

    public int getJ() {
        return j;
    }
}

Может кто-нибудь объяснить результаты для меня?

Oracle Tutorial на сокрытие переменных. alex
Сын не тип отца jsj
Это домашнее задание? Duncan Jones
Я нене вижу, как этот вопрос "слишком локализован...: D Willi Mentzel
@WilliMentzel мне тоже, это именно то, что я искал. NickL

Ваш Ответ

2   ответа
3

СогласноПереопределение и сокрытие методов

Версия вызываемого скрытого метода зависит от того, вызывается ли он из суперкласса или из подкласса.

т.е. когда вы вызываете метод, который переопределяется в подклассе через ссылку на суперкласс, вызывается метод суперкласса, и он обращается к членам суперкласса.

Это объясняет следующее как используемая ссылка суперкласса:

System.out.println(father.i);  //why 1?
System.out.println(father.j);  //why 10?
System.out.println(father.getJ()); //why 10?

Аналогично для следующего:

System.out.println(son.getJ()); //why 10?

посколькуgetJ() не определен вSonFather вызывается версия, которая видит член, определенный вFather учебный класс.

Если вы читаетеСкрытие полей; они специально неЯ рекомендую такой метод кодирования, как

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

9

В Java поля не являются полиморфными.

Father father = new Son();
System.out.println(father.i); //why 1? Ans : reference is of type father, so 1 (fields are not polymorphic)
System.out.println(father.getI());  //2 : overridden method called
System.out.println(father.j);  //why 10? Ans : reference is of type father, so 2
System.out.println(father.getJ()); //why 10? there is not overridden getJ() method in Son class, so father.getJ() is called

System.out.println();

// same explaination as above for following 
Son son = new Son();
System.out.println(son.i);  //2 
System.out.println(son.getI()); //2
System.out.println(son.j); //20
System.out.println(son.getJ()); //why 10?
Просто в Java? любой другой язык обеспечивает полиморфизм на полях? Asif Mushtaq

Похожие вопросы