Como el título sugiere, me gustaría entender por qué las clases estáticas solo pueden tener miembros estáticos. Espero que sea el mismo en todos los lenguajes de programación. Entonces la explicación sería la misma para todos los idiomas, creo.¿Por qué las clases estáticas solo pueden tener miembros estáticos?
Respuesta
No se pueden crear instancias de clases estáticas, por lo tanto, no tendrá ninguna instancia, los miembros no estáticos necesitarían una instancia de su clase para acceder. Como la clase estática no puede tener ninguna instancia, no puede acceder a los miembros no estáticos si los hay.
Por lo tanto clases estáticas pueden tener sólo los miembros estáticos
Presumiblemente debido a los métodos de instancia nunca podrían ser llamados.
Si coloca un miembro no estático en una clase estática, no sería una clase estática. (No puede instanciar una clase estática: para tener miembros no estáticos, debe poder hacer instancias de la clase para llamar a esos miembros, lo que la convertiría en una clase normal)
Para verla De otra forma, al marcar una clase como estática, usted está pidiendo deliberadamente que el compilador no le permita poner métodos no estáticos en esa clase: esta es una decisión de diseño que ha tomado, y el compilador ayuda a verificar que usted siga el suyo diseño.
No se puede crear una instancia de una clase estática. Por lo tanto, nunca se podría acceder a los miembros no estáticos.
Si desea mezclar y unir los miembros estáticos, no haga la clase estática.
No es una decisión de diseño, sino lógica. El lugar más fácil para comenzar es mirando las definiciones relevantes de los conceptos:
Una clase estática es aquella que no puede ser instanciada. Eso significa que no puede crear objetos que sean del tipo de esa clase.
Los miembros no estáticos están vinculados a una instancia específica de una clase. Contienen datos que están asociados exclusivamente con un único objeto de ese tipo de clase.
Por lo tanto, si una clase estática contiene miembros no estáticos, nunca podría acceder a esos datos o llamar a ese método porque nunca podría crear una instancia de un objeto de ese tipo de clase estática. En su lugar, debe tener todos los miembros estáticos que se pueden invocar directamente desde una instancia estática de la clase.
Sin embargo, usted puede tienen clases no estáticas que contienen miembros estáticos. De esta manera, puede acceder a los datos o llamar a los métodos expuestos como miembros estáticos sin instanciar un objeto de esa clase. Sin embargo, puede también crear instancias de un objeto del tipo de esa clase y acceder a miembros no estáticos (o instancia). Por ejemplo, si tenía una clase Circle
, podría tener miembros estáticos como una función CalculateArea
y un campo PI
. Estos miembros son aplicables a todos los círculos, en general, solo por el hecho de que son círculos. Pero también podría tener miembros no estáticos asociados con instancias específicas de esa clase, porque describen objetos de círculo específicos. Estos podrían ser los campos Diameter
y Circumference
.También podría tener funciones no estáticas que calculen el área del círculo, dados los datos almacenados en los campos no estáticos para esa instancia particular.
No estoy seguro si esto está relacionado pero (en C# .net 4.0 al menos) una clase estática puede contener definiciones de clase no estáticas que contienen miembros no estáticos. Por lo tanto, parece que puede agregar miembros no estáticos a una clase estática porque un tipo anidado se considera member.
Ejemplo:
public static class MyClass
{
/// <summary>
/// This non-static class is accessible and able to be instantiated through the
/// static class MyClass.
/// </summary>
public class Type1
{
public String prop1 { get; set; }
public String funct1(String result)
{
return result;
}
}
/// <summary>
/// This function is inaccessible since it requires an instance of MyClass.
/// It will also cause a compile error.
/// </summary>
/// <returns></returns>
public String nonStaticFunc()
{
return "aString";
}
/// <summary>
/// This function is accessible through the MyClass type because it is also static
/// and therefore does not require a class instance.
/// </summary>
/// <returns></returns>
public static String staticFunc(String str)
{
return str;
}
}
Como se puede ver, la clase MyClass estática tiene un Tipo1 definición de clase no estática que debe ser instanciado con el fin de utilizar. Mientras que la función estática staticFunc en MyClass no necesita una instancia para acceder.
//Valid operations
String result = MyClass.staticFunc("result"); //No class instance.
MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type.
someObj.prop1 = someObj.funct1("hi");
- 1. ¿Por qué las clases internas no pueden declarar miembros estáticos?
- 2. ¿Por qué las clases estáticas no pueden tener métodos y variables no estáticos?
- 3. ¿Por qué se usan clases estáticas?
- 4. ¿Por qué Android prefiere las clases estáticas
- 5. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 6. Ventajas de las clases con solo métodos estáticos en C++
- 7. Una pregunta sobre miembros estáticos dentro de clases no estáticas y recolección de basura
- 8. Los miembros del Detalle de SSRS solo pueden contener miembros internos estáticos.
- 9. Son miembros estáticos de clases genéricas compartidas entre tipos
- 10. ¿Debería evitar las clases estáticas?
- 11. ¿Por qué se les permite a las clases de C++ tener miembros con cero datos?
- 12. ¿Por qué declarar las clases Mapper y Reducer como estáticas?
- 13. ¿Usos para clases genéricas estáticas?
- 14. Definición de los miembros estáticos en C++
- 15. miembros const estáticos Por qué no pueden aparecer en una expresión constante como 'interruptor'
- 16. ¿Pueden los miembros de std :: forward_list implementarse como estáticos?
- 17. ¿Por qué las propiedades no pueden ser de solo lectura?
- 18. ¿Por qué podemos tener miembros finales estáticos pero no podemos tener un método estático en una clase interna?
- 19. ¿Por qué las estructuras estáticas no están permitidas en C#?
- 20. @autowired en clases estáticas
- 21. ¿Por qué las variables de miembros estáticos no funcionan bien con el operador ternario?
- 22. ¿Por qué no puedes declarar una estructura estática en C#, pero pueden tener métodos estáticos?
- 23. ¿Por qué solo puedo acceder a miembros estáticos desde una función estática?
- 24. Error del compilador de Java: "las clases internas no pueden tener declaraciones estáticas", excepto para los tipos simples
- 25. Cuándo usar clases y métodos estáticos?
- 26. ¿Por qué las propiedades de Dependencia se declaran como estáticas de solo lectura?
- 27. ¿Por qué los métodos de interfaz no pueden ser "estáticos" y "finales"?
- 28. Anulando miembros estáticos en clases derivadas en PHP
- 29. C#: La herencia de los miembros estáticos separados para las clases derivadas
- 30. Propiedades estáticas en clases estáticas
Suena un poco casero ... ¿has pensado en esto? ¿Qué propósito habría para permitir miembros no estáticos en una clase estática? – mpen
Sé que la regla 'clase estática no puede tener miembros no estáticos'. Pero quería entender por qué. De hecho, esperaba respuestas más frikis en términos de memoria, como la forma en que se almacenan las clases estáticas y sus miembros y cómo se almacenan las clases y los miembros no estáticos. :) – NLV