Conteúdo do artigo
Recall de herança de Java
Considere a seguinte classe:
classe CPARENTEsta classe tem duas propriedades: A e B. Em Java, as propriedades são chamadas de campos. Esta classe possui um método que adiciona dois números, que são os valores do campo. O nome da classe é CPARENT, com o C anterior, para a calculadora. O seguinte segmento de código no método Main (), Saídas 5:
Pai cparent = new cparent ();Considere a aula a seguir, que é a subclasse da classe acima (CPARENT):
classe cchild estende CPARENTObserve o uso da palavra -chave se estende. Esta classe tem o campo, C e o método, multiply (). A classe herda os campos, 'a' e b, e o método, add (). No entanto, se o valor do campo para 'a' ou b for usado para esse objeto instanciado atual (objeto filho), ele ainda precisa ser transferido um valor. Para esta classe, o valor de 'A' herdado é multiplicado pelo valor de campo da classe de C. O nome desta classe é Cchild, com o C anterior, para a calculadora. O segmento de código a seguir no método Main () se adapta a esta classe:
CCHILD CHILD = NEW CCHILL ();A saída é 8. Observe que, embora o campo 'A' tenha sido herdado, ele ainda precisava ser transferido um valor; Nesse caso, o mesmo valor.
Considere a aula a seguir, que é a subclasse da classe acima, Cchild:
classe CGrandChild estende CCHILDObserve o uso da palavra -chave se estende. Esta classe tem o campo, D e o método, divide (). A classe herda os membros, 'a', b e add () da classe CCHILD, que os herdou da classe CPARENT. Também herda os membros, C e Multiply () da classe CCHILD. No entanto, se o valor do campo para 'a' ou b ou c, das classes pais ou avós, for usado para esse objeto instanciado atual (objeto neto), ele ainda precisa ser reatribuído um valor. Para esta classe, o valor de 'A' herdado é dividido pelo valor de campo da classe de D. O nome desta classe é CGrandChild, com o C anterior, para a calculadora. O segmento de código a seguir no método Main () se adapta a esta classe:
CGRANDCHILD GCHILD = new CGrandChild ();A saída é 1. Observe que, embora o campo 'A' tenha sido herdado, ele ainda precisava ser transferido um valor; Nesse caso, o mesmo valor, 2.
Uso da Super Keyword
Campo e super
No programa acima, o valor para o campo, 'a' foi definido três vezes, uma vez para o objeto pai, uma vez para o objeto filho, e uma vez para o objeto neto. Para evitar essa redefinição a cada vez, o valor de 2 pode ser atribuído uma vez, na implementação da classe pai (definição) da seguinte maneira:
Isso resolve o problema de redefinir para cada objeto descendente. Nas classes descendentes, o campo 'a' é simplesmente referido (normalmente).
Para acessar o valor de um campo herdado, a super palavra -chave deve ser usada na implementação de interesse da classe descendente, como segue:
super.FieldNameO segmento de código a seguir mostra como o nome 'A' foi acessado, em uma nova implementação do CCHILL:
classe cchild estende CPARENTA classe, Cchild, agora tem seu próprio nome, P em vez de 'a'. E assim a declaração no método add (),
retornar a * c;é agora,
retornar p * c;De maneira semelhante, a implementação da classe, CGrandChild pode ter 'A' substituído por Q, como segue:
classe CGrandChild estende CCHILDNota: A herança ocorre em todas as classes descendentes. O método 'a' e o método add () são herdados na classe CCHILD e na aula de CGrandChild.
Método e super
Da mesma forma, um campo herdado pode ser acessado na implementação de uma classe descendente; Um método herdado também pode ser acessado em uma classe de descendente, usando a super -palavra -chave. A sintaxe é:
A implementação da classe CCHILD original pode ser modificada da seguinte forma:
classe cchild estende CPARENTObserve que o uso de super. O método ADD () herdado agora é visto como uma "soma" na implementação do CCHILD. O campo C e o método, multiply (), ainda estão lá. Um segmento de código para adição no método Main () que se adapta a esta classe CCHILD modificado é:
CCHILD CHILD = NEW CCHILL ();A saída é 5, assumindo que a classe pai foi modificada com:
int a = 2;Construtor e super
O construtor padrão, que não é implementado, é herdado em todas as classes descendentes e não precisa ser contabilizado na implementação dos descendentes e no método principal () (). No entanto, uma vez que uma classe pai tem um construtor personalizado, o restante de seus descendentes precisa ter um construtor semelhante. Considere a classe pai, com um construtor personalizado, como segue:
Os campos de 'A' e B são declarados sem atribuição. O construtor faz a tarefa. A classe infantil precisa ter o mesmo ou um construtor semelhante. A classe infantil correspondente para a hierarquia da calculadora original pode ser:
classe cchild estende CPARENTO construtor aqui é o mesmo que o dos pais. O corpo do construtor aqui só tem:
super (x, y);que apenas chama o construtor do pai, com os argumentos recebidos. "Super" aqui representa o construtor da classe pai. Este é outro uso de super. Não há modificação neste construtor infantil. A classe neto correspondente para a hierarquia da calculadora original pode ser:
classe CGrandChild estende CCHILDO construtor aqui é modificado. Tem os mesmos parâmetros x e y e um parâmetro extra, z. Z é atribuir o valor a D, o divisor. O corpo do construtor começa chamando o construtor da classe pai. Então o campo para o divisor é atribuído. O segmento de código a seguir no método Main () se adapta a esta classe:
CGRANDCHILD GCHILD = novo CGRANDCHILD (2, 3, 2);A saída para isso é 1.
Conclusão
Super procurará algo na classe de pai imediato. Se não o vir lá, ele procurará na aula dos avós. Se não o vir lá, procurará na classe bisneto; e assim por diante, até que veja ou não o veja. "Super" é geralmente usado na implementação de uma subclasse. É usado para campo, método e construtor. A superclasse direta é a classe pai. A classe avô é uma superclasse, mas não a superclasse direta. Em seguida, o leitor deve entender o uso de "super" com as aulas aninhadas - veja mais tarde.