Este artículo utiliza ejemplos para analizar en detalle la diferencia entre sobrecargar y reescribir en Java. Los amigos interesados pueden consultarlo.
1. Sobrecarga:
(1) La sobrecarga de métodos es un medio para que una clase maneje diferentes tipos de datos de forma unificada. Existen varias funciones con el mismo nombre al mismo tiempo, con diferente número/tipo de parámetros.
La sobrecarga es una manifestación de polimorfismo en una clase.
(2) La sobrecarga de métodos Java significa que se pueden crear varios métodos en una clase. Tienen el mismo nombre pero diferentes parámetros y diferentes definiciones.
Al llamar a métodos, usted decide qué método utilizar en función del número y tipo de parámetros que se les pasan. Esto es polimorfismo.
(3) Al sobrecargar, los nombres de los métodos deben ser los mismos, pero los tipos y números de parámetros son diferentes, y los tipos de valores de retorno pueden ser iguales o diferentes. El tipo de valor devuelto no se puede utilizar como criterio para distinguir funciones sobrecargadas.
A continuación se muestra un ejemplo de sobrecarga:
paquete c04.answer;//Este es el nombre del paquete//Este es el primer método de programación de este programa. Primero cree una instancia de la clase Dog en el método principal y luego use la palabra clave this en el constructor de la clase Dog para llamar. método de corteza diferente. Los diferentes métodos sobrecargados de corteza se distinguen según sus tipos de parámetros. // Nota: el compilador prohíbe llamar al constructor en cualquier otro lugar que no sea el constructor. paquete c04.answer;el método public class Dog {Dog(){this.bark();}void bark()//bark() es un método sobrecargado {System.out.println(/"no ladra!/"); this.bark(/"female/", 3.4);}void ladrar(String m,double l)//Nota: Los valores de retorno de los métodos sobrecargados son los mismos, {System.out.println(/"a ladrando perro!/");this.bark(5, /"China/");} void bark(int a,String n)// Los métodos sobrecargados no se pueden distinguir por el valor de retorno, solo se pueden distinguir por el "tipo de parámetro" y el "nombre de clase" {System.out.println(/"un perro aullador/") ; } principal vacío estático público (Cadena [] args){Perro perro = new Perro();//dog.bark(); [Página]//dog.bark(/"macho/", /"amarillo/");//dog.bark(5, / "Porcelana/");
2. Anulación
(1) Polimorfismo entre la clase padre y la subclase, redefiniendo las funciones de la clase padre. Si un método definido en una subclase tiene el mismo nombre y parámetros que su clase principal, decimos que el método está anulando. En , las subclases pueden heredar métodos de la clase principal sin tener que reescribir los mismos métodos.
Pero a veces la subclase no quiere heredar los métodos de la clase principal sin cambios, pero quiere realizar ciertas modificaciones, lo que requiere reescribir el método.
La anulación de métodos también se denomina sobrescritura de métodos.
(2) Si un método en la subclase tiene el mismo nombre de método, tipo de retorno y lista de parámetros que un método en la clase principal, el nuevo método sobrescribirá el método original.
Si necesita el método original en la clase principal, puede usar la palabra clave super, que se refiere a la clase principal de la clase actual.
(3) Los permisos de modificación de acceso de las funciones de la subclase no pueden ser menores que los de la clase principal;
A continuación se muestra un ejemplo de reescritura:
Concepto: el mecanismo para llamar a métodos de objetos.
La verdad sobre el enlace dinámico:
1. El compilador verifica el tipo y el nombre del método declarado por el objeto para obtener todos los métodos candidatos. Intente comentar la prueba de la clase Base en el ejemplo anterior y luego la compilación no pasará.
2. Decisión de sobrecarga: el compilador verifica el tipo de parámetro de la llamada al método y selecciona el único de los métodos candidatos anteriores (habrá una conversión de tipo implícita durante este proceso).
Si el compilador encuentra más de uno o ninguno, informará un error. Intente comentar la prueba (byte b) de la clase base en el ejemplo anterior y el resultado de la ejecución es 1 1.
3. Si el tipo de método es priavte static final y Java usa compilación estática, el compilador sabrá exactamente qué método llamar.
4. Cuando el programa se ejecuta y utiliza enlace dinámico para llamar a un método, la máquina virtual debe llamar a la versión del método que coincida con el tipo real del objeto.
En el ejemplo, el tipo real al que apunta b es TestOverriding, por lo que b.test(0) llama a la prueba de la subclase.
Sin embargo, la subclase no anula la prueba (byte b), por lo que b.test((byte)0) llama a la prueba (byte b) de la clase principal.
Si se comenta el (byte b) de la clase principal, el tipo implícito se convierte a int en el segundo paso y finalmente se llama a la prueba (int i) de la subclase.
3. Resumen de aprendizaje:
El polimorfismo es una característica de la programación orientada a objetos y no tiene nada que ver con los métodos.
En pocas palabras, el mismo método puede realizar un procesamiento diferente según diferentes datos de entrada, es decir, sobrecarga de métodos, con diferentes listas de parámetros (polimorfismo estático)
Cuando una subclase hereda el mismo método de la clase principal y utiliza los mismos datos de entrada, pero quiere responder de manera diferente a la clase principal, debe anular el método de la clase principal.
Es decir, reescribir este método en una subclase: mismos parámetros, diferentes implementaciones (polimorfismo dinámico)
Las tres características principales de la programación orientada a objetos: herencia, polimorfismo y encapsulación.
clase pública Base{void test(int i){System.out.print(i);}void test(byte b){System.out.print(b);}} clase pública TestOverriding extiende Base{void test(int i) ){i++;System.out.println(i);}public static void main(String[]agrs){Base b=new TestOverriding();b.test(0)b.test((byte)0)}}
El resultado de salida en este momento es 1 0, que es el resultado del enlace dinámico en tiempo de ejecución.
La principal ventaja de anular es la capacidad de definir características específicas de una subclase:
publicclassFather{publicvoidspeak(){System.out.println(Padre);}} publicclassSonextendsFather{publicvoidspeak(){System.out.println("hijo");}}
Esto también se denomina polimorfismo. Los métodos de anulación solo pueden existir en relaciones de herencia. Los métodos de anulación solo pueden anular métodos no privados de la clase principal.
Cuando el método hablar() de la clase Padre es privado en el ejemplo anterior, la clase Hijo no puede anular el método hablar() de la clase Padre. En este momento, el método hablar() de la clase Hijo es equivalente a un método hablar() definido en. Clase de hijo.
Una vez que el método Speak() de la clase Padre es final, independientemente de si el método está modificado por público, protegido o predeterminado, la clase Son no puede anular el método Speak() de la clase Padre.
Al intentar compilar el código, el compilador arrojará un error. ejemplo:
publicclassFather{finalpublicvoidspeak(){System.out.println("Father");}}publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}//El compilador informará un error;
Cuando el método talk() de la clase padre se modifica de forma predeterminada, solo puede ser anulado por sus subclases en el mismo paquete. Si no está en el mismo paquete, no se puede anular.
Cuando se crea un prototipo del método hablar() de la clase Padre, no solo es anulado por sus subclases en el mismo paquete, sino que también puede ser anulado por subclases de diferentes paquetes.
Reglas para anular métodos:
1. La lista de parámetros debe ser exactamente la misma que la del método anulado; de lo contrario, no se puede llamar reescritura sino sobrecarga.
2. El tipo de retorno siempre debe ser el mismo que el tipo de retorno del método anulado; de lo contrario, no se puede llamar sobrescritura sino sobrecarga.
3. El límite del modificador de acceso debe ser mayor que el modificador de acceso del método anulado (público>protegido>predeterminado>privado)
4. El método anulado no debe generar una nueva excepción marcada o una excepción marcada que sea más amplia que la declaración del método anulado. Por ejemplo:
Un método de la clase principal declara una excepción marcada IOException. Al anular este método, no puede lanzar excepciones. Solo puede lanzar excepciones de subclases de IOException y puede lanzar excepciones no marcadas.
Y las reglas sobrecargadas:
1. Debe tener diferentes listas de parámetros;
2. Puede tener un tipo de devolución sin culpa, siempre que la lista de parámetros sea diferente;
3. Puede haber diferentes modificadores de acceso;
4. Se pueden lanzar diferentes excepciones;
La diferencia entre reescribir y sobrecargar es:
La anulación del polimorfismo funciona. Puede reducir en gran medida la cantidad de entrada de código al llamar a métodos sobrecargados. El mismo nombre de método puede tener diferentes funciones o valores de retorno siempre que se le pasen diferentes parámetros.
Al hacer un buen uso de la reescritura y la sobrecarga, se puede diseñar una clase con una estructura clara y concisa. Se puede decir que la reescritura y la sobrecarga desempeñan un papel extraordinario en el proceso de escritura de código.