Pregunta Clases estáticas en Java


¿Hay algo como static class en java?

¿Cuál es el significado de tal clase? ¿Es necesario que todos los métodos de la clase estática static ¿también?

¿Se requiere a la inversa, que si una clase contiene todos los métodos estáticos, la clase también será estática?

¿Para qué sirven las clases estáticas?


764
2017-09-20 13:32


origen


Respuestas:


Java tiene estática anidado clases, pero parece que estás buscando una clase estática de primer nivel. Java no tiene forma de hacer una clase de nivel superior estática, pero puede simular una clase estática como esta:

  • Declara tu clase final - Impide la extensión de la clase ya que extender una clase estática no tiene sentido
  • Hacer el constructor private - Impide la creación de instancias por código de cliente, ya que no tiene sentido crear una instancia de una clase estática
  • Hacer todas los miembros y funciones de la clase static - Dado que la clase no se puede instanciar, no se pueden llamar a los métodos de instancia ni acceder a los campos de instancia.
  • Tenga en cuenta que el compilador no le impedirá declarar un miembro de instancia (no estático). El problema solo aparecerá si intentas 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 definir clases únicas, 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 instanciación en tal caso sería innecesario y confuso. Vea la clase de Matemáticas de Java. Tenga en cuenta que es final y que todos sus miembros son estáticos. Si Java permitiera que las clases de nivel superior se declarasen estáticas, la clase de Matemáticas sería, de hecho, estática.


710
2017-09-20 13:39



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 implícitamente una referencia 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.


278
2017-09-20 13:35



Hay una estática clase anidada, esta clase [anidada estática] no necesita una instancia de la clase envolvente para poder crear una instancia por sí misma.

Estas clases [anidados estáticos] pueden acceder solo a los miembros estáticos de la clase adjunta [ya que no tiene ninguna referencia a las instancias de la clase adjunta ...]

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

125
2017-09-20 13:35



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 crearse una instancia sin tener que instanciar la clase externa a la que pertenece.

Ejemplo:

public class A
{

 public static class B
 {
 }
}

Porque class B se declara estático, puedes crear una instancia explícita como:

B b = new B();

Nota si class B no se declaró estático para hacerlo independiente, una llamada a un objeto instancia se habría visto así:

A a= new A();
B b = a.new B();

83
2017-09-20 13:39



Qué está pasando cuando los miembros dentro de un class se declara como static..? Se puede acceder a los miembros sin instanciar el class. Por lo tanto, hacer la clase exterior (clase de nivel superior) static no tiene sentido. 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). Entonces se puede acceder a esa clase sin instanciar la clase de nivel superior. Considera el siguiente ejemplo.

public class A {
    public static class B {

    }
}

Ahora, dentro de una clase diferente C, clase B se puede acceder sin hacer una instancia de clase A.

public class C {
    A.B ab = new A.B();
}

static las clases pueden tener non-static miembros también Solo la clase se queda estática.

Pero si el static la palabra clave se elimina de la clase B, no se puede acceder directamente sin hacer una instancia de A.

public class C {
    A a = new A();
    A.B ab = a. new B();
}

Pero no podemos tener static miembros dentro de una non-static clase interna


28
2017-12-18 06:05



¿Puede una clase ser estática en Java?

La respuesta es , podemos tener clase estática en java. En java, tenemos variables de instancia estáticas tanto 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 (externa) sea estática. Solo 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     Clase anidada no estática o clase interna requiere clase externa     referencia.

2) La clase interna (o clase anidada no estática) puede acceder a ambos estáticos     y miembros no estáticos de la clase Outer. Una clase estática no puede acceder     miembros no estáticos de la clase Outer. Solo puede acceder estático     miembros de la clase Outer.

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


11
2017-10-10 09:19



Viendo que este es el resultado principal en Google para "Java de clase estática" y la mejor respuesta no está aquí, pensé que la agregaría. Estoy interpretando la pregunta de OP en lo que respecta a las clases estáticas en C #, que se conocen como singletons en el mundo de 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 se puede crear una instancia.

Extracto de "Effective Java - Second Edition" de Joshua Bloch (ampliamente considerada como una de las mejores guías de estilo Java disponibles):

A partir del lanzamiento 1.5, hay un tercer enfoque para implementar singletons. Simplemente haz 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 inquebrantable contra la creación de instancias múltiples, incluso frente a sofisticados ataques de serialización o reflexión. Si bien este enfoque aún no se ha adoptado ampliamente, una el tipo de enumeración de elemento único es la mejor manera de implementar un singleton. (énfasis del autor)

Bloch, Joshua (2008-05-08). Java efectivo (serie Java) (p.18). Educación Pearson.

Creo que la implementación y la justificación son bastante auto explicativas.


10
2018-02-24 02:37



Las clases externas no pueden ser estáticas, pero las clases anidadas / internas pueden ser. Eso básicamente te ayuda a usar la clase anidada / interna sin crear una instancia de la clase externa.


9
2017-09-20 13:36



Java tiene métodos estáticos asociados con las clases (por ejemplo, java.lang.Math tiene solo métodos estáticos), pero la clase en sí no es estática.


1
2017-09-20 13:35