Conceitos básicos de herança e síntese
Herança: Uma nova classe pode ser construída com base em uma classe existente. A herdadora de classes existentes pode reutilizar métodos e domínios dessas classes. Nesta base, novos métodos e domínios podem ser adicionados para expandir as funções da classe.
Síntese: Criar o objeto original em uma nova classe é chamado de síntese. Dessa forma, você pode reutilizar o código existente sem alterar seu formulário.
1. Sintaxe herdada
A palavra -chave se estende indica que a nova classe é derivada de uma classe existente. Uma classe existente é chamada de classe pai ou classe base, e uma nova classe é chamada de subclasse ou classe derivada. Por exemplo:
Classe Student estende a pessoa {}O aluno da turma herda a pessoa. A aula de pessoa é chamada de classe de pai ou classe base, e a aula de estudante é chamada de subclasse ou classe derivada.
2. Síntese da síntese
A síntese é relativamente simples, que é criar uma classe existente em uma classe.
Classe Student {Dog Dog;}Estilo ascendente
1. Conceitos básicos
O papel da herança está na reutilização do código. Como a herança significa que todos os métodos da classe pai também podem ser usados em subclasses, as mensagens enviadas para a classe pai também podem ser enviadas para a classe derivada. Se houver um método Eat na aula de pessoa, haverá esse método na aula de estudante, o que significa que o objeto do aluno também é um tipo de pessoa.
classe Pessoa {public void Eat () {System.out.println ("Eat");} Void Static Show (Pessoa P) {P.Eat ();}} classe pública Student estende a pessoa {public static void main (string [] args) {Student s【Resultados da operação】:
comer
O método do show definido pessoalmente é usado para receber alças de pessoa, mas em ① ① recebe uma referência ao objeto do aluno. Isso ocorre porque o objeto do aluno também é um objeto de pessoa. No método Show, o identificador (referência ao objeto) passado pode ser um objeto de pessoa e um objeto de classe derivado de pessoa. Esse comportamento da conversão do aluno em alças de pessoa se torna um padrão ascendente.
2. Por que você precisa rastrear a forma?
Por que você deseja ignorar deliberadamente o tipo de objeto que o chama ao chamar Eat? Se você fizer o método do show simplesmente controlar o aluno, parece mais intuitivo e fácil de entender, mas isso fará com que todas as novas classes derivadas da classe pessoa implementem seu próprio método de show:
classe Valor {private int count = 1; Valor privado (int contagem) {this.count = count;} public static Value final v1 = novo valor (1), v2 = novo valor (2), v3 = novo valor (3);} pessoa Pessoa {public void Eat (value v) {System.out.println ("Pessoa ()"}; {System.out.println ("professor.eat ()");}} classe Student estende a pessoa {public void Eat (value v) {System.out.println ("Student.eat.); {t.eat (value.v1);} public static void show (pessoa p) {p.eat (value.v1);} public static void main (string [] args) {student s = new Student (); professor t = novo professor (); pessoa p = nova pessoa (); show (s); show (t); show (p);};Uma falha óbvia nessa abordagem é que é necessário definir métodos intimamente relacionados à classe derivada de cada classe, resultando em muitos código duplicados. Por outro lado, se você esquecer o sobrecarga do método, não relatará um erro. Os três métodos mostram no exemplo acima podem ser mesclados em um:
Public Static Void Show (Pessoa P) {P.Eat (value.v1);} Ligação dinâmica
Ao executar o (s) show (s), o resultado da saída é Student.eat (). Esse é realmente o resultado desejado, mas não parece ser executado na forma que esperávamos. Vamos dar uma olhada no método do show novamente:
Public Static Void Show (Pessoa P) {P.Eat (value.v1);}Recebe uma pessoa com uma pessoa. Ao apresentar programas (s), como sabe que a pessoa lida com um objeto de estudante em vez de um objeto de professor? O compilador não tem como saber, que envolve a questão de ligação a ser explicada a seguir.
1. Método chamado ligação
Conectar um método e o mesmo corpo de método é chamado de ligação. Se a ligação for realizada antes da execução, ela será chamada de "encadernação precoce". No exemplo acima, quando há apenas uma pessoa, o compilador não sabe qual método chamar. Java implementa um mecanismo de chamada de método que pode determinar o tipo de objeto durante a operação e depois chamar o método correspondente. Essa ligação com base no tipo de objeto é chamada de ligação dinâmica durante a operação. A menos que um método seja declarado final, todos os métodos em Java estão dinamicamente ligados.
Use uma imagem para representar a relação de herança da forma ascendente:
No código, está resumido como:
Shapes=newShape();
De acordo com o relacionamento de herança, é legal atribuir o identificador de objeto Circle criado a uma forma, porque o círculo pertence a uma forma.
Quando um dos métodos básicos de classe é chamado:
Shapes=newShape();
No momento, o círculo.draw () é chamado, o que se deve à ligação dinâmica.
classe Pessoa {void eat () {} void speak () {}} classe garoto estende a pessoa {void eat () {System.out.println ("boy.eat ()");} void speak () {System.out.println ("boy. boy.) (););}} {) {system.out.println (" boy.) {System.out.println ("girl.eat ()");}} public class Pessoas {public static Pessoa RandPerson () {switch ((int) (math.random () * 2)) {padrão: strat 4: retorna novo (); case 1: return new girl ();}}}}} estática: string major major (] string (] arg. i <p.Length;Para todas as classes derivadas da pessoa, a pessoa estabelece uma interface geral, e todas as classes derivadas têm dois comportamentos: comer e falar. A classe derivada substitui essas definições e redefine os dois comportamentos. Na classe principal, Randperson seleciona aleatoriamente o identificador do objeto de pessoa. ** O estilo de apelação ocorre na declaração de devolução. A declaração de retorno ** pega um manuseio de menino ou menina e a devolve como um tipo de pessoa. Neste momento, não sei que tipo é, só sei que é um identificador de objeto de pessoa. No método principal, chame o método Randperson para preencher a pessoa se opor à matriz, mas não conheça a situação específica. Quando o método Eat de cada elemento da matriz é chamado, a função da ligação dinâmica é executar o método redefinido do objeto.
No entanto, a ligação dinâmica é um pré -requisito, e o método de ligação deve existir na classe base, caso contrário, não será compilada e passada.
classe Pessoa {void eat () {System.out.println ("Person.eat ()");}} Classe Boy estende a pessoa {void eat () {System.out.println ("boy.eat ()");} void speak () {System.out.println ("boy.speak ()");}; {Pessoa p = novo menino ();Se nenhum método de substituição for definido na subclasse, o método da classe pai será chamado:
classe Pessoa {void Eat () {System.out.println ("Person.eat ()");}} Classe Boy estende a pessoa {} public class Pessoas {public static void main (string [] args) {pessoa p = novo menino (); p.eat ();}}}}}【Resultados da operação】:
Pessoa.Eat ()
2. Ligação de métodos estáticos
Adicione a palavra -chave estática aos métodos acima e transforme -os em métodos estáticos:
classe Pessoa {estático void eat () {System.out.println ("PERSON.EAT ()");} Void estático Speak () {System.out.println ("Person.speak ()");}} boy "garoto estende a pessoa {static void () {System.out.out.PriTln (" {System.out.println ("boy.speak ()");}} classe Girl estende a pessoa {static void Eat () {System.out.println ("girl.eat ()");} estático void Speak () {System.out.println ("Girl.speak ()");}}} ((int) (math.random () * 2)) {padrão: case 0: retornar new boy (); caso 1: retornar new girl ();}} public static void main (string [] args) {pessoa [] p = nova pessoa [4]; para (int i = 0; i <p. <P.Length; 【Resultados da operação】:
Pessoa.Eat ()
Pessoa.Eat ()
Pessoa.Eat ()
Pessoa.Eat ()
Resultados da observação: Para métodos estáticos, independentemente do objeto da subclasse a que a classe pai se refere, o método da classe pai é chamado.
Fórmula mnemônica
- Método estático: o método estático analisa a classe pai
-Métodos não estáticos: métodos não estáticos analisam subclasses
Resumir
O exposto acima é todo o conteúdo da interpretação detalhada deste artigo do conceito de herança de Java, e espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!