Este artículo estudia principalmente clases multiplexadas en la programación de Java. Entonces, ¿qué es una clase multiplexada y cuál es su uso? Aquí hay una introducción detallada.
Después de leer la entrevista con Luo Luo Shengyang, no pude evitar admirarlo. Era muy joven. Pensé que tenía la misma edad que Luo Yonghao, y había conocido a uno de los grandes que no eran una programación de secundaria junior y senior. Después de la entrevista, descubrí que Luo Luo también era una persona que dio un paso a la vez. No digas que es difícil de hacerlo o no puedes hacerlo. No lo probaste ni persististe.
Si no puede volar, corre, si no puede correr, camine, si no puede caminar, entonces gatear, pero
Hagas lo que hagas, debes seguir avanzando: Martin Luther King.
El título de la clase de reutilización fue difícil de entender al principio. Más tarde fui a leer la versión en inglés original del libro. De hecho, el título reutilizaba clases, y la reutilización de clases significaba "usar cosas preparadas". De hecho, los dos métodos de implementación a menudo se escuchan en la combinación de Java y la herencia.
(1) Combinación
El papel de HAS-A.
Public Class TV {show show; public String toString () {return "showgirl"; }} show de clase {} Mencionemos el método de tostración. Cuando necesita cadena y es un objeto, el compilador llamará al método ToString del objeto.
Hay un programa en la televisión. El programa actual no se inicializa y es nulo. No se puede llamar al método de espectáculo.
La combinación tiene un efecto poderoso. Desde una perspectiva orientada a objetos, si está creando una clase de automóvil, puede combinar fácilmente los componentes de vidrio, luz, motor y otros automóviles utilizando la combinación.
(2) Herencia
IS-A
paquete com.myown.iaiti; public class Father {public int i; void get () {System.out.println ("Padre");}} paquete de paquete son; import com.myown.iaiti.*; clase pública Son extiende el padre {padre f = new Pather (); int j = fi; son Son = new Son (); son.get ();} void void get () {super.get (); system.out.println ("hijo");}}Hay un problema con los permisos de acceso al paquete aquí. Si no se agrega público, el valor predeterminado es acceder al miembro dentro del paquete. Diferentes accesos de paquetes, es decir, el método de acceso del miembro del padre en Son es invisible. Y las palabras públicas son visibles, por lo que se obtiene el acceso.
La parte privada no puede ser heredada y pertenece a la clase principal privada, mientras que la parte pública será heredada y los métodos que deben modificarse pueden reescribirse. Los atributos a agregar se pueden agregar por separado.
Además, si se reescribe el método público original de los padres, si el método público del padre original no agrega público, no reducirá la visibilidad del método heredado del padre, lo que significa que la visibilidad del método heredado en la clase principal no puede reducirse. Super se refiere a la clase matriz, a saber, el padre.
Otro punto es que, de hecho, todas las clases en Java heredan implícitamente la clase de objeto. El objeto es la clase principal, y otras clases son subclases. A los extranjeros les gusta hablar de ello como la clase base. Las subclases también se llaman clases exportadas o clases derivadas.
(3) Agente
Hay una forma relativamente difícil de entender en el modelo de diseño: el modelo de agente. El autor habla de ello de manera muy interesante. El agente es la doctrina de la media de combinación y herencia.
paquete hijo; clase padre {public void get () {System.out.println ("Padre"); }} El hijo de clase pública extiende el padre {public static void main (string [] args) {Padre f = new Father (); f.get (); }} clase Padreproxy {Padre privado f = nuevo Padre (); public void get () {f.get (); }}Si trata directamente a Padre como miembro, entonces el método Padre estará expuesto a esta clase. Entonces podemos usar una clase de proxy como PatherProxy. Defino cómo obtener el método GET yo mismo. Sé que está llamando al método Get del Padre, pero la persona que usa mi poder no lo sabe. Solo le digo que si quieres usarlo, solo usa el método GET del proxy. La encapsulación se refleja. Lo anterior es solo un simple ejemplo de golpe aleatorio.
(4) Reescribir y recargar
Class Padre {public void get (String S) {System.out.println ("Padre"); } public void get (boolean b) {system.out.println ("boolean"); }} El hijo de clase pública extiende el padre {@Override public void get (String s) {System.out.println ("Padre"); } // @Override // Habrá un mensaje de error porque la clase principal no tiene este método, no es una reescritura de public void get (int i) {system.out.println ("sonint"); } public static void main (string [] args) {son s = new son (); s.get ("d"); s.get (falso); s.get (1); }}Reescribir es reubicar el método de la clase principal. Si no hay reescritura o sobrecarga, entonces cuando la subclase llama un método que la subclase no tiene, en realidad está llamando a la clase principal.
La sobrecarga es el mismo nombre del método, pero el nombre del parámetro es diferente. Para evitar que se sobrecargue incorrectamente, puede agregar la etiqueta @Override, lo que le pedirá que no haya reescribido el método.
(5) Protegido
Explicación detallada del código de control para los permisos de acceso a la programación Java
Escribí el artículo anterior de antemano porque no hablé sobre la herencia antes.
Simplemente puede considerar protegido como la herencia de la clase principal al Hijo, y no se puede acceder a otras clases no heredadas.
(6) Palabra clave final
Agregar el tipo básico de la palabra clave final significa que esta variable no cambiará después de la inicialización. Similar a la definición C, desea que una variable en este programa sea este valor sin cambiar. Puedes usar final.
Hijo de clase pública {int Age = 2; public static void main (string [] args) {final int i = 1; // i = 2; El valor no se puede cambiar más Final Son Son = New Son (); // son = nuevo son (); // El hijo variable local final no se puede asignar. // debe estar en blanco y no usar una asignación de compuesto // El hijo variable local modificado por final no se puede asignar, debe estar vacío o no asignarse nuevamente son.age = 4; // Aunque la referencia es constante, el objeto en sí se puede cambiar. } cambio void (final int c) {// c = this.age; No se puede asignar un nuevo valor porque el valor solo determina la referencia del objeto cuando el método pasa el parámetro y determina que la referencia del objeto es similar a esta // Age ++; No se puede cambiar}} Static es originalmente inicialización estática, y se usa con final para ocupar un espacio de almacenamiento que no se puede cambiar.
La final estática es una constante durante el período de compilación. Los nombres constantes se nombran tradicionalmente de acuerdo con las constantes de c. Todas son mayúsculas y palabras están separadas por subrayos.
valor final estático_one = 1;
Al modificar el método final
Public Class Print {Final void Can'tPrint () {System.out.println (1); }} public class Printson extiende Print {// void Can'tPrint () {} // No se puede reescribir porque está modificado por el público Public static void main (string [] args) {printson ps = new printson (); Ps.CannotPrint (); }}Se puede considerar como una propiedad no modificada (herencia ancestral) que la clase principal requiere que la clase infantil herede. Private se especifica implícitamente como final, porque el privado no le da herencia en absoluto. Esto es más privado que darle herencia pero no modificarla.
Por cierto, aclara los permisos.
Cuando la final modifica una clase, es para evitar que esta clase sea heredada.
(7) herencia e inicialización
El problema del pedido aquí es una pregunta interesante. Ver ejemplos.
clase abuelo {private static int i = print (); private static int imprimir () {System.out.println ("g"); regresar 1; }} El padre de clase extiende el abuelo {private static int i = print (); private static int imprimir () {System.out.println ("f"); regresar 1; }} El hijo de clase pública extiende el padre {private static int i = print (); private static int imprimir () {System.out.println ("S"); regresar 1; } public static void main (string [] args) {system.out.println ("primero"); }} ¿El resultado de la impresión es primero? Equivocado.
Aunque el método principal se ejecuta, veo que el hijo, que requiere inicialización estática, no lo tiene, pero el resultado es S, primero?
También está el problema de la inicialización. Hijo hereda al padre, por lo que el compilador cargará al padre e inicializará i. Si el padre hereda el abuelo, entonces el compilador cargará al abuelo, similar a la recursión.
El último inicializado es el I del abuelo.
Entonces, el resultado final es: G, F, S, primero.
Resumir
Lo anterior es toda la explicación detallada del código de multiplexación de programación Java en este artículo, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!