Доступ к защищенным с помощью супер

У меня есть следующий код

package com.kathy.accessmodifiers2;

public class base extends Object{
protected int a = 10;
}

package com.kathy.accessmodifiers;
import com.kathy.accessmodifiers2.*;

class derived extends base {
public void D() {
    System.out.println("D");
    base b = new base();
    System.out.println(super.a); //line 1
    //System.out.println(b.a); //line 2
    //Only this class can access the proctected member.
    System.out.println(this.a);
    System.out.println(a);
}
}

class derived2 extends derived {
public void D2() {
    System.out.println(a);
}
}

public class Protected {

public static void main(String str[]) {
    new derived2().D();
}
}

В строке 1 я использую super.a, а вывод равен 10. В случае строки 2 код не компилируется, потому что я пытаюсь получить доступ к protected члену класса super (другой пакет) из базового класса (другой пакет). Почему в случае super доступен a?


person Naresh C    schedule 11.11.2013    source источник
comment
В вашем классе Derived нет модификатора видимости, и поэтому он использует package-private. Если вы объявите это public Derived extends Base, все будет в порядке.   -  person Sambuca    schedule 11.11.2013
comment
Защищенные члены @isnot2bad доступны для унаследованных подклассов, а не для экземпляра родительского класса. и b здесь является экземпляром родительского класса.   -  person Not a bug    schedule 11.11.2013
comment
@KishanSarsechaGajjar Ты прав! Я не заметил закомментированную строку 2. Я просто скопировал исходный код и скомпилировал его. Поскольку javac не жаловался, я предположил, что все работает. Я удалю свой комментарий!   -  person isnot2bad    schedule 11.11.2013
comment
@ isnot2bad Все в порядке ... вы также можете сослаться на мой ответ ... !!   -  person Not a bug    schedule 11.11.2013


Ответы (2)


Это

protected член класса одного пакета доступен в другом пакете тогда и только тогда, когда этот класс наследуется каким-либо другим классом в другом пакете.

1, то есть в приведенном выше примере класс base расширяется классом derived в другом пакете, поэтому его (базовый класс) защищенные члены доступны по ключевому слову super.

2, но мы не можем напрямую получить доступ к protected членам base класса, создав его object в другом пакете. Потому что они доступны в том же пакете, пока мы не унаследуем этот класс в другом пакете

person Tushar.k    schedule 14.01.2014

base b = new base();
System.out.println(super.a); //line 1
System.out.println(b.a); //line 2

В строке 1: super.myMethod() или super.variable будут вызывать переопределенный метод или получать доступ к переопределенным свойствам. поэтому в строке 1 вы получаете доступ к переопределенному int a в дочернем классе.

пока в строке 2: int a имеет модификатор доступа protected в class B, поэтому вы не можете получить к нему доступ из другого пакета, и вы пытаетесь получить доступ к int a по b, который является экземпляром class B из другого пакета.

Просто это.

Ссылка Javadoc:

  1. Использование ключевого слова super
  2. Управление доступом к членам класса
person Not a bug    schedule 11.11.2013