Все возможности в теневом копировании во вложенных классах - PullRequest
0 голосов
/ 28 октября 2018

Я наткнулся на приведенный ниже фрагмент концепции на этой странице, которая объясняет, как переменные с тем же именем затеняются внутри нестатического / экземпляра метода экземпляра внутреннего класса:

public class ShadowTest {

    public int x = 0;

    class FirstLevel {

        public int x = 1;

        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);  //23
            System.out.println("this.x = " + this.x);  //1
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); //0
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}

Я хочу выделитьчто здесь есть три аспекта:

  1. Мы создали экземпляр FirstLevel внутренний класс
  2. methodInFirstLevel не является статичным
  3. Мы обращаемся к
    • переменная x локально по methodInFirstLevel
    • FirstLevel переменная экземпляра this.x
    • ShadowTest переменная экземпляра ShadowTest.this.x

Я быстро понял, что может быть много возможностей.Например:

  1. В пункте 1 выше я могу добавить:
    • Мы можем решить не создавать экземпляр, то есть вызывать метод для имени класса
    • Вместо этоговнутреннего класса (который определен как нестатический вложенный класс в той же ссылке выше), мы можем иметь дело с статический вложенный класс .
  2. В пункт 2 выше я могу добавить, вызывая статический метод
  3. В пункте три я могу добавить:
    • FirstLevel статическая переменная
    • ShadowTest статическая переменная

Если вы проверяете, комбинации становятся довольно большими.Я попытался выяснить, как будет осуществляться доступ во всех этих случаях.На изображении ниже я попытался представить это в несколько структурированной форме.Я вычеркнул комбинации, которые невозможно по заданной причине красным шрифтом.Также я использовал имена классов InnerClass, OuterClass, StaticNestedClass для большей наглядности (как в приведенной выше ссылке для других примеров).(#) - это просто заполнитель, позволяющий мне думать о том, с каким классом я имею дело, пока буду ниже.Я поставил пули, чтобы вы отсылали это в комментариях и отвечали.Я не уверен во всем здесь, особенно в розовых тонах.

Это меня очень смущает, хотя я приложил все эти усилия.Я хочу, чтобы кто-то подтвердил.Хотя я могу кодировать это и проверять каждый случай, я сейчас очень истощен.

enter image description here

PS: Я могу быть на 200 +% глупее, если высказывать все эти ненужные мысли.Я мог бы просто вспомнить вещи в коде выше и охладить.Если это так, скажите, пожалуйста, тоже.

1 Ответ

0 голосов
/ 28 октября 2018

Ваша точка зрения в записи ваших мыслей является законной, и я предлагаю создать таблицу (или несколько таблиц) для лучшего обзора.

Это может выглядеть так:

non-static Внутренний тип

                      |   Outer class   |   Inner class  
----------------------+-----------------+----------------
   non-static member  |  Outer.this.x   |  [this.]x
----------------------+-----------------+----------------
       static member  |  Outer.x        |  [Inner.]x

Обратите внимание, что синтаксис не зависит от метода включения, за исключением того, что вы не можете ссылаться на нестатическую переменную из статического метода.

В строках 20 + 21 вашего примера вы решаете эту проблему путем доступа к полям произвольных объектов, которые имеют тип InnerClass и OuterClass соответственно.Поэтому ключевое слово this (и любой уточняющий синтаксис) заменяется именем переменной.В двух словах, эти строки верны, но не имеют отношения к теме.

...