Как получить доступ к родительской переменной класса, имеющей то же имя, что и дочерняя переменная, с дочерней ссылкой вне дочернего класса? - PullRequest
0 голосов
/ 27 декабря 2018

Есть ли способ доступа к переменной экземпляра родительского класса с тем же именем, что и у другой переменной экземпляра дочернего класса, через дочернюю ссылку вне дочернего класса?

class Parent {
    int i;
}
class Child extends Parent {
    int i=10;

}
class Test {
    public static void main(String[] args) {
        Parent p=new Parent();
        Child c=new Child();
        System.out.println(p.i);//parent i variable
        System.out.println(c.i);//child i variable
        System.out.println(c.i);// again child i variable
    }
}

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Приведите Child к Parent:

System.out.println(((Parent) c).i);

Почему это работает?

В экземпляре Child есть два поля с именем i, одно из Parent class и one из Child, и компилятор (не тип времени выполнения экземпляра) решает, какой из них будет использован.Компилятор делает это в зависимости от типа, который он видит.Итак, если компилятор знает, что это экземпляр Child, он создаст метод доступа для поля Child.Если он знает только, что это Parent, вы получите доступ к полю Parent.

Некоторые примеры:

Parent parent = new Parent();
Child child = new Child();
Parent childAsParent = child;

System.out.println(parent.i);             // parent value
System.out.println(child.i);              // child value
System.out.println(((Parent) child) .i);  // parent value by inline cast
System.out.println(childAsParent.i);      // parent value by broader variable type

Если компилятор знает, что это Child, он даетдоступ к полю Child, если вы заберете эти знания (путем приведения или сохранения в переменную Parent), вы получите доступ к полю Parent.

Это сбивает с толкуНе так ли? Это приглашение на всевозможные неприятные недоразумения и ошибки кодирования.Поэтому не рекомендуется использовать одно и то же имя поля в родительском и дочернем классах.

0 голосов
/ 27 декабря 2018

Если для этого есть веская причина, тогда да:

class Child extends Parent {
    int i=10;

    public int getParentsI() {
       return super.i;
    }
}

Теперь ваш основной метод будет выглядеть следующим образом:

Parent p=new Parent();
Child c=new Child();
System.out.println(p.i);//parent i variable
System.out.println(c.i);//child i variable
System.out.println(c.getParentsI());// parent i variable

Редактировать: понял, что пользователь может быть новым, поэтому яполностью уточню метод sig и прокомментирую подробнее

...