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

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

Ответ 1

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

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

Источники:

В той же теме:

Ответ 2

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

На высоком уровне ваш вопрос касается разницы между объектами и типами. Хотя есть много автомобилей (объектов), есть только один класс (тип) автомобиля. Объявление чего-то статичного означает, что вы работаете в пространстве типа. Здесь только один. Ключевое слово класса верхнего уровня уже определяет тип в "типе". В результате "public static class Car" избыточен.

Ответ 3

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

Ответ 4

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

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

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();
...

Ответ 5

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

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

Ответ 6

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

public enum MyUtilities {;
   public static void myMethod();
}

Ответ 7

public class Outer {
   public static class Inner {}
}

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

Из JLS:

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

и здесь:

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

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

Ответ 8

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

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

Информация для новичков Singleton здесь.

Протест:

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

Ответ 9

В дополнение к тому, как Java определяет статические внутренние классы, существует другое определение статических классов в соответствии с миром С# [1]. Статический класс - это тот, который имеет только статические методы (функции) и предназначен для поддержки процедурного программирования. Такие классы не являются действительно классами в том, что пользователь класса интересуется только вспомогательными функциями, а не созданием экземпляров класса. Хотя статические классы поддерживаются в С#, такая прямая поддержка не существует в Java. Однако вы можете использовать перечисления для имитации статических классов С# в 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();
    }
}

Ответ 10

Единственными классами, которые могут быть статичными, являются внутренние классы. Следующий код работает очень хорошо:

public class whatever {
    static class innerclass {
    }
}

Точкой статических внутренних классов является то, что они не имеют ссылки на внешний объект класса.

Ответ 11

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

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

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

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

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

Ответ 12

Я думаю, что это возможно так же просто, как выпить стакан кофе!. Просто взгляните на это. Мы не используем ключевое слово static при определении класса.

public class StaticClass {

    static private int me = 3;
    public static void printHelloWorld() {
       System.out.println("Hello World");
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

Разве это не определение статического класса? Мы просто используем функцию, привязанную к классу. Будьте осторожны, что в этом случае мы можем использовать другой класс в этом вложенном. Посмотрите на это:

class StaticClass1 {

    public static int yum = 4;

    static void  printHowAreYou() {
        System.out.println("How are you?");
    }
}

public class StaticClass {

    static int me = 3; 
    public static void printHelloWorld() {
       System.out.println("Hello World");
       StaticClass1.printHowAreYou();
       System.out.println(StaticClass1.yum);
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

Ответ 13

Можно взглянуть на PlatformUI в Eclipse для класса со статическими методами и частного конструктора, причем сам он является окончательным.

public final class <class name>
{
   //static constants
   //static memebers
}

Ответ 14

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