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

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

Ответы [ 14 ]

470 голосов
/ 27 августа 2010

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

class OuterClass{
    public static class StaticNestedClass{
    }

    public class InnerClass{
    }

    public InnerClass getAnInnerClass(){
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically(){
        return new InnerClass();
    }
}

class OtherClass{
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

Источники:

По той же теме:

36 голосов
/ 19 августа 2013

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

33 голосов
/ 28 июня 2013

Итак, я опаздываю на вечеринку, но вот мои два цента - философски добавляя к ответу Колина Хеберта.

На высоком уровне ваш вопрос касается различия между объектами и типами.В то время как существует много автомобилей (объектов), существует только один класс (тип) автомобилей.Объявление чего-либо как статического означает, что вы работаете в пространстве типа.Здесь только один.Ключевое слово класса верхнего уровня уже определяет тип в пространстве «type».В результате «общедоступный статический класс Car» становится излишним.

29 голосов
/ 31 мая 2012

Класс с закрытым конструктором является статическим.

Объявите свой класс следующим образом:

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

и вы можете использовать без инициализации:

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...
13 голосов
/ 27 августа 2010

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

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

12 голосов
/ 28 августа 2010

Вы можете создать служебный класс (который не может создавать экземпляры), объявив тип enum без экземпляров.то есть вы конкретно заявляете, что экземпляров нет.

public enum MyUtilities {;
   public static void myMethod();
}
8 голосов
/ 27 августа 2010
public class Outer {
   public static class Inner {}
}

... он может быть объявлен как статический - до тех пор, пока он является классом-членом.

Из JLS:

Классы-члены могут быть статическими, вв этом случае они не имеют доступа к переменным экземпляра окружающего класса;или они могут быть внутренними классами (§8.1.3).

и здесь:

Статическое ключевое слово может изменять объявление типа члена C в телене внутренний класс T. Его эффект состоит в том, чтобы объявить, что C не является внутренним классом. Так же, как статический метод T не имеет текущего экземпляра T в своем теле, C также не имеет текущего экземпляраT, и при этом он не имеет каких-либо лексически заключающих экземпляров.

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

5 голосов
/ 27 августа 2010

Как объяснено выше, класс не может быть статическим, если он не является членом другого класса.

Если вы хотите разработать класс, «которого не может быть несколько экземпляров», вы можете посмотретьв шаблон проектирования "Singleton".

Информация для начинающих Singleton здесь .

Предостережение:

Если вы планируете использовать синглтоншаблон, сопротивляться изо всех сил.Это один из самых простых в понимании DesignPatterns, вероятно, самый популярный и, безусловно, самый злоупотребляемый. (источник: JavaRanch, как указано выше)

4 голосов
/ 14 мая 2013

В дополнение к тому, как Java определяет статические внутренние классы, существует другое определение статических классов согласно миру C # [1] . Статический класс - это класс, который имеет только статические методы (функции) и предназначен для поддержки процедурного программирования. Такие классы на самом деле не являются классами в том смысле, что пользователь класса интересуется только вспомогательными функциями, а не созданием экземпляров класса. Хотя статические классы поддерживаются в C #, в Java такой прямой поддержки не существует. Однако вы можете использовать перечисления для имитации статических классов C # в Java, чтобы пользователь никогда не мог создавать экземпляры данного класса (даже используя отражение) [2] :

public enum StaticClass2 {
    // Empty enum trick to avoid instance creation
    ; // this semi-colon is important

    public static boolean isEmpty(final String s) {
        return s == null || s.isEmpty();
    }
}
2 голосов
/ 19 августа 2013

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

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

Если вы просто заменяете объект каждый раз, когда запускаете его, какой смысл его создавать?

Так вот почему Java избавилась от статики для класса верхнего уровня.

Могут быть и более конкретные причины, но для меня это логично.

...