После изучения Java в какой-то момент его использование ключевого слова this
в первый раз сбило меня с толку.
Вот как я запутался. Я написал следующий код:
class BasicInheritanceTest3Base{
private int x = 0;
public int y;
public void a() {
x++;
this.x++;
System.out.println("BasicInheritanceTest3Base.a()");
b();
this.b();
System.out.println(x);
System.out.println(y);
}
public void b(){
System.out.println("BasicInheritanceTest3Base.b()");
}
}
public class BasicInheritanceTest3 extends BasicInheritanceTest3Base {
private int x = 3;
public int y = 2;
public void b() {
System.out.println("BasicInheritanceTest3.b()");
}
public static void main(String[] args){
BasicInheritanceTest3 bit2 = new BasicInheritanceTest3();
bit2.a();
}
}
Я получил следующий вывод:
BasicInheritanceTest3Base.a()
BasicInheritanceTest3.b()
BasicInheritanceTest3.b()
2
0
Теперь первый вопрос: Почему x
и this.x
указывают на x
базового класса, а не на класс Child? И если this.x
указывает на x
базового класса, почему this.b()
вызывает b()
дочернего класса? Является ли поведение этого разного для полей и методов?
Однако основная проблема связана с механизмом ключевого слова this
.
Я имею ввиду, что вы знаете, this
указывает (относится) к текущему объекту. Если вы думаете, это не волшебное поведение. Где-то должно быть поле this
. Например, литерал .class
для класса невидим, но присутствует в испускаемом байт-коде. Аналогично, эта ссылка должна присутствовать в байте-коде.
Хорошо, считая выше, верно, this
должен быть public final
(пустой финал), который создается при каждом создании объекта и его экземплярах. Это означает, что это переменная экземпляра, а не статическая переменная.
Теперь, если этот экземпляр ссылается на текущую ссылку на объект (который является только конкретным объектом), то почему выше использование this
отличается для полей и методов? Итак, в целом, каков механизм this
? Поддерживается ли этот механизм для ключевого слова super
?
РЕДАКТИРОВАТЬ:. Все читают вопрос, а затем комментарии, о которых я хочу спросить, где указано поле this
, объявленное компилятором, и каковы его квалификаторы. Как происходит возникшее в результате поведение за кулисами?