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

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

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);
    }
}

Ответ 1

В Java ключевое слово static обычно помещает метод или поле как существующее не один раз на экземпляр класса, а однажды. Класс существует, так или иначе, так что все классы являются "статичными" таким образом, и все объекты являются экземплярами классов.

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

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

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

Ответ 2

Чтобы предотвратить создание экземпляра определенного класса, вы должны добавить частный конструктор. Это останавливает "любой другой" класс от возможности создать объект типа 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);
        }
    }

Ответ 3

Чтобы запретить любому классу создавать экземпляр 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();
    }
}

Ответ 4

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

Ответ 5

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

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

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

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

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

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