publicos poo palabra modificadores metodos funcion especificadores ejemplos acceso java static oop language-features restriction

poo - palabra public en java



¿Qué hace la palabra clave ''estática'' en una clase? (21)

Para ser específico, estaba intentando este código:

package hello; public class Hello { Clock clock = new Clock(); public static void main(String args[]) { clock.sayTime(); } }

Pero dio el error.

No se puede acceder al campo no estático en el método estático principal

Así que cambié la declaración de clock a esto:

static Clock clock = new Clock();

Y funcionó. ¿Qué significa poner esa palabra clave antes de la declaración? ¿Qué hará y / o restringirá exactamente en términos de lo que se puede hacer a ese objeto?


Cuando se ejecuta algún proyecto, primero cargue cosas estáticas (variables, métodos, bloques ...).

Cuando se ejecuta este proyecto, el método principal carga primero. Porque su static method . Luego mira el objeto "a" object Pero el objeto no está definido todavía. Porque no es estático. Entonces ven como este error.


En Java, la palabra clave static puede considerarse simplemente que indica lo siguiente:

"Sin tener en cuenta o relación con cualquier caso particular"

Si piensa en la static de esta manera, será más fácil comprender su uso en los diversos contextos en los que se encuentra:

  • Un campo static es un campo que pertenece a la clase en lugar de a una instancia en particular

  • Un método static es un método que no tiene noción de this ; está definido en la clase y no conoce ninguna instancia particular de esa clase a menos que se le pase una referencia

  • Una clase miembro static es una clase anidada sin ninguna noción o conocimiento de una instancia de su clase envolvente (a menos que se le pase una referencia a una instancia de clase envolvente)


Estático significa que no tiene que crear una instancia de la clase para usar los métodos o las variables asociadas con la clase. En tu ejemplo, podrías llamar:

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

directamente, en lugar de:

Hello h = new Hello(); h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

Desde dentro de un método estático (que pertenece a una clase) no puede acceder a ningún miembro que no sea estático, ya que sus valores dependen de su instanciación de la clase. Un objeto de reloj no estático, que es un miembro de instancia, tendría un valor / referencia diferente para cada instancia de su clase Hello y, por lo tanto, no podría acceder a él desde la parte estática de la clase.


Esta discusión hasta ahora ha ignorado las consideraciones del cargador de clases. En sentido estricto, los campos estáticos de Java se comparten entre todas las instancias de una clase para un cargador de clases determinado.


He desarrollado un gusto por los métodos estáticos (solo, si es posible) en las clases "de ayuda".

La clase que llama no necesita crear otra variable miembro (instancia) de la clase auxiliar. Usted acaba de llamar a los métodos de la clase de ayuda. También se mejora la clase auxiliar porque ya no necesita un constructor y no necesita variables miembro (instancia).

Probablemente hay otras ventajas.


La palabra clave static en Java significa que la variable o función se comparte entre todas las instancias de esa clase, ya que pertenece al tipo , no a los objetos reales en sí.

Entonces si tienes una variable: private static int i = 0; y si lo incrementa ( i++ ) en una instancia, el cambio se reflejará en todas las instancias. Ahora seré 1 en todos los casos.

Los métodos estáticos se pueden utilizar sin crear una instancia de un objeto.


La palabra clave static se utiliza para denotar un campo o un método como perteneciente a la clase en sí y no a la instancia. Usando su código, si el objeto Clock es estático, todas las instancias de la clase Hello compartirán este miembro de datos del Clock (campo) en común. Si lo hace no estático, cada instancia individual de Hello puede tener un campo de Clock único.

El problema es que agregó un método principal a su clase Hello para que pueda ejecutar el código. El problema aquí es que el método principal es estático y, como tal, no puede referirse a campos o métodos no estáticos dentro de él. Puedes resolver esto de dos maneras:

  1. Haga que todos los campos y métodos de la clase Hello estáticos para que se puedan consultar dentro del método principal . Esto realmente no es algo bueno que hacer (o la razón equivocada para hacer que un campo y / o un método sea estático)
  2. Cree una instancia de su clase Hello dentro del método principal y acceda a todos sus campos y métodos de la forma en que estaban destinados en primer lugar.

Para ti, esto significa el siguiente cambio en tu código:

package hello; public class Hello { private Clock clock = new Clock(); public Clock getClock() { return clock; } public static void main(String args[]) { Hello hello = new Hello(); hello.getClock().sayTime(); } }


