Адрес памяти this.n
совпадает с super.n
при вызове в B
?
Да. Но в Java вам обычно не нужно заботиться о том, что находится в памяти. :-) (Это хорошо, потому что вы не можете получить адрес памяти чего-либо, и фактически JVM может даже изменить адрес чего-то со временем ...)
Кроме того, this.doSomething()
и super.doSomething()
изменят одно и то же n
в памяти?
Да, в экземпляре в экземпляре есть только один n
Ваш пример.
возможно иметь более одного n
, если два класса в иерархии оба объявляют поля n
, но обычно вас это не волнует потому что либо:
Они оба / все объявлены private
, и поэтому код работает просто потому, что каждый код, модифицирующий n
, модифицирует правильный; или
Они не объявлены частными, в этом случае плохая практика и сбивает с толку наличие более одного поля с именем n
. : -)
Вот пример # 1:
class Base {
private int n;
public Base(int n) {
this.n = n;
}
public int getN() {
return this.n;
}
}
class Derived extends Base {
private int n;
public Derived(int n) {
super(n / 2);
this.n = n;
}
public int getN() {
return this.n;
}
public void show() {
System.out.println("this.getN() = " + this.getN());
System.out.println("super.getN() = " + super.getN());
}
}
Есть два отдельных поля n
, одно для Base
и одно для Derived
, но они оба частные, так что это не смущает (ну, в основном, нет). Если вы запустите
Derived d = new Derived(42);
d.show();
, вы получите
this.getN() = 42
super.getN() = 21
Вот пример # 2, который, опять же, плохая практика:
class Base {
protected int n;
public Base(int n) {
this.n = n;
}
}
class Derived extends Base {
protected int n; // POOR PRACTICE, don't do this
public Derived(int n) {
super(n / 2);
this.n = n;
}
public void show() {
System.out.println("this.n = " + this.n);
System.out.println("super.n = " + super.n);
}
}
Если вы запускаете
Derived d = new Derived(42);
d.show();
вы получаете
this.n = 42
super.n = 21