Diferencia entre métodos estáticos y métodos de instancia

Estaba leyendo el texto que me dieron en mi libro de texto y no estoy seguro de entender lo que dice. Básicamente me dice que los métodos estáticos o los métodos de clase incluyen la palabra clave “modificador” estática. Pero realmente no sé lo que eso significa?

¿Podría alguien explicarme en términos muy simples qué son los métodos estáticos o de clase?

Además, ¿podría obtener una explicación simple sobre qué métodos de instancia son?

Esto es lo que me dan en el libro de texto:

Hay importantes implicaciones prácticas de la presencia o ausencia del modificador estático. Un método de clase pública puede invocarse y ejecutarse tan pronto como Java procese la definición de la clase a la que pertenece. Ese no es el caso para un método de instancia. Antes de que se pueda invocar y ejecutar un método de instancia pública, se debe crear una instancia de la clase a la que pertenece. Para usar un método de clase pública, solo necesitas la clase. Por otro lado, antes de que pueda usar un método de instancia pública, debe tener una instancia de la clase.

La manera en que se invoca un método estático dentro de la definición de otro método varía según que los dos métodos pertenezcan o no a la misma clase. En el ejemplo anterior, factorial y main son ambos métodos de la clase MainClass. Como resultado, la invocación de factorial en la definición de main simplemente hace referencia al nombre del método, “factorial”.

El paradigma básico en Java es que se escriben clases, y que esas clases se instancian. Los objetos instanciados (una instancia de una clase) tienen atributos asociados con ellos (variables de miembro) que afectan su comportamiento; cuando la instancia tiene su método ejecutado se referirá a estas variables.

Sin embargo, todos los objetos de un tipo particular pueden tener un comportamiento que no depende en absoluto de las variables miembro; estos métodos se hacen mejor estáticos. Al ser estático, no se requiere ninguna instancia de la clase para ejecutar el método.

Puede hacer esto para ejecutar un método estático:

MyObject.staticMethod();//Simply refers to the class's static code 

Pero para ejecutar un método no estático, debes hacer esto:

 MyObject obj = new MyObject();//Create an instance obj.nonstaticMethod();//Refer to the instance's class's code 

En un nivel más profundo, cuando el comstackdor agrupa una clase, contiene varios punteros a los métodos. Cuando se ejecutan esos métodos, sigue los punteros y ejecuta el código en el otro extremo. Si se crea una instancia de una clase, el objeto creado contiene un puntero a la “tabla de métodos virtuales”, que apunta a los métodos que se invocarán para esa clase particular en la jerarquía de herencia. Sin embargo, si el método es estático, no se necesita una “tabla de métodos virtuales”: todas las llamadas a ese método van al mismo lugar en la memoria para ejecutar exactamente el mismo código. Por esa razón, en sistemas de alto rendimiento es mejor usar un método estático si no depende de variables de instancia.

Los métodos y variables que no se declaran como estáticos se conocen como métodos de instancia y variables de instancia. Para referirse a métodos y variables de instancia, primero debe crear una instancia de la clase, lo que significa que primero debe crear un objeto de esa clase. Para estática no necesita crear instancias de la clase, puede acceder a los métodos y variables con el nombre de clase usando el signo de período Qué esta en (.)

por ejemplo:

 Person.staticMethod(); //accessing static method. 

para el método no estático debes crear una instancia de la clase.

 Person person1 = new Person(); //instantiating person1.nonStaticMethod(); //accessing non-static method. 

Métodos estáticos, las variables pertenecen a toda la clase, no solo a una instancia de objeto. Un método estático, variable se asocia con la clase como un todo en lugar de con instancias específicas de una clase. Cada objeto compartirá una copia común de los métodos estáticos, variables. Solo hay una copia por clase, sin importar cuántos objetos se creen a partir de ella.

Instance methods => invocado en una instancia específica de una clase específica. El método quiere saber en qué clase se invocó. La forma en que sucede allí es un parámetro invisible llamado ‘esto’. Dentro de ‘esto’ tenemos miembros de la clase de instancia ya configurados con valores. ‘Esto’ no es una variable. Es un valor, no puede cambiarlo y el valor es referencia al receptor de la llamada. Ejemplo: Usted llama a reparadores (método de instancia) para reparar su televisor (progtwig real). Él viene con herramientas (‘este’ parámetro). Viene con las herramientas específicas necesarias para arreglar la televisión y también puede arreglar otras cosas.

En métodos estáticos => no existe tal cosa como ‘esto’. Ejemplo: el mismo reparador (método estático). Cuando lo llame, debe especificar a qué técnico llamar (como electricista). Y él vendrá y arreglará tu TV solamente. Pero, él no tiene herramientas para arreglar otras cosas (no hay ‘este’ parámetro).

