usar - public static java
Clases estáticas en Java (9)
¿Hay algo como static class
en java?
¿Cuál es el significado de tal clase? ¿Todos los métodos de la clase static
también deben ser static
?
¿Se requiere al revés, que si una clase contiene todos los métodos estáticos, la clase también será estática?
¿Para qué son buenas las clases estáticas?
¿Qué sucede cuando un miembro dentro de una class
se declara como static
? Se puede acceder a los miembros sin crear una instancia de la class
. Por lo tanto, hacer que la clase externa (clase de nivel superior) static
no tenga significado. Por lo tanto no está permitido.
Pero puede establecer clases internas como estáticas (ya que es un miembro de la clase de nivel superior). Luego se puede acceder a esa clase sin crear una instancia de la clase de nivel superior. Considere el siguiente ejemplo.
public class A {
public static class B {
}
}
Ahora, dentro de una clase C
diferente, se puede acceder a la clase B
sin crear una instancia de la clase A
public class C {
A.B ab = new A.B();
}
static
clases static
pueden tener miembros non-static
. Sólo la clase se vuelve estática.
Pero si la palabra clave static
se elimina de la clase B
, no se puede acceder directamente sin crear una instancia de A
public class C {
A a = new A();
A.B ab = a. new B();
}
Pero no podemos tener miembros static
dentro de una clase interna non-static
.
Bueno, Java tiene "clases anidadas estáticas", pero no son en absoluto iguales a las clases estáticas de C #, si es de donde venías. Una clase anidada estática es solo una que no tiene una referencia implícita a una instancia de la clase externa.
Las clases anidadas estáticas pueden tener métodos de instancia y métodos estáticos.
No existe una clase estática de nivel superior en Java.
Hay una clase anidada estática, esta clase [anidada estática] no necesita una instancia de la clase envolvente para poder ser instanciada.
Estas clases [las que están anidadas estáticamente] pueden acceder solo a los miembros estáticos de la clase envolvente [ya que no tiene ninguna referencia a las instancias de la clase envolvente ...]
Ejemplo de código:
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 tiene clases anidadas estáticas, pero parece que estás buscando una clase estática de nivel superior. Java no tiene forma de hacer una clase estática de nivel superior, pero puede simular una clase estática como esta:
- Declare la
final
su clase: evita la extensión de la clase ya que no tiene sentido extender una clase estática - Hacer que el constructor sea
private
: evita la creación de instancias por el código del cliente, ya que no tiene sentido instanciar una clase estática - Haga que todos los miembros y funciones de la clase sean
static
: dado que no se puede crear una instancia de la clase, no se puede llamar a los métodos de la instancia o se puede acceder a los campos de la instancia - Tenga en cuenta que el compilador no le impedirá declarar un miembro de instancia (no estático). El problema solo se mostrará si intenta llamar al miembro de la instancia
Ejemplo simple por sugerencias de arriba:
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;
}
}
¿De qué sirven las clases estáticas? Un buen uso de una clase estática es en la definición de clases de uso único, de utilidad y / o de biblioteca donde la creación de instancias no tendría sentido. Un gran ejemplo es la clase de matemáticas que contiene algunas constantes matemáticas como PI y E y simplemente proporciona cálculos matemáticos. Requerir la instanciación en tal caso sería innecesario y confuso. Ver la clase de matemáticas de Java . Observe que es final y todos sus miembros son estáticos. Si Java permitiera que las clases de nivel superior se declararan estáticas, entonces la clase matemática sería de hecho estática.
Java tiene métodos estáticos asociados con clases (por ejemplo, java.lang.Math solo tiene métodos estáticos), pero la clase en sí no es estática.
Las clases externas no pueden ser estáticas, pero pueden ser clases anidadas / internas. Eso básicamente le ayuda a usar la clase anidada / interna sin crear una instancia de la clase externa.
Sí, hay una clase anidada estática en java. Cuando declara una clase anidada estática, se convierte automáticamente en una clase independiente que puede ser instanciada sin tener que instanciar la clase externa a la que pertenece.
Ejemplo:
public class A
{
public static class B
{
}
}
Debido a que la class B
se declara estática, puede crear una instancia explícita como:
B b = new B();
Tenga en cuenta que si la class B
no se declaró estática para que sea independiente, una llamada a un objeto de instancia se vería así:
A a= new A();
B b = a.new B();
Viendo que este es el principal resultado en Google para "static class java" y la mejor respuesta no está aquí, pensé en agregarlo. Estoy interpretando que la pregunta de OP se refiere a las clases estáticas en C #, que se conocen como singletons en el mundo Java. Para aquellos que no lo saben, en C # la palabra clave "estática" se puede aplicar a una declaración de clase, lo que significa que la clase resultante nunca puede ser instanciada.
Extracto de "Effective Java - Second Edition" de Joshua Bloch (considerado como una de las mejores guías de estilo de Java disponibles):
A partir de la versión 1.5, hay un tercer enfoque para implementar singletons. Simplemente haga un tipo de enumeración con un elemento:
// Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } }
Este enfoque es funcionalmente equivalente al enfoque de campo público, excepto que es más conciso, proporciona la maquinaria de serialización de forma gratuita y proporciona una garantía férrea contra la creación de instancias múltiples, incluso ante la serialización sofisticada o los ataques de reflexión. Si bien este enfoque aún no se ha adoptado ampliamente, un tipo de enumeración de un solo elemento es la mejor manera de implementar un singleton. (énfasis del autor)
Bloch, Joshua (2008-05-08). Java efectiva (Serie Java) (p. 18). Educación Pearson.
Creo que la implementación y la justificación son bastante autoexplicativas.
¿Puede una clase ser estática en Java?
La respuesta es SÍ , podemos tener una clase estática en Java. En java, tenemos variables de instancia estáticas , así como métodos estáticos y también bloque estático . Las clases también se pueden hacer estáticas en Java.
En java, no podemos hacer que la clase de nivel superior (exterior) sea estática. Sólo las clases anidadas pueden ser estáticas.
clase anidada estática vs clase anidada no estática
1) La clase estática anidada no necesita referencia de la clase externa, pero la clase anidada no estática o la clase interna requiere la referencia de la clase externa.
2) La clase interna (o clase anidada no estática) puede acceder tanto a los miembros estáticos como a los no estáticos de la clase externa. Una clase estática no puede acceder a miembros no estáticos de la clase externa. Solo puede acceder a miembros estáticos de clase externa.
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html