Есть ли что-нибудь вроде static class
в java?
В чем смысл такого класса. Нужно ли всем методам статического класса быть static
?
Требуется ли наоборот, что если класс содержит все статические методы, должен ли быть статичным тоже?
Для чего нужны статические классы?
Java имеет статические вложенные классы, но похоже, что вы ищете статический класс верхнего уровня. Java не имеет способа сделать класс верхнего уровня статическим, но вы можете имитировать статический класс следующим образом:
final
- Предотвращает расширение класса, поскольку расширение статического класса не имеет смыслаprivate
- предотвращает создание экземпляра по клиентскому коду, поскольку нет смысла создавать статический классstatic
. Поскольку класс не может быть инстанцирован, методы экземпляров не могут быть вызваны или доступны поля экземпляраПростой пример из приведенных выше предложений:
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;
}
}
Что хорошего в статических классах? Хорошее использование статического класса заключается в определении одноразовых, служебных и/или библиотечных классов, где инстанцирование не имеет смысла. Отличным примером является класс Math, который содержит некоторые математические константы, такие как PI и E, и просто обеспечивает математические вычисления. Требование создания экземпляра в таком случае было бы ненужным и запутанным. См. класс Java Math. Обратите внимание, что он является окончательным, и все его члены статичны. Если Java разрешал классы верхнего уровня объявляться статическими, то класс Math действительно был бы статическим.
Foo
только со static
методами не совпадает со static class Foo
Ну, у Java есть "статические вложенные классы", но они совсем не то же самое, что и статические классы С#, если это то, откуда вы пришли. Статический вложенный класс - это просто тот, который не подразумевает ссылку на экземпляр внешнего класса.
Статические вложенные классы могут иметь методы экземпляра и статические методы.
В 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 есть статический вложенный класс. Когда вы объявляете вложенный класс static, он автоматически становится самостоятельным классом, который может быть создан без необходимости создавать экземпляр внешнего класса, к которому он принадлежит.
Пример:
public class A
{
public static class B
{
}
}
Поскольку class B
объявлен static, вы можете явно создать экземпляр как:
B b = new B();
Обратите внимание, что если class B
не был объявлен static, чтобы сделать его автономным, вызов объекта экземпляра выглядел бы следующим образом:
A a= new A();
B b = a.new B();
B b = new B();
если вы пытаетесь создать его экземпляр из самого класса A
Что происходит, когда члены внутри 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
.
static
есть только одно значение в Java. Если что-то static
в классе, это означает, что к нему можно получить доступ без создания экземпляра этого класса. Это ничего не говорит о создании экземпляров или нет ..
Внешние классы не могут быть статическими, но вложенными/внутренними классами могут быть. Это в основном поможет вам использовать вложенный/внутренний класс, не создавая экземпляр внешнего класса.
Увидев, что это лучший результат в Google для "статического класса java", и лучший ответ здесь нет, я решил, что добавлю его. Я интерпретирую вопрос OP как относительно статических классов в С#, которые известны как одиночные точки в мире Java. Для тех, кто не знает, в С# ключевое слово "статическое" может быть применено к объявлению класса, что означает, что результирующий класс никогда не может быть создан.
Отрывок из "Эффективного Java - второго издания" Джошуа Блоха (широко известный как один из лучших руководств по стилю Java):
Начиная с версии 1.5, существует третий подход к реализации синглетонов. Просто введите тип перечисления с одним элементом:
// Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } }
Этот подход функционально эквивалентен общедоступному полевому подходу, за исключением того, что он более краткий, предоставляет бесплатную сериализующую технику и предоставляет отличную гарантию против множественного экземпляра даже в условиях сложных атак с сериализацией или отражением. Хотя этот подход еще не получил широкого применения, одноэлементный тип перечисления - лучший способ реализовать одноэлементный. (автор статьи)
Блох, Джошуа (2008-05-08). Эффективная Java (Java Series) (стр. 18). Образование Пирсона.
Я думаю, что реализация и обоснование довольно понятны.
Может ли класс быть статическим в Java?
Ответ ДА, мы можем иметь статический класс в java. В java у нас есть статические переменные экземпляра, а также статические методы, а также статический блок. Классы также могут быть статичными в Java.
В java мы не можем ставить класс верхнего уровня (внешний). Только вложенные классы могут быть статическими.
статический вложенный класс против нестатического вложенного класса
1) Вложенный статический класс не нуждается в ссылке на класс Outer, но Для нестатического вложенного класса или класса Inner требуется класс Outer ссылка.
2) Внутренний класс (или нестатический вложенный класс) может обращаться к статическим и нестатические члены класса Outer. Статический класс не может получить доступ нестатические члены класса Outer. Он может получить доступ только к статичным членов класса Outer.
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
Java имеет статические методы, связанные с классами (например, java.lang.Math имеет только статические методы), но сам класс не является статическим.