Los métodos estáticos generalmente son útiles para operaciones que no requieren ningún dato de una instancia de la clase (de ‘esto’) y pueden realizar su propósito previsto únicamente utilizando sus argumentos.

Diferencia entre métodos estáticos y métodos de instancia

  1. Los métodos de instancia son métodos que requieren que se cree un objeto de su clase antes de poder invocarlo. Los métodos estáticos son los métodos en Java a los que se puede llamar sin crear un objeto de clase.

  2. El método estático se declara con palabra clave estática. El método de instancia no está con la palabra clave estática.

  3. El método estático significa que existirá como una copia única para una clase. Pero los métodos de instancia existen como copias múltiples según la cantidad de instancias creadas para esa clase.

  4. Los métodos estáticos se pueden invocar utilizando la referencia de clase. Los métodos de instancia o no estáticos se invocan mediante el uso de referencia de objeto.

  5. Los métodos estáticos no pueden acceder directamente a los métodos de instancia y las variables de instancia. El método de instancia puede acceder a variables estáticas y métodos estáticos directamente.

Referencia: geeksforgeeks

Si el estado de un método no se debe cambiar o no va a usar ninguna variable de instancia.

Desea llamar al método sin instancia.

Si solo funciona con los argumentos que se le proporcionan.

Las funciones de utilidad son una buena instancia de métodos estáticos. es decir, math.pow (), esta función no cambiará el estado de los diferentes valores. Entonces es estático.

El comportamiento de un objeto depende de las variables y los métodos de esa clase. Cuando creamos una clase, creamos un objeto para ella. Para los métodos estáticos, no los requerimos porque los métodos estáticos significan que todos los objetos tendrán la misma copia por lo que no hay necesidad de un objeto. p.ej:

 Myclass.get(); 

En el método de instancia, cada objeto tendrá un comportamiento diferente, por lo que debe llamar al método utilizando la instancia del objeto. p.ej:

 Myclass x = new Myclass(); x.get(); 

El modificador estático cuando se coloca delante de una función implica que solo existe una copia de esa función. Si el modificador estático no se coloca delante de la función, entonces con cada objeto o instancia de esa clase se hace una nueva copia de esa función. 🙂 Lo mismo es el caso con las variables.

En resumen, los métodos estáticos y las variables estáticas son de nivel de clase donde los métodos de instancia y las variables de instancia son instancia o nivel de objeto.

Esto significa que siempre que se cree una instancia u objeto (usando new ClassName ()), este objeto retendrá su propia copia de variables de instancias. Si tiene cinco objetos diferentes de la misma clase, tendrá cinco copias diferentes de las variables de instancia. Pero las variables y métodos estáticos serán los mismos para todos esos cinco objetos. Si necesita algo común para ser utilizado por cada objeto creado, hágalo estático. Si necesita un método que no necesite datos específicos de objetos para funcionar, hágalo estático. El método estático solo funcionará con la variable estática o devolverá los datos en función de los argumentos pasados.

 class A { int a; int b; public void setParameters(int a, int b){ this.a = a; this.b = b; } public int add(){ return this.a + this.b; } public static returnSum(int s1, int s2){ return (s1 + s2); } } 

En el ejemplo anterior, cuando llamas a add () como:

 A objA = new A(); objA.setParameters(1,2); //since it is instance method, call it using object objA.add(); // returns 3 B objB = new B(); objB.setParameters(3,2); objB.add(); // returns 5 //calling static method // since it is a class level method, you can call it using class itself A.returnSum(4,6); //returns 10 class B{ int s=8; int t = 8; public addition(int s,int t){ A.returnSum(s,t);//returns 16 } } 

En primera clase, add () devolverá la sum de datos pasados ​​por un objeto específico. Pero el método estático se puede usar para obtener la sum de cualquier clase que no sea independiente si se trata de una instancia u objeto específico. Por lo tanto, para los métodos generics que solo necesitan argumentos para trabajar, puede hacerse estático para mantenerlo todo SECO.

Método de instancia vs Método estático

  1. El método de instancia puede acceder a los métodos de instancia y a las variables de instancia directamente.

  2. El método de instancia puede acceder a variables estáticas y métodos estáticos directamente.

  3. Los métodos estáticos pueden acceder a las variables estáticas y a los métodos estáticos directamente.

  4. Los métodos estáticos no pueden acceder directamente a los métodos de instancia y las variables de instancia. Deben usar referencia al objeto. Y el método estático no puede usar esta palabra clave, ya que no hay ninguna instancia a la que ‘referirse’.