Подтвердить что ты не робот

Сколько различных версий "х" доступно в (*)?

Это учебное упражнение для понимания работы внутренних классов в Java. Как говорится в вопросе, сколько различных версий x доступно в (*)?

class Outer {
    int x;

    class Inner extends Outer {
        int x;

        void f(int x) {
            (*)
        }
    }
}

Я склонен думать, что есть 3, а именно: this.x, super.x и x, но некоторые из моих сверстников, похоже, считают, что их 4.

Кто из нас сбит с толку? И можете ли вы объяснить?

4b9b3361

Ответ 1

Есть 4, а именно: x, this.x, super.x и Outer.this.x.

Рассмотрим следующее:

public class Outer {

    int x;

    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        outer.x = 3;
        inner.x = 2;
        inner.f(1);
    }

    class Inner extends Outer {
        int x;

        void f(int x) {
            System.out.println(super.x);
            System.out.println(x);
            System.out.println(this.x);
            System.out.println(Outer.this.x);
        }
    }

}

Этот код напечатает

0
1
2
3

показывает 4 разных значения.

Что происходит:

  • Родитель экземпляра inner имеет унифицированную переменную x. Для int значение по умолчанию равно 0: это super.x.
  • Метод f вызывается с аргументом 1: это x.
  • У экземпляра inner был установлен его x to 2 с inner.x = 2: это this.x.
  • В экземпляре outer, который есть Outer.this, было установлено его значение x равным 3: это Outer.this.x.

Трюк здесь в том, что inner является внутренним классом (поэтому он имеет охватывающий экземпляр outer) и (поэтому он имеет родительский экземпляр outer), и те два экземпляра outer не совпадают.

Ответ 2

Их четыре:

  • Outer.this.x для свойства Outer класса
  • this.x для свойства Inner класса
  • super.x для свойства класса super Outer
  • x для аргумента метода