Наследование: адрес памяти полей - PullRequest
2 голосов
/ 07 января 2020

Если у меня есть два класса

class A {
  int n;
  void doSomething() {
    n = 2;
  }
}

и

class B extends A {}

Адрес памяти this.n совпадает с super.n при вызове в B? Кроме того, this.doSomething() и super.doSomething() изменят один и тот же n в памяти?

1 Ответ

3 голосов
/ 07 января 2020

Адрес памяти this.n совпадает с super.n при вызове в B?

Да. Но в Java вам обычно не нужно заботиться о том, что находится в памяти. :-) (Это хорошо, потому что вы не можете получить адрес памяти чего-либо, и фактически JVM может даже изменить адрес чего-то со временем ...)

Кроме того, this.doSomething() и super.doSomething() изменят одно и то же n в памяти?

Да, в экземпляре в экземпляре есть только один n Ваш пример.


возможно иметь более одного n, если два класса в иерархии оба объявляют поля n, но обычно вас это не волнует потому что либо:

  1. Они оба / все объявлены private, и поэтому код работает просто потому, что каждый код, модифицирующий n, модифицирует правильный; или

  2. Они не объявлены частными, в этом случае плохая практика и сбивает с толку наличие более одного поля с именем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...