Статические Классы В Java
что-нибудь вроде static class в java?
в чем смысл такого класса. Все ли методы статического класса должны быть static тоже?
требуется ли наоборот, что если класс содержит все статические методы, должен ли класс быть статическим тоже?
для чего нужны статические классы?
9 ответов:
в Java есть статические вложенные классы, но похоже, что вы ищете статический класс верхнего уровня. Java не имеет возможности сделать статический класс верхнего уровня, но вы можете имитировать статический класс следующим образом:
- объявить свой класс
final- предотвращает расширение класса, так как расширение статического класса не имеет смысла- конструктор
private- предотвращает создание экземпляра клиентским кодом, поскольку нет смысла создавать статический экземпляр класс- сделать все члены и функции класса
static- Так как класс не может быть создан ни один метод экземпляра не может быть вызван или поля экземпляра доступны- обратите внимание, что компилятор не будет препятствовать объявлению экземпляра (нестатического) члена. Проблема будет отображаться только при попытке вызвать экземпляр member
простой пример для предложений сверху:
public class TestMyStaticClass { public static void main(String []args){ MyStaticClass.setMyStaticMember(5); System.out.println("Static value: " + MyStaticClass.getMyStaticMember()); System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember()); // MyStaticClass x = new MyStaticClass(); // results in compile time error } } // A top-level Java class mimicking static class behavior public final class MyStaticClass { private MyStaticClass () { // private constructor myStaticMember = 1; } private static int myStaticMember; public static void setMyStaticMember(int val) { myStaticMember = val; } public static int getMyStaticMember() { return myStaticMember; } public static int squareMyStaticMember() { return myStaticMember * myStaticMember; } }что хорошего статические классы? хорошее использование статического класса заключается в определении одноразовых, служебных и/или библиотечных классов, где создание экземпляра не имеет смысла. Отличным примером является математический класс, который содержит некоторые математические константы, такие как PI и E, и просто предоставляет математические вычисления. Требование создания экземпляра в таком случае было бы ненужным и запутанным. посмотреть в Java класс Math. Обратите внимание, что он является окончательным, и все его члены статичны. Если Java разрешен верхний уровень классы, которые будут объявлены статическими, тогда математический класс действительно будет статическим.
Ну, Java имеет "статические вложенные классы", но они совсем не такие же, как статические классы C#, если это то, откуда вы пришли. Статический вложенный класс-это только тот, который неявно имеет ссылку на экземпляр внешнего класса.
статические вложенные классы могут иметь методы экземпляра и статические методы.
в Java нет такого понятия, как статический класс верхнего уровня.
есть статический вложенный класс, этот [статический вложенный] класс не нуждается в экземпляре заключающего класса, чтобы быть созданным сам.
эти классы [статические вложенные] могут обращаться только к статическим членам заключающего класса [поскольку он не имеет никакой ссылки на экземпляры заключающего класса...]
код:
public class Test { class A { } static class B { } public static void main(String[] args) { /*will fail - compilation error, you need an instance of Test to instantiate A*/ A a = new A(); /*will compile successfully, not instance of Test is needed to instantiate B */ B b = new B(); } }
Да есть статический вложенный класс в Java. Когда вы объявляете вложенный класс статическим, он автоматически становится автономным классом, который может быть создан без необходимости создавать экземпляр внешнего класса, к которому он принадлежит.
пример:
public class A { public static class B { } }, потому что
class Bобъявляется статическим вы можете явно создать экземпляр как:B b = new B();если
class Bне был объявлен статическим, чтобы сделать его автономным, вызов объекта экземпляра выглядел бы так вот так:A a= new A(); B b = a.new B();
что происходит, когда члены внутри
classобъявленstatic..? Что члены могут быть доступны без создания экземпляраclass. Поэтому делаем внешний класс (класс верхнего уровня)staticне имеет смысла. Поэтому это не допускается.но вы можете установить внутренние классы как статические (так как это член класса верхнего уровня). Затем к этому классу можно получить доступ без создания экземпляра класса верхнего уровня. Рассмотрим следующий пример.
public class A { public static class B { } }теперь, внутри другого класса
C, классBможно получить доступ без создания экземпляра классаA.public class C { A.B ab = new A.B(); }
staticклассы могут иметьnon-staticучастники тоже. Только класс становится статическим.но если
staticключевое слово удаляется из классаB, он не может быть доступен напрямую без создания экземпляраA.public class C { A a = new A(); A.B ab = a. new B(); }но мы не можем иметь
staticчлены внутриnon-staticвнутренний класс.
видя, что это лучший результат в Google для "статического класса java", и лучший ответ не здесь, я решил, что добавлю его. Я интерпретирую вопрос OP как касающийся статических классов в C#, которые известны как синглтоны в мире Java. Для тех, кто не знает, в C# ключевое слово "static" может быть применено к объявлению класса, что означает, что результирующий класс никогда не может быть создан.
отрывок из "эффективного Java-второго издания" Джошуа Блоха (широко считается один из лучших доступных руководств по стилю Java):
начиная с версии 1.5, есть третий подход к реализации синглтонов. Просто сделайте тип перечисления с одним элементом:
// Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } }этот подход функционально эквивалентен подходу к публичному полю, за исключением того, что он более лаконичен, предоставляет механизм сериализации бесплатно и обеспечивает железную гарантию от многократного создания экземпляров, даже перед лицом сложной сериализации или отражение атак. Хотя этот подход еще не получил широкого распространения, a одноэлементный тип перечисления является лучшим способом реализации синглтона. (курсив автора)
Bloch, Joshua (2008-05-08). Эффективная Java (Java Series) (стр. 18). Образование Пирсона.
Я думаю, что реализация и обоснование довольно понятны.
может ли класс быть статическим в Java ?
ответ да, мы можем иметь статический класс в Java. В java, у нас есть статические переменные экземпляра а также статические методы и статический блок. Классы также могут быть сделаны статическими в Java.
в java мы не можем сделать статический класс верхнего уровня (внешний). статическими могут быть только вложенные классы.
статический вложенный класс vs нестатический вложенный класс
1) вложенный статический класс не нуждается в ссылке внешнего класса, но Нестатический вложенный класс или внутренний класс требует внешнего класса ссылка.
2) внутренний класс(или нестатический вложенный класс) может получить доступ к статической и нестатические члены внешнего класса. Статический класс не может получить доступ нестатические члены внешнего класса. Он может получить доступ только к статическим члены космического класс.
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
внешние классы не могут быть статическими, но вложенные/внутренние классы могут быть. Это в основном помогает вам использовать вложенный / внутренний класс без создания экземпляра внешнего класса.
Java имеет статические методы, связанные с классами (например, java.ленг.Математика имеет только статические методы), но сам класс не является статическим.
Comments