Я понял, что this
является ссылкой на текущий выполняемый объект.Если это так, можете ли вы объяснить поведение следующего кода?
public class Inherit {
public static class ClassA
{
private String privateInstanceVar = "Private";
public void classAMethod()
{
System.out.println("In class: " + this.getClass().getName());
System.out.println("Can access: " + this.privateInstanceVar);
}
}
public static class ClassB extends ClassA
{
}
public static void main(String[] args)
{
ClassB b = new ClassB();
b.classAMethod();
//Outputs:
//In class: Inherit$ClassB
//Can access: Private
//System.out.println(b.privateInstanceVar); // Fails to compile
}
}
Первая строка classAMethod
сообщает, что this
является ссылкой на ClassB
.Однако в следующей строке я использую this
для доступа к закрытой переменной экземпляра privateInstanceVar
из ClassA
, к которой у меня не должно быть доступа.(Закомментированная последняя строка main
показывает, что это действительно так.)
Итак, мои вопросы:
- Если
this
действительно является ссылкой на ClassB
, как я могу получить доступ к закрытой переменной экземпляра на ClassA
из метода, который принадлежит ClassB
? - Является ли
classAMethod
на самом деле членом ClassA
и ClassB
в точке исполнения? - Если ответ на вопрос 2. да, каковы правила определения того, в каком контексте будет выполняться любая строка в методе?
- Если ответ на вопрос 2. нет, то чтоЕсть ли альтернативное объяснение поведению кода?
- Есть ли здесь какая-то большая картина или тонкость, которую я не могу оценить?