La palabra clave static significa que algo (un campo, método o clase anidada) se relaciona con el tipo en lugar de con cualquier instancia particular del tipo. Entonces, por ejemplo, uno llama a Math.sin(...) sin ninguna instancia de la clase de Math , y de hecho no puede crear una instancia de la clase de Math .

Para obtener más información, consulte el bit relevante del Tutorial de Java de Oracle .

Nota al margen

Desafortunadamente, Java le permite acceder a miembros estáticos como si fueran miembros de instancia, por ejemplo,

// Bad code! Thread.currentThread().sleep(5000); someOtherThread.sleep(5000);

Eso hace que parezca que la sleep es un método de instancia, pero en realidad es un método estático: siempre hace que la suspensión del hilo actual. Es una mejor práctica dejar esto claro en el código de llamada:

// Clearer Thread.sleep(5000);


Las variables estáticas solo se pueden acceder mediante métodos estáticos, por lo tanto, cuando declaremos las variables estáticas, dichos métodos de obtención y configuración serán métodos estáticos.

Los métodos estáticos son un nivel de clase al que podemos acceder usando el nombre de clase

El siguiente es un ejemplo para los Variadores y Establecedores de Variables Estáticas:

public class Static { private static String owner; private static int rent; private String car; public String getCar() { return car; } public void setCar(String car) { this.car = car; } public static int getRent() { return rent; } public static void setRent(int rent) { Static.rent = rent; } public static String getOwner() { return owner; } public static void setOwner(String owner) { Static.owner = owner; } }


Para agregar a las respuestas existentes, déjame probar con una imagen:

Se aplica una tasa de interés del 2% a TODAS las cuentas de ahorro. Por eso es estático .

Un balance debe ser individual , por lo que no es estático.


Se puede asignar un campo a la clase o a una instancia de una clase. Por defecto los campos son variables de instancia. Al usar static el campo se convierte en una variable de clase, por lo tanto, hay un solo clock . Si realiza cambios en un lugar, es visible en todas partes. Los varables de instancia se cambian independientemente uno del otro.


Significa que solo hay una instancia de "reloj" en Hello, no una por cada instancia separada de la clase "Hello", o más, significa que habrá una referencia de "reloj" comúnmente compartida entre todas las instancias de la clase "hola".

Entonces, si hiciera un "nuevo saludo" en cualquier parte de su código: A- en el primer escenario (antes del cambio, sin usar "estática"), se generaría un nuevo reloj cada vez que se llame un "nuevo saludo". pero B- en el segundo escenario (después del cambio, usando "estática"), cada instancia de "nuevo Hola" todavía compartiría y usaría la referencia inicial y la misma "reloj" que se creó por primera vez.

A menos que necesitara un "reloj" en algún lugar fuera de main, esto funcionaría igual de bien:

package hello; public class Hello { public static void main(String args[]) { Clock clock=new Clock(); clock.sayTime(); } }


Static hace que el miembro del reloj sea un miembro de la clase en lugar de un miembro de la instancia. Sin la palabra clave estática, tendría que crear una instancia de la clase Hello (que tiene una variable miembro de reloj), por ejemplo,

Hello hello = new Hello(); hello.clock.sayTime();


También se puede pensar en miembros estáticos que no tienen un puntero "esto". Se comparten entre todos los casos.


Uso básico de miembros estáticos ...

public class Hello { // value / method public static String staticValue; public String nonStaticValue; } class A { Hello hello = new Hello(); hello.staticValue = "abc"; hello.nonStaticValue = "xyz"; } class B { Hello hello2 = new Hello(); // here staticValue = "abc" hello2.staticValue; // will have value of "abc" hello2.nonStaticValue; // will have value of null }

Así es como puede tener valores compartidos en todos los miembros de la clase sin enviar la instancia de clase Hello a otra clase. Y con la estática no es necesario crear una instancia de clase.

Hello hello = new Hello(); hello.staticValue = "abc";

Puede llamar valores estáticos o métodos por nombre de clase:

Hello.staticValue = "abc";


los métodos estáticos no utilizan ninguna variable de instancia de la clase en la que se definen. En esta página se puede encontrar una muy buena explicación de la diferencia .


main() es un método estático que tiene dos restricciones fundamentales:

  1. El método estático no puede usar un miembro de datos no estáticos o llamar directamente a un método no estático.
  2. this() y super() no pueden usarse en contexto estático.

