Métodos estáticos frente a métodos de instancia en Java

Método de instancia

Los métodos de instancia son métodos que requieren que se cree un objeto de su clase antes de poder llamarlo. Para invocar un método de instancia, debemos crear un Objeto de la clase en la que se define el método. 

public void geek(String name)
{
 // code to be executed....
}
// Return type can be int, float String or user defined data type.

Asignación de memoria:  estos métodos en sí mismos se almacenan en el espacio de generación permanente del montón, pero los parámetros (argumentos que se les pasan) y sus variables locales y el valor que se devolverá se asignan en la pila. Se pueden llamar dentro de la misma clase en la que residen o desde las diferentes clases definidas ya sea en el mismo paquete o en otros paquetes dependiendo del tipo de acceso proporcionado al método de instancia deseado.
Puntos importantes: 
 

  • Los métodos de instancia pertenecen al Objeto de la clase, no a la clase, es decir, pueden llamarse después de crear el Objeto de la clase.
  • Los métodos de instancia no se almacenan por instancia, incluso con métodos virtuales. Se almacenan en una sola ubicación de memoria y solo «saben» a qué objeto pertenecen porque este puntero se pasa cuando los llama.
  • Se pueden anular, ya que se resuelven mediante el enlace dinámico en tiempo de ejecución.

A continuación se muestra la implementación del acceso al método de instancia:

Java

// Example to illustrate accessing the instance method .
import java.io.*;
 
class Foo {
 
    String name = "";
 
    // Instance method to be called within the
    // same class or from a another class defined
    // in the same package or in different package.
    public void geek(String name) { this.name = name; }
}
 
class GFG {
    public static void main(String[] args)
    {
 
        // create an instance of the class.
        Foo ob = new Foo();
 
        // calling an instance method in the class 'Foo'.
        ob.geek("GeeksforGeeks");
        System.out.println(ob.name);
    }
}
Producción

GeeksforGeeks

 

Método estático

Los métodos estáticos son los métodos en Java que se pueden llamar sin crear un objeto de clase. Se hace referencia a ellos por el nombre de la clase en sí o por la referencia al Objeto de esa clase.  

public static void geek(String name)
{
 // code to be executed....
}

// Must have static modifier in their declaration.
// Return type can be int, float, String or user defined data type.

Asignación de memoria: 

Se almacenan en el espacio de generación permanente del montón, ya que están asociados con la clase en la que residen, no con los objetos de esa clase. Pero sus variables locales y los argumentos que se les pasan se almacenan en la pila. Dado que pertenecen a la clase, se pueden llamar sin crear el objeto de la clase.

Puntos importantes:  

  • Los métodos estáticos están asociados con la clase en la que residen, es decir, se les llama sin crear una instancia de la clase, es decir, ClassName.methodName(args) .
  • Están diseñados con el objetivo de ser compartidos entre todos los objetos creados a partir de la misma clase.
  • Los métodos estáticos no se pueden anular, ya que el compilador los resuelve mediante el enlace estático en el momento de la compilación. Sin embargo, podemos tener métodos con el mismo nombre declarados estáticos tanto en la superclase como en la subclase , pero se llamará Ocultación del método ya que el método de la clase derivada ocultará el método de la clase base.

A continuación se muestra la ilustración del acceso a los métodos estáticos: 

Java

// Example to illustrate Accessing
// the Static method(s) of the class.
import java.io.*;
 
class Geek {
 
    public static String geekName = "";
 
    public static void geek(String name)
    {
        geekName = name;
    }
}
 
class GFG {
    public static void main(String[] args)
    {
 
        // Accessing the static method geek()
        // and field by class name itself.
        Geek.geek("vaibhav");
        System.out.println(Geek.geekName);
 
        // Accessing the static method geek()
        // by using Object's reference.
        Geek obj = new Geek();
        obj.geek("mohit");
        System.out.println(obj.geekName);
    }
}
Producción

vaibhav
mohit

Nota: Las variables estáticas y sus valores (primitivos o referencias) definidos en la clase se almacenan en el espacio de memoria  PermGen .
 

¿Qué sucede si la variable estática se refiere a un objeto? 

static int i = 1;
static Object obj = new Object();

En la primera línea, el valor 1 se almacenaría en la sección PermGen. En la segunda línea, el obj de referencia se almacenaría en la sección PermGen y el objeto al que se refiere se almacenaría en la sección de almacenamiento dinámico.

¿Cuándo usar métodos estáticos? 

  • Cuando tenga un código que se pueda compartir entre todas las instancias de la misma clase, coloque esa parte del código en un método estático.
  • Básicamente se utilizan para acceder a campos estáticos de la clase.

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

  • El método de instancia puede acceder a los métodos de instancia y las variables de instancia directamente.
  • El método de instancia puede acceder directamente a variables estáticas y métodos estáticos.
  • Los métodos estáticos pueden acceder a las variables estáticas y los métodos estáticos directamente.
  • Los métodos estáticos no pueden acceder a métodos de instancia y variables de instancia directamente. Deben usar referencia a objeto. Y el método estático no puede usar esta palabra clave ya que no hay una instancia para referirse a ‘esto’.

Referencias 

Este artículo es una contribución de Nitsdheerendra . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *