Este artigo usa exemplos para analisar detalhadamente a diferença entre sobrecarregar e reescrever em Java. Amigos interessados podem consultá-lo.
1. Sobrecarga:
(1) A sobrecarga de método é um meio para uma classe lidar com diferentes tipos de dados de forma unificada. Existem várias funções com o mesmo nome ao mesmo tempo, com diferentes números/tipos de parâmetros.
A sobrecarga é uma manifestação de polimorfismo em uma classe.
(2) A sobrecarga de métodos Java significa que vários métodos podem ser criados em uma classe. Eles têm o mesmo nome, mas parâmetros e definições diferentes.
Ao chamar métodos, você decide qual método usar com base no número e tipo de parâmetros passados a eles.
(3) Ao sobrecarregar, os nomes dos métodos devem ser iguais, mas os tipos e números dos parâmetros são diferentes e os tipos de valores de retorno podem ser iguais ou diferentes. O tipo de retorno não pode ser usado como critério para distinguir funções sobrecarregadas.
Aqui está um exemplo de sobrecarga:
package c04.answer;//Este é o nome do pacote //Este é o primeiro método de programação deste programa Primeiro crie uma instância da classe Dog no método principal e, em seguida, use a palavra-chave this no construtor da classe Dog para chamar. método de casca diferente. Diferentes métodos sobrecarregados são diferenciados de acordo com seus tipos de parâmetros. //Nota: O compilador proíbe chamar o construtor em qualquer outro lugar, exceto no construtor. package c04.answer;public class Dog {Dog(){this.bark();}void late()//bark() método é um método sobrecarregado {System.out.println(/"no latir!/"); this.bark(/"feminino/", 3.4);}void late(String m,double l)//Nota: Os valores de retorno dos métodos sobrecarregados são os mesmos, {System.out.println(/"um cachorro latindo!/");this.bark(5, /"China/");} void late(int a,String n)//Métodos sobrecarregados não podem ser distinguidos pelo valor de retorno, mas só podem ser distinguidos por "tipo de parâmetro" e "nome de classe" {System.out.println(/"um cachorro uivante/") ; }public static void principal(String[] args){Cachorro cachorro = new Cachorro();//dog.bark() [Página]//dog.bark(/"macho/", /"amarelo/");//dog.bark(5, / "China/");
2. Substituição
(1) Polimorfismo entre a classe pai e a subclasse, redefinindo as funções da classe pai. Se um método definido em uma subclasse tiver o mesmo nome e parâmetros de sua classe pai, dizemos que o método é sobrescrito. Em, as subclasses podem herdar métodos da classe pai sem precisar reescrever os mesmos métodos.
Mas às vezes a subclasse não deseja herdar os métodos da classe pai inalterados, mas deseja fazer certas modificações, o que requer a reescrita do método.
A substituição de método também é chamada de substituição de método.
(2) Se um método na subclasse tiver o mesmo nome de método, tipo de retorno e lista de parâmetros de um método na classe pai, o novo método substituirá o método original.
Se precisar do método original na classe pai, você pode usar a palavra-chave super, que se refere à classe pai da classe atual.
(3) As permissões de modificação de acesso das funções da subclasse não podem ser inferiores às da classe pai;
Aqui está um exemplo de reescrita:
Conceito: O mecanismo para chamar métodos de objetos.
Os detalhes sobre vinculação dinâmica:
1. O compilador verifica o tipo e o nome do método declarado pelo objeto para obter todos os métodos candidatos. Tente comentar o teste da classe Base no exemplo acima e a compilação não passará.
2. Decisão de sobrecarga: O compilador verifica o tipo de parâmetro da chamada do método e seleciona o único dos métodos candidatos acima (haverá conversão implícita de tipo durante este processo).
Se o compilador encontrar mais de um ou nenhum, o compilador reportará um erro. Tente comentar o test(byte b) da classe Base no exemplo acima e o resultado da execução será 1 1.
3. Se o tipo de método for priavte static final e Java usar compilação estática, o compilador saberá exatamente qual método chamar.
4. Quando o programa é executado e usa ligação dinâmica para chamar um método, a máquina virtual deve chamar a versão do método que corresponde ao tipo real do objeto.
No exemplo, o tipo real apontado por b é TestOverriding, então b.test(0) chama o teste da subclasse.
No entanto, a subclasse não substitui test(byte b), então b.test((byte)0) chama test(byte b) da classe pai.
Se o (byte b) da classe pai for comentado, o tipo implícito será convertido em int na segunda etapa e o teste (int i) da subclasse será finalmente chamado.
3. Resumo de aprendizagem:
O polimorfismo é um recurso da programação orientada a objetos e não tem nada a ver com métodos.
Simplificando, o mesmo método pode realizar diferentes processamentos de acordo com diferentes dados de entrada, ou seja, sobrecarga de método - com diferentes listas de parâmetros (polimorfismo estático)
Quando uma subclasse herda o mesmo método da classe pai e usa os mesmos dados de entrada, mas deseja responder de maneira diferente da classe pai, é necessário substituir o método da classe pai.
Ou seja, reescreva este método em uma subclasse - mesmos parâmetros, implementações diferentes (polimorfismo dinâmico)
As três principais características da OOP: herança, polimorfismo e encapsulamento.
classe pública Base{void test(int i){System.out.print(i);}void test(byte b){System.out.print(b);}} classe pública TestOverriding estende 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)}}
O resultado de saída neste momento é 1 0, que é o resultado da ligação dinâmica em tempo de execução.
A principal vantagem da substituição é a capacidade de definir características específicas de uma subclasse:
publicclassFather{publicvoidspeak(){System.out.println(Pai);}} publicclassSonextendsFather{publicvoidspeak(){System.out.println("filho");}}
Isso também é chamado de polimorfismo. Os métodos de substituição só podem existir em relacionamentos de herança.
Quando o método speak() da classe Pai é privado no exemplo acima, a classe Son não pode substituir o método speak() da classe Pai. Neste momento, o método speak() da classe Son é equivalente a um método speak() definido no. Classe filho.
Uma vez que o método speak() da classe Pai é final, independentemente de o método ser modificado por público, protegido ou padrão, a classe Son não pode substituir o método speak() da classe Pai.
Ao tentar compilar o código, o compilador gerará um erro. exemplo:
publicclassFather{finalpublicvoidspeak(){System.out.println("Father");}}publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}//O compilador reportará um erro;
Quando o método speak() da classe pai é modificado por padrão, ele só pode ser substituído por suas subclasses no mesmo pacote. Se não estiver no mesmo pacote, ele não poderá ser substituído.
Quando o método speak() da classe Pai é prototipado, ele não é apenas substituído por suas subclasses no mesmo pacote, mas também pode ser substituído por subclasses de pacotes diferentes.
Regras para substituir métodos:
1. A lista de parâmetros deve ser exatamente igual ao método substituído, caso contrário não pode ser chamada de reescrita, mas de sobrecarga.
2. O tipo de retorno deve ser sempre igual ao tipo de retorno do método substituído, caso contrário não pode ser chamado de substituição, mas de sobrecarga.
3. O limite do modificador de acesso deve ser maior que o modificador de acesso do método substituído (público>protegido>padrão>privado)
4. O método substituído não deve lançar uma nova exceção verificada ou uma exceção verificada que seja mais ampla do que a declaração do método substituído. Por exemplo:
Um método da classe pai declara uma exceção verificada IOException. Ao substituir este método, você não pode lançar exceções. Você só pode lançar exceções de subclasses de IOException e pode lançar exceções não verificadas.
E as regras sobrecarregadas:
1. Deve ter listas de parâmetros diferentes;
2. Você pode ter um tipo de retorno sem culpa, desde que a lista de parâmetros seja diferente;
3. Pode haver diferentes modificadores de acesso;
4. Diferentes exceções podem ser lançadas;
A diferença entre reescrever e sobrecarregar é:
A substituição do polimorfismo funciona. Ele pode reduzir bastante a quantidade de entrada de código ao chamar métodos sobrecarregados. O mesmo nome de método pode ter funções ou valores de retorno diferentes, desde que parâmetros diferentes sejam passados para ele.
Ao fazer bom uso da reescrita e da sobrecarga, você pode criar uma classe com uma estrutura clara e concisa. Pode-se dizer que a reescrita e a sobrecarga desempenham um papel extraordinário no processo de escrita do código.