Переменная суперкласса Java доступна вне подкласса? - PullRequest
0 голосов
/ 04 марта 2019

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

package com.Bob.Marley;
public class SuperClass{
     protected int x = 0;
}

package com.Bob.Marley;
public class SubClass extends SuperClass{
    protected int x = 1;
}

package com.Bob.Marley;
public class TestClass{
    public static void main (String[] args){
        SubClass s = new SubClass();
        //print 1
        System.out.println(s.x);
        //how do I print the superclass variable?
        //I know inside SubClass I can access it with plain old super.x
        //but what about outside the subclass with a new object. 
    }
}

Итак, вопрос в том, как бы я распечатать 0 из суперкласса нового объекта, созданного в отдельном классе.System.out.println (s.super.x);не работает.Я не думаю, что это что-то меняет, но я использую Java 8.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

TL; DR: если вы вводите новое поле в подкласс, не используйте повторно имя поля из родительского класса.Вы ничего не получаете, только путаница и проблемы.

Если я правильно понимаю, вы хотите, чтобы SubClass экземпляров имели два поля, одно унаследованное от SuperClass (для обсуждения давайте переименуем его вsuperX, чтобы прояснить ситуацию) и один из самого подкласса (давайте переименуем его в subX).

Для данного экземпляра SubClass вы хотите иметь доступ к обоим полям superX и subX (конечно, используя разные выражения).Что делает вещи сложными в вашем примере кода, так это тот факт, что вы решили дать им обоим одинаковое имя x.

Итак, если вы действительно хотите, чтобы ваши экземпляры содержали оба поля, я бы порекомендовалчтобы переименовать их, чтобы вам не приходилось использовать уродливые уловки, такие как приведение к SuperClass.

public class SuperClass{
     protected int superX = 0;
}

public class SubClass extends SuperClass{
    protected int subX = 1;
}

Но, если x обозначает одно и то же свойство с одинаковым значением для обоих супери подкласс, просто с разными начальными значениями, тогда не имеет смысла иметь два разных поля, и вы должны изменить код, чтобы он стал:

public class SuperClass{
     protected int x = 0;
}

public class SubClass extends SuperClass{
    // constructor initializes the x field with 1.
    public SubClass(){
        x = 1;
    }
}

Конечно, тогда невозможно получитьдва разных значения из одного экземпляра SubClass.

0 голосов
/ 04 марта 2019

Выражение s.super.x здесь недопустимо.Всякий раз, когда вы добавляете к префиксу super.x что-то, это должно быть имя типа, а не имя переменной, например, SuperClass.super.x.Однако это будет допустимо только внутри подкласса для доступа к суперклассу включающего класса , которого здесь нет.получить доступ к x, объявленному в Superclass.

System.out.println( ((SuperClass) s).x);

или

SuperClass sc = (SuperClass) s;
System.out.println(sc.x);

Это работает, потому что доступ к переменной статически связан.Тип переменной или выражения определяет область поиска переменной доступа.

...