Конструктор внутри внутреннего статического класса в java?

Я написал следующий код

public class Reader1 {
    private int pageNumber;

    private class ReaderName1{
        public int getPage(){
        return pageNumber;
        }
    }
    static class ReaderFound{

    }
}

Когда я использовал javap дизассемблера файлов классов Java в скомпилированном коде, я получил

1. for Reader1.class



class Reader1$ReaderName1 {
              final Reader1 this$0;
              private Reader1$ReaderName1(Reader1);
              public int getPage();
            }


2. for Reader1$ReaderName1.class



    public class Reader1 {
          private int pageNumber;
          public Reader1();
          static int access$000(Reader1);
        }

3. for Reader1$ReaderFound.class



     class Reader1$ReaderFound {
          Reader1$ReaderFound();
        }

Мой вопрос: поскольку ReaderFound является статическим классом, как он может иметь конструктор по умолчанию? Если да, то почему? Это разрешено?

Если разрешено, какой это конструктор, который находится внутри класса Reader1$ReaderFound, потому что он не может быть статическим. (Кроме того, поскольку конструктор неявно вызывается для инициализации объекта и поскольку ReaderFound является статическим классом, поэтому у нас не будет его объекта. Моя точка зрения на первый вопрос)


person Ankur Anand    schedule 25.03.2015    source источник
comment
Как вы думаете, что такое static класс? Почему вы так думаете?   -  person Sotirios Delimanolis    schedule 25.03.2015
comment
У всех классов есть конструкторы, и они будут использоваться по умолчанию, если вы не объявите конструктор, не являющийся конструктором по умолчанию.   -  person Hovercraft Full Of Eels    schedule 25.03.2015
comment
статический класс означает, что вы можете создать экземпляр этого класса в любом контексте (не обязательно привязанном к Reader1). Нестатические классы всегда привязаны к экземпляру Reader1.   -  person CoronA    schedule 25.03.2015
comment
@SotiriosDelimanolis Что я понял для статического класса, так это то, что он ведет себя так же, как любой класс верхнего уровня, но написан внутри какого-то другого класса для какой-то цели соглашения (просветите меня в этом, если я неправильно истолковал), но я был действительно смущен статическим термином, так как для открытого класса был открытый конструктор, для частного был частный конструктор. Итак, какой конструктор по умолчанию будет у этого класса?   -  person Ankur Anand    schedule 25.03.2015


Ответы (1)


В Java есть четыре типа вложенных классов: статические классы-члены, нестатические классы-члены, анонимные классы и локальные классы.

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

class EnclosingClass {
    static class StaticMemberClass { }

    public static void main(String... args) {
        EnclosingClass.StaticMemberClass nestedInstance =
            new EnclosingClass.StaticMemberClass();
    }
}

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

person Anderson Vieira    schedule 25.03.2015
comment
Но какая польза от создания объекта статического класса? Мы всегда можем получить доступ к его методам с помощью Outer.Inner.foo() ? - person Number945; 29.06.2018
comment
@BreakingBenjamin Только если сам метод является статическим. Если нет, вам нужен экземпляр для доступа к нему. - person Anderson Vieira; 29.06.2018