Почему создание экземпляров статического объекта вложенного класса разрешено?

Я начал изучать язык Java для разработки приложений Android.

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

Но почему создание экземпляров статического объекта вложенного класса допускается в следующих ситуациях?

class EnclosingClass 
{     
      //...     
      class static StaticInnerClass 
      {         
          //...     
      } 
} 

Почему мы можем создать объект внутреннего класса, если он помечен как статический?

EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass()
 Parag Meshram11 окт. 2012 г., 11:37
@ Ключ согласен :)
 ShacharSh29 окт. 2017 г., 12:17
Еще одна понятная и полезная цитата из документации (docs.oracle.com/javase/tutorial/java/javaOO/nested.html) это: "По сути, статический вложенный класс является поведенческим классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки ».
 keyser11 окт. 2012 г., 11:49
Вот'Хорошая цитата из документов: "Вложенные классы делятся на две категории: статические и нестатические. Вложенные классы, которые объявлены статическими, просто называются статическими вложенными классами. Нестатические вложенные классы называются внутренними классами. "(Ссылка на сайт). И если вы прокрутите вниз, они объяснят их использование.
 assylias17 окт. 2012 г., 19:48
@ParagMeshram Что вы ожидаете от своей награды? Джон Скит?ответ не ясен?

Ответы на вопрос(3)

Решение Вопроса

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

Ваше понимание значениястатический класс " это неверно. В основном "статический класс " вДжава это вложенный класс, который нене может иметь неявной ссылки на экземпляр содержащего класса. Увидетьраздел 8.5.1 JLS для получения дополнительной информации, в частности:

Ключевое слово static может изменить объявление типа члена C в теле не внутреннего класса или интерфейса T. Его эффект - объявить, что C не является внутренним классом. Так же, как статический метод T не имеет текущего экземпляра T в своем теле, C также не имеет текущего экземпляра T и не имеет каких-либо лексически включающих экземпляров.

Возможно, вы думали о статических классах в C #, которые совершенно разные?

 Jon Skeet11 окт. 2012 г., 11:43
@Keyser: Нет, я имею в видувложенными учебный класс. Смотрите цитату из JLS: статический класс указывает, что классне внутренний класс. Из раздела 8.1.3 JLS: «Внутренний класс - это вложенный класс, который не объявлен явно или неявно как статический. "
 keyser11 окт. 2012 г., 11:40
Дон»Вы имеете в виду статическийвнутренний учебный класс?
 samis03 февр. 2014 г., 15:58
@JonSkeet Хорошо, япрограммировал на C # сегодняs, так чтоЭто моя проблема, потому что она есть. Большое спасибо!
 Jon Skeet03 февр. 2014 г., 16:02
@SamusArin: справа - C # 'статические классы и JavaВложенные статические классы совершенно разные. Ява нене имеет ничего похожего на C # 'с статическими классами, а C # нене имеет ничего похожего на Javaвнутренние классы. (Если вам нужна ссылка на экземпляр содержащего класса в C #, вам нужно сделать это явным.)
 Jon Skeet03 февр. 2014 г., 15:44
@SamusArin: Ну, этоСортировать так же, как нормальное значение статического с точки зрения "относится к типу, а не к любому экземпляру типа " - внутренний класс имеет ссылку на экземпляр своего содержащего класса (как это делает метод экземпляра); статический вложенный класс нет. Существуют различные ограничения относительно того, чтодопускается в каждом типе вложенного типа; Я бы нене претендую на звание эксперта по ним. Что касается введения нового ключевого слова - новогополное ключевое слово было бы переломным изменением. (Что если у кого-то уже есть переменная с таким именем?)
 samis03 февр. 2014 г., 16:05
@JonSkeet Хех, теперь я знаю все о добавлении явной ссылки. Я кодирую в Monodroid, и я портировал так много фрагментов кода Java, содержащих внутренние классы, в очень "неидеальный» пока я не нашел пост об имитацииВнутренние классы в C # с использованием явной ссылки. Затем мне пришлось вернуться и переписать так много кода.
 Jon Skeet03 февр. 2014 г., 15:56
@SamusArin: естьнет такой вещи какне вложенный статический класс ".
 samis03 февр. 2014 г., 15:42
Его эффект состоит в том, чтобы объявить, что C не является внутренним классом " Я нене понимаю, почему они непросто сделать новое ключевое слово, объявив что-то "статический» означать "без внутренней» очень вводит в заблуждение неты думаешь? Существуют ли другие последствия объявления вложенного класса статическим?
 keyser11 окт. 2012 г., 11:45
Я только получил это, спасибо (цитата, которую я отправил ниже вопроса, помогла) :) "
 samis03 февр. 2014 г., 15:55
@JonSkeet Я подумал, что дополнительное ключевое слово будет "слишком большой" сделки, однако мне просто странно, что вы можете создать экземпляр статического класса (doe 'с Java разрешить "нормальный" / не вложенные статические классы для создания экземпляра с оператором new () / kewyord)? Извините, что беспокою вас такими мелочами, но я действительно ценю это, спасибо.

если он помечен как статический?

Возможно, вам придется использоватьnested class вstatic контекст, например:

public class Test {

    public static void main(String args[]) {
        InnerClass innerClass = new InnerClass();
    }

    class InnerClass {

    }
}  

В этом случае,когда вы пытаетесь создать экземплярinnerClass Вы получаете ошибку:

Ни один включающий экземпляр типа Test недоступен. Должен квалифицировать выделение с включающим экземпляром типа Test (например, x.new A (), где x - это экземпляр Test).

Чтобы избежать этого, вы можете создать экземпляр объекта типаTest и создать экземплярinnerClass от него:

Test test = new Test();
InnerClass innerClass = test.new InnerClass();

или лучше объявить такжеinnerClass как статический и создать его экземпляр в статическом контексте:

public class Test {

    public static void main(String args[]) {
        InnerClass innerClass = new InnerClass();
    }

    static class InnerClass {

    }
}

Ваш ответ на вопрос