Почему класс Java не может быть объявлен как статический? - PullRequest
24 голосов
/ 04 марта 2010

Я пытаюсь выяснить, почему класс не может быть создан как статический? Как:

public static class Qwert{

    public static void main(String args[]){

        int x = 12;
        while(x<12){
            x--;
        }
        System.out.println(" the X value is : "+ x);
    }
}

Ответы [ 5 ]

58 голосов
/ 04 марта 2010

В Java ключевое слово static обычно помечает метод или поле как существующие не один раз для экземпляра класса, а когда-либо. В любом случае класс существует один раз, так что в действительности все классы «статичны» в этом смысле, и все объекты являются экземплярами классов.

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

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

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

8 голосов
/ 04 марта 2010

Чтобы предотвратить создание конкретного класса, вы должны добавить приватный конструктор.Это мешает «любому другому» классу создавать объект типа Qwert.

, например:

    public static class Qwert{


        private Qwert() {}

        public static void main(String args[]){

            int x = 12;
            while(x<12){
                x--;
            }
            System.out.println(" the X value is : "+ x);
        }
    }
2 голосов
/ 13 октября 2016

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

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

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

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

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

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

1 голос
/ 15 мая 2013

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

1 голос
/ 20 сентября 2012

Чтобы какой-либо класс не мог создать экземпляр Qwert, либо с помощью наследования , либо с помощью отражения , конструктор завершается ошибкой, помещая таблетка с ядом :

public class Qwert { 

    private Qwert() throws IllegalAccessException {
        throw new IllegalAccessException("Utility class!");
    }

    public static class Yuiop {
        public Yuiop() throws IllegalAccessException {
            // generates a synthetic accessor method to super()
        }
    }

    public static void main(String args[]) {
        new Yuiop();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...