Есть ли в java что-то похожее на статический класс
?
В чем смысл такого класса. Должны ли все методы статического класса быть тоже статическими
?
Требуется ли наоборот, если класс содержит все статические методы, то и класс должен быть статическим?
Для чего нужны статические классы?
В Java есть статические *вложенные классы, но это звучит, как вы'вновь глядя на топ-уровень статический класс. Ява не делает класс более высокого уровня статический, но вы можете моделировать статический класс, как это:
окончательной
- предотвращает расширение класса С расширение статический класс не имеет смыслачастная
- предотвращает экземпляра клиентского кода, так как он не имеет смысла, чтобы создать экземпляр статического классаПростой пример на предложения выше:
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, который содержит несколько математических констант, таких как Пи и Е и просто обеспечивает математические вычисления. Требует инстанцирования в таком случае будет излишним и вводящим в заблуждение. Смотрите математика
класс и исходный код. Обратите внимание, что это "финал" и все ее члены являются "статичными". Если Java допускается высокоуровневые классы должны быть объявлены "статичными", то математике класс действительно будет статичным.
В Java есть "статические вложенные классы", но это совсем не то же самое, что статические классы в C###39#, если вы хотели сказать. Статический вложенный класс - это просто класс, который не имеет неявной ссылки на экземпляр внешнего класса.
Статические вложенные классы могут иметь методы экземпляра и статические методы.
В 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
{
}
}
Ведь в класса объявляется static можно явно инстанцировать как:
B b = new B();
Обратите внимание, если в классе В было'т объявлены как static, чтобы сделать его самостоятельным, экземпляр объекта вызов'вэ выглядела так:
A a= new A();
B b = a.new B();
Что'ы происходит, когда члены внутри класса объявлен как статического
..? Что члены могут быть вызваны без создания экземпляра класса. Поэтому делая внешний класс(верхнего уровня класса) статический
не имеет смысла. Поэтому он не допускается.
Но вы можете установить внутренние классы как статические (так как он является членом высшего класса уровень). Затем этого класса могут быть доступны без создания экземпляра класса топ уровня. Рассмотрим следующий пример.
public class A {
public static class B {
}
}
Теперь, внутри другого класса "С", класса " Б "могут быть доступны без создания экземпляра класса "А".
public class C {
A.B ab = new A.B();
}
"статический" классы могут иметь слишком нестатических членов. Только класс становится статическим.
Но если "статический" ключевое слово удаляется из класса "Б", он не может быть непосредственно без создания экземпляра "а".
public class C {
A a = new A();
A.B ab = a. new B();
}
Но мы не можем иметь статические члены в нестатического внутреннего класса.
Может быть статический класс в Java ?
Ответ Да, мы могут иметь статический класс в Java. В Java, мы имеем статические переменные а также статические методы, а также статический блок. Классы также могут быть сделаны статической в Java.
В Java, мы не можем сделать верхнего уровня (наружный) класс статический. Только вложенные классы статические.
статический вложенный класс против нестатический вложенный класс
вложенный статический класс не нужна ссылка на внешний класс, но Нестатический вложенный класс или внутренний класс требует внешнего класса ссылка.
внутренний класс(или нестатический вложенный класс) может получить доступ к статической и нестатические члены внешнего класса. Статический класс не может обращаться к нестатическим членам внешнего класса. Он может получить доступ только к статическим члены внешнего класса.
смотрите здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
Учитывая, что это первый результат в Google и"статический Ява и" и лучший ответ Это'т здесь, я полагал, что я'd-добавить его. Я'м устный ОП'ы вопрос относительно статические классы в C#, которые известны как одиночек в мире Java. Для тех, кто не знает, в C# в "статический" и сайта могут быть применены в объявлении класса, что означает полученный класс не может быть инстанцирован.
Выдержка из "Эффективная Java - второго издания" Джошуа блох (широко считается одним из лучших в стиле Java гиды):
начиная с версии 1.5, есть третий подход к реализации синглтонов. Просто сделать перечислимый тип с одним элементом:
// перечислимый синглтон - предпочтительный подход общественные перечисление Элвис { экземпляр; leaveTheBuilding общественного недействительными() { ... } }
этот подход является функциональным эквивалентом подход общественных местах, за исключением того, что он более нагляден, обеспечивает сериализацию машинами бесплатно , и дает железные гарантии от нескольких экземпляров, даже в условиях сложных сериализации или отражения атак. Хотя этот подход еще должен быть широко принята, для одного элемента перечислимого типа является лучшим способом, чтобы реализовать синглтон. (автор упор'ы)
Блох Джошуа (2008-05-08). Эффективная Java (Ява серии) (стр. 18). Пирсон Образование.
Я думаю, внедрение и обоснование довольно понятны.
В простых терминах, Java поддерживает объявление класса, чтобы быть статический только для внутренних классов, но не для высших классов.
топ класса уровень: Java-проект может содержать более одного высшего классов в каждый исходный файл Java, один из классов был назван после имени файла. Есть только три варианта или ключевые слова разрешено перед топ-классов, общественных, Abstract и Final.
Внутренние классы: классы, которые находятся внутри высший класс уровня называются внутренними классами, которые в принципе понятие вложенных классов. Внутренние классы могут быть статическими. Идея сделать внутренние классы статичными, чтобы воспользоваться экземпляров объектов внутреннего класса без создания экземпляра объекта класса топ уровня. Это точно так же, как статические методы и переменные внутри топ-класса.
Следовательно, Java поддерживает статические классы на внутреннем уровне класса (в вложенные классы)
И Java не поддерживает статические классы в лучших классов.
Я надеюсь, что это дает более простое решение на вопрос для базового понимания статические классы в Java.
Используя статические классы-это просто здорово для целей группирования. Потому что Java позволяет нам групповые занятия, которые являются полезными друг для друга, мы их просто держать их вместе под одно ключевое слово static.
Java поддерживает вложенные классы и они могут быть статическими. Эти статические классы также называются статические вложенные классы. Ява статический вложенный класс имеет доступ только к статическим членам внешнего класса. Статический вложенный класс ведет себя похожими на топ-уровне класса и вложен только для удобства упаковки.
Давайте посмотрим на пример статического класса Java и посмотреть, как его можно использовать в Java-программы.
public class OuterClass {
private static String name = "Mohammad";
// static nested class
static class StaticNestedClass {
private int a;
public int getA() {
return this.a;
}
public String getName() {
return name;
}
}
}
Теперь давайте посмотрим, как создавать и использовать статический вложенный класс.
public class StaticNestedClassTest {
public static void main(String[] args) {
//creating instance of static nested class
OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
//accessing outer class static member
System.out.println(nested.getName()); // Printing "Mohammad"
}
}
Подробнее смотрите здесь :
Понимание статический класс в Java | Java для вложенных классов
Ява статического класса: на шаг дальше в вашем Java-путешествия Программирование
Статический метод означает, что к нему можно обращаться без создания объекта класса, в отличие от общественности:
public class MyClass {
// Static method
static void myStaticMethod() {
System.out.println("Static methods can be called without creating objects");
}
// Public method
public void myPublicMethod() {
System.out.println("Public methods must be called by creating objects");
}
// Main method
public static void main(String[ ] args) {
myStaticMethod(); // Call the static method
// myPublicMethod(); This would output an error
MyClass myObj = new MyClass(); // Create an object of MyClass
myObj.myPublicMethod(); // Call the public method
}
}
Нельзя использовать ключевое слово static в классе, если он не является внутренним классом. Статический внутренний класс является вложенным классом, который является статическим членом внешнего класса. К нему можно обращаться без создания экземпляра внешнего класса, используя другие статические элементы. Просто как статические члены, статический вложенный класс не имеет доступа к экземпляра переменные и методы внешнего класса.
public class Outer {
static class Nested_Demo {
public void my_method() {
System.out.println("This is my nested class");
}
}
public static void main(String args[]) {
Outer.Nested_Demo nested = new Outer.Nested_Demo();
nested.my_method();
}
}
Все хорошие ответы, но я не увидел ссылок на Java.утиль.Коллекции, которые используются тонн статического внутреннего класса для статических методов фактором. Так что добавление одного и того же.
Приведу пример из Java.утиль.Коллекции, который имеет несколько статический внутренний класс. Внутренние классы являются полезными для групповой код, который должен быть доступен через внешний класс.
/**
* @serial include
*/
static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
implements Set<E>, Serializable {
private static final long serialVersionUID = -9215047833775013803L;
UnmodifiableSet(Set<? extends E> s) {super(s);}
public boolean equals(Object o) {return o == this || c.equals(o);}
public int hashCode() {return c.hashCode();}
}
Здесь-статический фактор метода в Java.утиль.Класс коллекции
public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
return new UnmodifiableSet<>(s);
}