После изучения Java на некоторое время его использование ключевого слова меня так сильно смутило.«this» ключевое слово: рабочий механизм в Java
Вот как я запутался. Я написал следующий код:
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
базового класса, а не класс по уходу за детьми? И если this.x
указывает на x
базового класса, почему this.b()
называет b()
дочернего класса? Является ли поведение этого разного для полей и методов?
Однако основная проблема связана с механизмом ключевого слова . Я имею ввиду, что вы знаете, this
указывает (относится) к текущему объекту. Если вы думаете, это не волшебное поведение. Место должно быть this
. Например, литерал .class
для класса невидим, но присутствует в испускаемом байт-коде. Точно так же эта ссылка должна присутствовать в байтекоде.
Хорошо, считая, что это верно, this
должен быть public final
(пустой финал), который создается при каждом создании объекта и создании его полей. Это означает, что это переменная экземпляра, а не статическая переменная.
Теперь, если этот экземпляр ссылается на ссылку текущего объекта (который является только конкретным объектом), как это происходит выше, использование this
отличается для полей и методов? Итак, в целом, что за механизм this
? Имеет ли механизм также ключевое слово super
?
EDIT: Каждый читает вопрос, а затем комментарии, я хочу спросить о, Где this
поле объявляется компилятором и каковы его классификаторы. Каким образом возникающее поведение происходит за кулисами?
Помните это простое правило: «поля не являются полиморфными» (полиморфизм в Java работает только для методов, которые не являются статическими, частными или конечными). Поскольку поля не являются полиморфными, их привязка происходит во время компиляции, а во время компиляции компилятор ничего не знает о производных классах, поэтому он связывает 'x' с ближайшим доступным' x', который он может найти. – Pshemo
@Pshemo: Я все для этого. Это внутренности, о которых мне интересно. –
это ключевое слово может использоваться для (его нельзя использовать со статическими методами): Чтобы получить ссылку на объект, через который этот метод вызывается внутри него (метод экземпляра). Чтобы избежать поля, затененного параметром метода или конструктора. Вызов конструктора того же класса. В случае переопределения метода это используется для вызова метода текущего класса. Ссылка на внутренний класс. например ClassName.this – MeshBoy