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

Почему класс Java не может быть статическим в Java?

Невозможно найти удовлетворительный ответ в любом месте.

4b9b3361

Ответ 1

Все классы верхнего уровня по определению статичны.

В чем сводится static, так это то, что экземпляр класса может стоять сам по себе. Или, наоборот: нестатический внутренний класс (= внутренний класс экземпляра) не может существовать без экземпляра внешнего класса. Поскольку класс верхнего уровня не имеет внешнего класса, он не может быть ничего, кроме static.

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

Некоторый код для воспроизведения:

public class Foo {

    public class Bar {
         // Non-static innner class
    }

    public static class Baz {
         // Static inner class
    }
}

public class Example {
    public static void main(String[] args) {
        new Foo(); // this is ok
        new Foo.Baz(); // this is ok
        new Foo.Bar(); // does not compile!

        Foo f = new Foo();
        Foo.Bar bar = f.new Bar(); //this works, but don't do this
    }
}

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

Ответ 2

Я дал тот же ответ. Почему класс Java не может быть объявлен как статический? , Но писать это снова здесь

Мы должны определить члены как статические, которые

  1. Должен быть общим для всех объектов класса.
  2. Должен принадлежать классу и быть доступным по имени класса.
  3. Не должен нужен объект класса для доступа к ним.

Теперь предположим, что мы определяем внешний класс как статический, и предположим, что нам разрешено это делать. Будет ли это служить какой-либо цели или предоставит какое-либо преимущество разработчику или это создаст двусмысленность и осложнения как для разработчиков, так и для создателей языка?

Давайте проверим, определив внешний класс как статический, для целей, которые мы определили выше, или нет?

  1. Каждый класс уже является общим для всех его объектов, и нет необходимости делать его статичным, чтобы стать доступным для всех его объектов.
  2. Нам нужно имя класса для доступа к его статическим членам, потому что эти члены являются частью класса, в то время как внешний класс является частью пакета, и мы можем напрямую получить доступ к классу, просто написав package_name.class_name (аналогично class_name.static_field_name), так что снова есть нет необходимости делать то, что уже есть по умолчанию.
  3. Нам не нужен какой-либо объект для доступа к классу, если он видим, мы можем просто написать package_name.class_name для доступа к нему. И по определению, класс является планом для его объектов, и мы создаем класс для создания объектов из него (исключение всегда будет, например, java.lang.Math), опять же, нет необходимости определять внешний класс как статический.

Исходя из вышесказанного, мы можем сказать, что создатели Java не позволили внешнему классу быть статическим, потому что нет необходимости делать его статичным. Разрешение сделать внешний класс статичным только увеличит сложности, двусмысленность и двуличность. Узнайте больше о том, почему внешний класс Java не может быть статичным

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Ну, я думаю, вы не понимаете правильно, если вы хотите увидеть "статическое" ключевое слово во внешнем классе.

Короче, как вы собираетесь использовать функцию static во внешнем классе?

public class Outer
{
   public static int x = 0 ; 

}

Теперь вы собираетесь делать Outer.x для доступа к статической переменной. Это означало бы, что x имеет одно значение для всех объектов Outer.

Теперь, когда у нас это получилось, каково было бы ключевое слово static в классе Outer?,

Ответ 6

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

Ответ 7

  1. Всякий раз, когда мы запускаем класс, JVM создает объект. Все статические объекты создаются в статической памяти, а не в куче памяти. Это означает, что у нас одинаковый набор копий для всех объектов. Так что, если верхний класс статичен и вы запускаете pgm, он создает статический объект и продолжает переходить в ту же статическую память. что неправильно.

2. Мы должны определить члены как статические, которые должны быть общими для всех объектов класса. Поскольку, каждый класс уже является общим для всех его объектов, и нет необходимости делать его статичным, чтобы стать доступным для всех его объектов.