2016-06-01 6 views
0

Я изучаю Java, используя книгу Java: полный справочник. Я сейчас нахожусь в главе 9 и, таким образом, только что внесен в пакеты. На странице 187 сказано: «Если вы хотите, чтобы элемент отображался вне вашего текущего пакета, но только для классов, которые подклассифицируют ваш класс напрямую, тогда объявите этот элемент защищенным». Я понимаю, что это подкласс, который находится в пакете, например «B», и расширяет класс, который определяется как открытый внутри другого пакета «A», имеющий член с именем «proc», затем для того, чтобы сделать proc доступный во всех подклассах, включая подклассы, определенные за пределами текущего пакета «A», я должен отметить его как защищенный. Теперь посмотрим на моей реализации подкласса, определенного внутри пакета «B»:Невозможно получить доступ к защищенным членам класса из подкласса, определенного в другом пакете

package subapp; 
import app.*; 

public class Test extends App { 

    public Test() { 
     App app = new App(); 
     System.out.println(app.proc); // error 
    } 
} 

Я уверен, что все пакеты (в обоих файлах классов) загружены правильно, «прямой» суперкласс испытания и его непараметрированный конструктор, являются общедоступными, proc отмечен как защищенный, а функция main() не имеет проблем. Но я получаю исключение во время выполнения при запуске subapp.Test, в котором говорится, что «proc защитил доступ в/суперклассах /. Я получаю неправильное заявление о книге или само заявление?

+0

[Здесь] (http://stackoverflow.com/a/33627846/276052) является хорошей таблицей, иллюстрирующей основы модификатора доступа «protected». – aioobe

ответ

1

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

public Test() { 
    System.out.println(this.proc); 
} 

причина это не работает для вас прямо сейчас вы делаете новый App в пределах конструктор, а затем попытаться получить доступ к этому значению Appproc, а не через наследование.

Если значение proc не является правильным через это, вы, возможно, придется установить его перед System.out.println(this.proc); Или вы могли бы назвать super(); конструктор перед печатью значение, если proc становится инициализируется в App конструктор, такие как:

public App() { 
    proc = "test"; 
} 

//..... 

public Test() { 
    super(); 
    System.out.println(this.proc); 
} 
+0

Спасибо, что помогло. Но почему я не могу использовать защищенный член так, как я это делаю в своем коде? Я все еще «внутри» теста (подкласс) правильно? –

+0

@Devashish Вы можете вызвать 'super();' внутри конструктора, если родительский конструктор инициализирует переменную 'proc'. См. Мое редактирование, если это так. Но причина, по которой он не работает для кода, который у вас есть сейчас, заключается в том, что, хотя вы находитесь внутри 'Test' (подкласс), вы пытаетесь получить доступ к значениям' App' вне его модификатора доступа. Значения 'protected' доступны только для подклассов, поэтому при расширении' App' вы получаете прямой доступ ко всем 'protected' и' public' variables/methods без необходимости создавать новый экземпляр объекта – Orin

+0

Спасибо ... это понятно Теперь :) –

 Смежные вопросы

  • Нет связанных вопросов^_^