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

88

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

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

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

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

Existen 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 de 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 necesita la clase. Por otro lado, antes de poder utilizar un método de instancia pública, debe tener una instancia de la clase.

La forma en que se invoca un método estático dentro de la definición de otro método varía según si los dos métodos pertenecen 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".

Panthy
fuente

Respuestas:

161

El paradigma básico en Java es que usted escribe clases y que esas clases son instanciadas. Los objetos instanciados (una instancia de una clase) tienen atributos asociados con ellos (variables miembro) que afectan su comportamiento; cuando la instancia tenga 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; Es mejor hacer estos métodos 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:

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

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

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

En un nivel más profundo, cuando el compilador junta una clase, contiene varios punteros a 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 llamarán para esa clase en particular en la jerarquía de herencia. Sin embargo, si el método es estático, no se necesita una "tabla de método virtual": todas las llamadas a ese método van al mismo lugar exacto en la memoria para ejecutar exactamente el mismo código. Por esa razón, en los sistemas de alto rendimiento es mejor usar un método estático si no depende de las variables de instancia.

Nathaniel Ford
fuente
2
muchas gracias por los ejemplos de código que me parecen familiares, así que lo entiendo ahora
Panthy
4
@Rohan Otra buena forma de verlo es que cualquier cosa static(una clase, método o campo) en realidad no pertenece a nada, simplemente se cuelga en la clase con fines organizativos.
gobernador
1
Además, los campos estáticos se utilizan como objetos de datos (uno que contiene los datos y, por lo tanto, no puede cambiar, pero puede manipular los datos dentro de ellos). Los métodos estáticos solo se pueden invocar en campos estáticos y de ahora en adelante conllevan la misma noción de permanecer constante o no cambiar o no instanciar !!
user2416728
1
@ user2416728 Tu comentario es muy confuso. Los campos estáticos se pueden cambiar, pero su alcance es global para su entorno de ejecución. Por tanto, cualquier código que tenga acceso a dicho campo tiene acceso a los mismos datos. Esto no es equivalente a que los datos permanezcan constantes (a menos que se use un modificador 'final').
Nathaniel Ford
2
sí, "no cambiar" >> quise decir que no se puede crear una instancia !!
user2416728
19

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 instanciar la clase significa que primero debe crear un objeto de esa clase. Para estático, no necesita instanciar la clase u puede acceder a los métodos y variables con el nombre de la clase usando el signo de punto Qué esta en (.)

por ejemplo:

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

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

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.
Khalid Ahmed Khichi
fuente
8

Los métodos estáticos, las variables pertenecen a toda la clase, no solo a una instancia de objeto. Un método estático, la 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.

Paulius Matulionis
fuente
8

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 llamarlo. Los métodos estáticos son los métodos en Java que se pueden llamar sin crear un objeto de clase.

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

  3. Método estático significa que existirá como una sola copia para una clase. Pero los métodos de instancia existen como copias múltiples dependiendo del número de instancias creadas para esa clase.

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

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

Referencia: geeksforgeeks

rashedcs
fuente
4

Métodos de instancia => invocados en una instancia específica de una clase específica. Method quiere saber en qué clase se invocó. La forma en que sucede hay un parámetro invisible llamado 'esto'. Dentro de 'this' tenemos miembros de la clase de instancia ya configurados con valores. 'Esto' no es una variable. Es un valor, no se puede cambiar y el valor es referencia al receptor de la llamada. Ej .: Llamas a reparadores (método de instancia) para arreglar tu TV (programa real). Viene con herramientas (parámetro 'este'). Viene con herramientas específicas necesarias para arreglar TV y también puede arreglar otras cosas.

En métodos estáticos => no existe tal cosa como 'esto'. Ej: El mismo reparador (método estático). Cuando lo llame, debe especificar a qué reparador llamar (como electricista). Y vendrá y arreglará tu televisor solamente. Pero no tiene herramientas para arreglar otras cosas (no existe el parámetro 'esto').

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

Eldiyar Talantbek
fuente
2

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, ya que los métodos estáticos significan que todos los objetos tendrán la misma copia, por lo que no es necesario un objeto. p.ej:

Myclass.get();

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

Myclass x = new Myclass();
x.get();
Vishal Patil
fuente
1

Si se supone que el estado de un método no debe cambiarse o no va a utilizar ninguna variable de instancia.

Quieres llamar al método sin instancia.

Si solo funciona con los argumentos que se le proporcionan.

Las funciones de utilidad son un buen ejemplo de métodos estáticos. es decir, math.pow (), esta función no va a cambiar el estado para diferentes valores. Entonces es estático.

suketup
fuente
1

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

Esto significa que cada vez que se crea una instancia u objeto (usando new ClassName ()), este objeto conservará su propia copia de las variables instace. 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 los cinco objetos. Si necesita algo común para cada objeto creado, hágalo estático. Si necesita un método que no necesite datos específicos del objeto para funcionar, hágalo estático. El método estático solo funcionará con variables estáticas o devolverá datos sobre la base de 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 suma de los datos pasados ​​por un objeto específico. Pero el método estático se puede usar para obtener la suma de cualquier clase que no sea independiente de una instancia u objeto específico. Por lo tanto, para los métodos genéricos que solo necesitan argumentos para funcionar, se pueden hacer estáticos para mantenerlos todos SECOS.

Prakash
fuente
0

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

  1. El método de instancia puede acceder a los métodos de instancia y 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 directamente a las variables estáticas y a los métodos estáticos.

  4. Los métodos estáticos no pueden acceder a métodos de instancia y variables de instancia directamente. Deben usar una referencia al objeto. Y el método estático no puede usar esta palabra clave ya que no hay ninguna instancia para la que se pueda hacer referencia a "esto".

param
fuente
-2

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 realiza una nueva copia de esa función. :) Lo mismo ocurre con las variables.

Prakhar Mohan Srivastava
fuente