    class A { int a = 40; //non static public static void main(String args[]) { System.out.println(a); } }

Salida: Error de tiempo de compilación


static miembros static pertenecen a la clase en lugar de una instancia específica.

Significa que solo existe una instancia de un campo static [1] incluso si creas un millón de instancias de la clase o no creas ninguna. Será compartido por todas las instancias.

Como static métodos static tampoco pertenecen a una instancia específica, no pueden referirse a los miembros de la instancia. En el ejemplo dado, main no sabe a qué instancia de la clase Hello (y, por lo tanto, a qué instancia de la clase Clock ) debe referirse. static miembros static solo pueden referirse a miembros static . Los miembros de instancia pueden, por supuesto, acceder a miembros static .

Nota al margen: por supuesto, static miembros static pueden acceder a los miembros de la instancia a través de una referencia de objeto .

Ejemplo:

public class Example { private static boolean staticField; private boolean instanceField; public static void main(String[] args) { // a static method can access static fields staticField = true; // a static method can access instance fields through an object reference Example instance = new Example(); instance.instanceField = true; }

[1]: Dependiendo de las características de tiempo de ejecución, puede ser uno por ClassLoader o AppDomain o hilo, pero eso no está al lado.


Entendiendo conceptos estáticos

public class StaticPractise1 { public static void main(String[] args) { StaticPractise2 staticPractise2 = new StaticPractise2(); staticPractise2.printUddhav(); //true StaticPractise2.printUddhav(); /* false, because printUddhav() is although inside StaticPractise2, but it is where exactly depends on PC program counter on runtime. */ StaticPractise2.printUddhavsStatic1(); //true staticPractise2.printUddhavsStatic1(); /*false, because, when staticPractise2 is blueprinted, it tracks everything other than static things and it organizes in its own heap. So, class static methods, object can''t reference */ } }

Segunda clase

public class StaticPractise2 { public static void printUddhavsStatic1() { System.out.println("Uddhav"); } public void printUddhav() { System.out.println("Uddhav"); } }


Estático en Java:

Static es un modificador de no acceso. La palabra clave estática pertenece a la clase que a la instancia de la clase. se puede usar para adjuntar una variable o un método a una clase.

La palabra clave estática se puede utilizar con:

Método

Variable

Clase anidada dentro de otra clase

Bloque de inicializacion

NO PUEDE ser usado con:

Clase (No Anidado)

Constructor

Interfaces

Método Clase Interna Local (Diferencia luego clase anidada)

Métodos de clase interna

Variables de instancia

Variables locales

Ejemplo:

Imagine el siguiente ejemplo que tiene una variable de instancia llamada count que se incrementa en el constructor:

package pkg; class StaticExample { int count = 0;// will get memory when instance is created StaticExample() { count++; System.out.println(count); } public static void main(String args[]) { StaticExample c1 = new StaticExample(); StaticExample c2 = new StaticExample(); StaticExample c3 = new StaticExample(); } }

Salida:

1 1 1

Dado que la variable de instancia obtiene la memoria en el momento de la creación del objeto, cada objeto tendrá la copia de la variable de instancia, si se incrementa, no se reflejará en otros objetos.

Ahora, si cambiamos la cuenta de la variable de instancia a una estática , el programa producirá una salida diferente:

package pkg; class StaticExample { static int count = 0;// will get memory when instance is created StaticExample() { count++; System.out.println(count); } public static void main(String args[]) { StaticExample c1 = new StaticExample(); StaticExample c2 = new StaticExample(); StaticExample c3 = new StaticExample(); } }

Salida:

1 2 3

En este caso, la variable estática obtendrá la memoria solo una vez, si algún objeto cambia el valor de la variable estática, conservará su valor.

Estático con final:

La variable global que se declara como final y estática permanece sin cambios durante toda la ejecución. Porque, los miembros estáticos se almacenan en la memoria de clase y se cargan solo una vez en toda la ejecución. Son comunes a todos los objetos de la clase. Si declara las variables estáticas como finales, cualquiera de los objetos no puede cambiar su valor ya que es definitivo. Por lo tanto, las variables declaradas como finales y estáticas a veces se denominan constantes. Todos los campos de las interfaces se denominan constantes, porque son finales y estáticos de forma predeterminada.

Recurso de imagen: Estática final


//Here is an example public class StaticClass { static int version; public void printVersion() { System.out.println(version); } } public class MainClass { public static void main(String args[]) { StaticClass staticVar1 = new StaticClass(); staticVar1.version = 10; staticVar1.printVersion() // Output 10 StaticClass staticVar2 = new StaticClass(); staticVar2.printVersion() // Output 10 staticVar2.version = 20; staticVar2.printVersion() // Output 20 staticVar1.printVersion() // Output 20 } }