Почему класс верхнего уровня не может быть статическим в Java? - PullRequest
37 голосов
/ 10 сентября 2011

Не могу найти удовлетворительного ответа нигде.

Ответы [ 6 ]

68 голосов
/ 10 сентября 2011

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

То, к чему сводится 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 голосов
/ 26 августа 2015

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

2 голосов
/ 10 сентября 2011

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

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

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

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

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

0 голосов
/ 03 августа 2016

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

0 голосов
/ 16 сентября 2014

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

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

public class Outer
{
   public static int x = 0 ; 

}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...