Recientemente, tengo algo de experiencia en la asignación de objetos de subclase a objetos de clase principal y me gustaría compartirla con ustedes, pero mi nivel es limitado, así que corríjame y critíqueme.
Más cerca de casa, aquí hay algunos pequeños ejemplos, eche un vistazo.
Prueba uno
Clase para padres:
Subclase:
Resultado: este es el método print() de la clase principal; el objeto en este momento es Subclass@126b249
En este momento el objeto es Subclass@126b249
ilustrar:
Supclase sup=nueva Subclase();
Aunque el objeto declarado es un objeto de clase principal, el espacio de memoria real pertenece al objeto de subclase.
Se llama al método public void print() heredado de la clase principal y el resultado es la resolución del nombre del objeto de la subclase.
Conclusión: el objeto declarado en tiempo de compilación es un objeto de clase principal, pero en tiempo de ejecución es un objeto de subclase. Si la subclase no anula el método de la clase principal, el objeto en este momento llama al método heredado de la clase principal.
Prueba 2
Clase para padres:
Subclase:
Resultado: este es el método print() de la subclase; en este momento el objeto es Subclass@126b249
En este momento el objeto es Subclass@126b249
ilustrar:
Basado en el ejemplo anterior, reescribí el método print () de la clase principal. En este momento, se llamó al método print () de la subclase.
Conclusión: según la conclusión del ejemplo anterior, llegué a una conclusión: en este momento, el objeto es de hecho un objeto de subclase cuando se ejecuta, si la subclase no escribe el método de la clase principal.
Luego, el objeto en este momento llama al método heredado de la clase principal; de lo contrario, el objeto en este momento llama al método de la subclase;
Pregunta: ¿Podemos sacar la siguiente conclusión de la prueba anterior: asignar el objeto de subclase al objeto de clase principal (es decir, Supclass sup=new Subclass()),
Lo que obtenemos es un objeto de subclase, es decir, sup es un objeto de subclase??????
prueba tres
Clase para padres:
Subclase:
Resultado: Atributos en este momento: atributos de clase principal
Nota: Según la primera prueba, agregué un atributo className a la clase principal y anulé este atributo en la subclase.
Pero cuando genero las propiedades del objeto en este momento, son las propiedades de la clase principal.
Conclusión: al asignar objetos de subclase a objetos de clase principal, los métodos y propiedades son muy diferentes de nuestra relación de herencia ortodoxa.
pregunta:
¿El objeto en este momento es un objeto de subclase o un objeto de clase principal?
Empieza a especular:
Hay algunos puntos que debo señalar antes de especular:
1. Cuando creamos un nuevo objeto de subclase, el constructor del objeto de clase principal también se ejecuta al mismo tiempo, es decir, parte de la información necesaria de la clase principal y el objeto de subclase ocupan el mismo espacio de memoria.
Cuando anulamos el método, podemos usar el superobjeto para hacer referencia a la clase principal.
2. Los objetos en Java no están completamente orientados a objetos, es decir, los atributos y métodos de un objeto no están encapsulados en el objeto al mismo tiempo.
Pero el objeto tiene sus propios atributos, pero el método se refiere al método de la clase. Se puede decir que encapsula las referencias de los atributos y métodos de la clase en el objeto.
Entonces, el método llamado por el objeto no es su propio método, sino el método de la clase. En cuanto a por qué Java hace esto, no lo sé.
3. Cuando el objeto se carga en la memoria, la clase se carga primero en la memoria y luego la clase debe permanecer en la memoria. En cuanto a cuándo la clase desaparece de la memoria, no lo sé.
Creo que Java debe tener su propio mecanismo de reciclaje, al igual que el reciclaje de objetos.
4. Compilar y ejecutar son cosas completamente diferentes. Lo principal que hace durante la compilación es declarar el tipo de objeto, asignar atributos, verificar errores de sintaxis, etc.
Lo que hace el tiempo de ejecución es cargar objetos en la memoria (generalmente usando nuevos, la reflexión también se usa comúnmente), ejecutar funciones de ejecución de código, etc.
5. Si usted, el lector, y yo no coincidimos en estos puntos, o si no tenemos el mismo entendimiento sobre estos puntos, pensará que estoy diciendo tonterías.
Tal vez piense que mi puntuación de experto es demasiado baja y, por lo tanto, mi credibilidad es baja, pero lo que quiero decir es que no hay un orden de aprendizaje y los que dominan primero son los primeros.
Jaja, estoy listo para convertir mis puntos de experto en valores negativos, no más tonterías, sigamos.
Especulación:
1. Cuando compilamos Supclass sup = new Subclass (), el objeto sup se declara como la clase Supclass, por lo que los atributos del objeto sup son los valores de los atributos del objeto de clase principal.
3. Continuando con el paso 2, si anulamos el método de la clase principal, dado que el espacio de memoria del objeto sup es el espacio de memoria del objeto de la subclase, el método de la subclase public void print() se ha cargado en la memoria.
Entonces, lo que llamamos es el método public void print() de la subclase. Si necesita llamar al método anulado de la clase principal, debe usar super.
Este pasaje puede explicar la prueba 2.
Resumir:
Las siguientes son opiniones puramente personales:
Asigne el objeto de subclase al objeto de clase principal y el objeto resultante será un objeto como este:
Se compila como un objeto de clase principal, pero se ejecuta como un objeto de subclase. Las características específicas son las siguientes.
1. Declarado como un objeto de clase principal 2. Tiene atributos de clase principal 3. Ocupa el espacio de memoria de la subclase 4. Cuando el método de la subclase anula el método de la clase principal, el objeto llama al método de la subclase en este momento, de lo contrario, la herencia se realiza automáticamente; llamados Métodos de la clase padre.
5. Creo que este objeto no es un objeto de clase principal ni un objeto de subclase. Cuando usamos sus métodos,
Lo trato como un objeto de subclase; si uso sus propiedades, lo trato como un objeto de clase padre.
Es un objeto que ocupa los atributos de la clase principal y utiliza los métodos de la subclase. En cuanto a qué tipo de objeto es, creo que depende de la declaración. Debe considerarse como un objeto de clase principal, pero tiene una subclase. métodos.
Piénselo:
Según la prueba 3, ¿cómo extraemos los atributos de la subclase? ? ? ? ?