una tipos simple que polimorfismo obtener objetos herencia ejemplos clases clase atributos java inheritance

java - tipos - ¿Cómo determinar la clase de un objeto?



tipos de herencia en java (7)

Si la clase B y la clase C extienden la clase A y yo tenemos un objeto de tipo B o C , ¿cómo puedo determinar de qué tipo es una instancia?


Cualquier uso de cualquiera de los métodos sugeridos se considera un olor de código que se basa en un mal diseño de OO.

Si su diseño es bueno, no debería tener que usar getClass() o instanceof .

Cualquiera de los métodos sugeridos funcionará, pero es algo que debe tenerse en cuenta, en cuanto al diseño.


Podemos usar la reflexión en este caso.

objectName.getClass().getName();

Ejemplo:-

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getClass().getName(); }

En este caso, obtendrá el nombre de la clase que pase el objeto a la variable de referencia de interfaz HttpServletRequest .


Puedes usar:

Object instance = new SomeClass(); instance.getClass().getName(); //will return the name (as String) (== "SomeClass") instance.getClass(); //will return the SomeClass'' Class object

HTH. Pero creo que la mayoría de las veces no es una buena práctica usar eso para controlar el flujo o algo similar ...


Se presentaron varias respuestas correctas, pero todavía hay más métodos: Class.isAssignableFrom() y simplemente intentar lanzar el objeto (lo que podría ClassCastException una ClassCastException ).

Posibles maneras resumidas

Resumamos las posibles formas de probar si un objeto obj es una instancia de tipo C :

// Method #1 if (obj instanceof C) ; // Method #2 if (C.class.isInstance(obj)) ; // Method #3 if (C.class.isAssignableFrom(obj.getClass())) ; // Method #4 try { C c = (C) obj; // No exception: obj is of type C or IT MIGHT BE NULL! } catch (ClassCastException e) { } // Method #5 try { C c = C.class.cast(obj); // No exception: obj is of type C or IT MIGHT BE NULL! } catch (ClassCastException e) { }

Diferencias en el manejo null

Sin embargo, hay una diferencia en el manejo de null :

  • En los primeros 2 métodos, las expresiones evalúan a false si obj es null ( null no es una instancia de nada).
  • El tercer método arrojaría una NullPointerException obviamente.
  • Los métodos 4º y 5º, por el contrario, aceptan null porque null se puede convertir en cualquier tipo.

Para recordar: null no es una instancia de ningún tipo, pero se puede convertir a cualquier tipo.

Notas

  • Class.getName() no debe usarse para realizar una prueba "is-instance-of" si el objeto no es del tipo C sino de una subclase, puede tener un nombre y un paquete completamente diferentes (por lo tanto, los nombres de las clases obviamente no coincide) pero sigue siendo de tipo C
  • Por el mismo motivo de herencia, Class.isAssignableFrom() no es simétrico :
    obj.getClass().isAssignableFrom(C.class) devolvería false si el tipo de obj es una subclase de C

También hay un método .isInstance en la Class " Class ". si obtiene la clase de un objeto a través de myBanana.getClass() , puede ver si su objeto myApple es una instancia de la misma clase que myBanana través de

myBanana.getClass().isInstance(myApple)



if (obj instanceof C) { //your code }