JavaRush /Blog Java /Random-ES /Operador de instancia de Java

Operador de instancia de Java

Publicado en el grupo Random-ES
¡Hola! Hoy hablaremos sobre el operador instancia de, veremos ejemplos de su uso y tocaremos algunos puntos relacionados con su funcionamiento :) En los primeros niveles de JavaRush, ya se encontró con este operador. ¿Recuerdas por qué es necesario? Si no, no importa, recordémoslo juntos. El operador instancia de es necesario para comprobar si el objeto al que hace referencia la variable X se creó a partir de alguna clase Y. Suena simple. ¿Por qué volvimos a este tema? En primer lugar, porque ahora está familiarizado con el mecanismo de herencia en Java y otros principios de programación orientada a objetos. El tema de instancia de será mucho más claro y veremos casos de uso más avanzados. ¡Ir! ¿Cómo funciona el operador Instancia de - 1Probablemente recuerde que el operador instancia de devuelve verdadero si la prueba fue verdadera, o falso si el resultado fue falso. En consecuencia, se encuentra con mayor frecuencia en varios tipos de condiciones de prueba ( if…else). Comencemos con ejemplos más simples:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
¿Qué crees que se enviará a la consola? Bueno, aquí es obvio :) El objeto хes un número entero, por lo que el resultado será verdadero . Salida de la consola: verdadero Intentemos verificar si pertenece, por ejemplo, a String:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// ¡error!
   }
}
Recibimos un error. Y preste atención: ¡el compilador lo emitió incluso antes de que se ejecutara el código! Inmediatamente vio que Integer y String no se pueden convertir automáticamente entre sí y no tienen relaciones de herencia. Por lo tanto, no se creará un objeto de clase Integer a partir de String. Esto es conveniente y ayuda a evitar errores extraños durante la ejecución del programa, por lo que el compilador nos ayudó aquí :) Ahora intentemos ver ejemplos más complejos. Ya que mencionamos la herencia, trabajemos con este pequeño sistema de clases:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Ya sabemos cómo se comporta instancia de cuando comprobamos si un objeto pertenece a una clase en una situación normal, pero ¿qué sucede si agregamos aquí una relación padre-hijo? ¿Cómo funciona el operador Instancia de - 2 Por ejemplo, ¿qué crees que producirá la siguiente verificación?
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();

       System.out.println(cat instanceof Animal);

       System.out.println(cat instanceof MaineCoon);

   }
}
Resultado: verdadero falso La pregunta principal que debe responderse es ¿cómo descifra exactamente instancia de el concepto de “un objeto creado en base a una clase”? Como resultado, lo conseguimos Сat instanceof Animal == true, pero se pueden encontrar fallas en tal formulación. ¿ Por qué se crea este objeto Caten función de la clase Animal? ¿No se crea únicamente en función de su propia clase? La respuesta es bastante sencilla y es posible que ya la hayas descubierto. Recuerde el orden en que se llaman los constructores y se inicializan las variables al crear un objeto. Ya hemos cubierto este tema en el artículo sobre el constructor de clases . Aquí hay un ejemplo de esa conferencia:
public class Animal {

   String brain = "El valor inicial del cerebro en la clase Animal";
   String heart = "El valor inicial de corazón en la clase Animal";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("Se está ejecutando el constructor de la clase base Animal");
       System.out.println("¿Ya se inicializaron las variables de la clase Animal?");
       System.out.println("El valor actual de la variable estática animalCount = " + animalCount);
       System.out.println("Valor actual del cerebro en la clase Animal =" + this.brain);
       System.out.println("Valor actual del corazón en la clase Animal =" + this.heart);

       this.brain = brain;
       this.heart = heart;
       System.out.println("¡Constructor de clase base animal completado!");
       System.out.println("Valor actual del cerebro =" + this.brain);
       System.out.println("Valor actual del corazón = " + this.heart);
   }
}

class Cat extends Animal {

   String tail = "El valor inicial de la cola en la clase Cat";

   static int catsCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("Se ha iniciado el constructor de la clase Gato (ya se ha ejecutado el constructor Animal)");
       System.out.println("El valor actual de la variable estática catsCount = " + catsCount);
       System.out.println("Valor actual cola =" + this.tail);
       this.tail = tail;
       System.out.println("Valor actual cola =" + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Cerebro", "Corazón", "Cola");
   }
}
Y si lo ejecutas en el IDE, la salida de la consola se verá así: El constructor de la clase base Animal se está ejecutando ¿Se han inicializado ya las variables de la clase Animal? Valor actual de la variable estática animalCount = 7700000 Valor actual del cerebro en la clase Animal = Valor inicial del cerebro en la clase Animal Valor actual del corazón en la clase Animal = Valor inicial del corazón en la clase Animal El constructor de la clase Animal base ha completado su trabajo! Valor actual de cerebro = Cerebro Valor actual de corazón = Corazón El constructor de la clase Gato ha comenzado a funcionar (el constructor Animal ya ha sido ejecutado) Valor actual de la variable estática catsCount = 37 Valor actual de cola = Valor inicial de cola en el Clase de gato Valor actual de cola = Cola ¿Te acuerdas ahora? :) El constructor de la clase base, si existe, siempre se llama primero al crear cualquier objeto. Instanceof sigue este principio cuando intenta determinar si un objeto fue Аcreado a partir de una clase Б. Si se llama al constructor de la clase base, entonces no puede haber ninguna duda. Con el segundo check todo es más sencillo:
System.out.println(cat instanceof MaineCoon);
MaineCoonNo se llamó al constructor al crear Cat, lo cual es lógico. Después de todo, MaineCoones un descendiente Cat, no un antepasado. Pero Catno es un modelo para. Ok, esto parece claro. ¿Qué pasará si hacemos esto?
public class Main {

   public static void main(String[] args) {

       Cat cat = new MaineCoon();

       System.out.println(cat instanceof Cat);
       System.out.println(cat instanceof MaineCoon);


   }
}
Mmm... esto es más complicado. Intentemos razonar. Tenemos una variable de tipo Caty le hemos asignado un objeto de tipo MaineCoon. Por cierto, ¿por qué funciona esto? ¿Es posible hacer esto? Poder. Después de todo, cualquier Maine Coon es un gato. Si no te queda del todo claro, recuerda el ejemplo con extensiones de tipo primitivo:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
El número 1024 es corto : cabe fácilmente en la variable larga , porque el número de bytes es suficiente (¿recuerdas el ejemplo de las muñecas nido?). Un objeto hijo siempre se puede asignar a una variable antecesora. Sólo recuerde esto por ahora, y en las próximas conferencias analizaremos este proceso más a fondo. Entonces, ¿qué producirá nuestro ejemplo?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
¿Qué comprobará la instancia de: nuestra variable de clase Cato nuestro objeto de clase MaineCoon? En realidad, la respuesta a esta pregunta es sencilla. Solo necesita leer la definición de nuestro operador nuevamente: el operador instancia de es necesario para verificar si el objeto al que hace referencia la variable se Xcreó en función de alguna clase Y. El operador instancia de verifica el origen de un objeto, no de una variable. Por lo tanto, en el ejemplo, ambas veces se mostrará verdadero en la consola : tenemos un objeto de tipo MaineCoon. Naturalmente, se creó en función de la clase MaineCoon, ¡pero también en función de la clase principal Cat!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION