Digite a conversão de objetos polimórficos Java <br /> A conversão do tipo de objeto mencionada aqui se refere a um objeto com um relacionamento de herança, não um objeto de qualquer tipo. Ao lançar um objeto que não possui um relacionamento de herança, o tempo de execução do Java lança uma exceção java.lang.classCastException.
Na cadeia de herança, chamamos a conversão da subclasse para a classe pai de "transformação ascendente" e a conversão da classe pai para a classe infantil "Transformação para baixo".
Muitas vezes, definimos variáveis como o tipo de classe pai, mas nos referimos ao objeto da classe infantil. Quando o programa é executado, ele usa a ligação dinâmica para realizar a chamada para os métodos da subclasse, ou seja, polimorfismo.
No entanto, às vezes, para concluir as funções que algumas classes pais não possuem, precisamos converter os objetos de subclasse transformados ascendentes em subclasses e chamar os métodos de subclasse, que são para baixo.
Nota: O objeto da classe pai não pode ser fundido diretamente para um tipo de subclasse, e o objeto da subclasse após a transformação ascendente só pode ser convertido em um tipo de subclasse novamente. Em outras palavras, os objetos da subclasse devem ser transformados para cima antes que possam se transformar para baixo. Por favor, veja o seguinte código:
classe pública demonstração {public static void main (string args []) {superclass superobj = new superclass (); Objeto pai.Remova o comentário na linha 7 e uma exceção será lançada em tempo de execução, mas a compilação pode ser passada.
Como existem riscos na transição para baixo, ao receber uma referência à classe pai, não se esqueça de usar o operador da instância para determinar se o objeto é a subclasse que você deseja.
classe pública demonstração {public static void main (string args []) {superclass superobj = new superclass (); = SONCLASS) superobj; ) superobj; Resultados em execução:
① Não é possível converter
Resumo: A conversão de tipo de um objeto é verificada quando o programa é executado.
Polimorfismo Java e ligação dinâmica <Br /> em Java, as variáveis da classe pai podem se referir a instâncias da classe pai ou instâncias da classe infantil.
Por favor, leia um pedaço de código primeiro:
classe pública Demonstração {public estático Main (String [] Args) {Animal Obj = New Animal (); .cry (); Call Of Cat public void Cry () {System.out.println ("Meow ~"); }} Resultados em execução:
Eu não sei como chamar mieow ~ lã ~
O código acima define três classes, ou seja, animais, gatos e cães. A variável OBJ possui animais do tipo, que pode apontar para instâncias de classe de animais, bem como instâncias de classes de gatos e cães, o que está correto. Ou seja, as variáveis da classe pai podem se referir a instâncias da classe pai ou instâncias da classe infantil. Observe que o contrário está errado, porque todos os gatos são animais, mas nem todos os animais são gatos.
Pode -se ver que o OBJ pode ser um humano, um gato ou um cachorro. O polimorfismo refere -se a uma coisa com formas ou formas diferentes.
Por exemplo, "humanos" também têm muitas expressões ou implementações diferentes. , professor ou médico na próxima vida.
Existem três condições necessárias para que o polimorfismo exista: herança, reescrita e variáveis dos pais se referem a objetos de subclasse.
Ao chamar um método usando um método polimórfico:
Verifique se o método está presente na classe pai.
Se a subclasse substituir o método, o método da subclasse será chamado, caso contrário, o método da classe pai será chamado.
A partir do exemplo acima, podemos ver que uma vantagem do polimorfismo é que, quando há muitas subclasses, não há necessidade de definir várias variáveis. Por favor, veja o exemplo a seguir:
Public class Demo {public static void main (String [] args) {// Com a ajuda do polimorfismo, o proprietário pode alimentar muitos animais mestre ma = novo mestre (); ); ) {System.out.println ("Eu sou um pequeno animal, comendo" + f.getfood ()); Um pequeno gato está comendo " + f.getfood ());}} classe cão estende Animal {public void Eat (Food f) {System.out.println (" Eu sou um cachorro, comendo " + f. Getfood ()) ; String getfood () {return "Bone"; Resultados em execução:
Eu sou um animal pequeno, comendo coisas, sou um pequeno gato, comendo peixe, sou um cachorro, comendo ossos
O método de alimentação da classe mestre possui dois parâmetros, a saber, o tipo de animal e o tipo de alimento. animais diferentes.
Ligação dinâmica
Para entender a natureza do polimorfismo, vamos falar sobre o processo detalhado dos métodos de chamada Java abaixo.
1) O compilador verifica o tipo de declaração e o nome do método do objeto.
Suponha que o obj.func (param) seja chamado, OBJ é um objeto da classe CAT. Deve -se notar que pode haver vários métodos com nomes com funcas, mas parâmetros diferentes. Por exemplo, os métodos func (int) e func (string) podem existir. O compilador listará todos os métodos denominados Func na classe CAT e métodos acessa o atributo público e nomeado Func em seu animal de classe pai.
Dessa forma, o compilador obtém uma lista de todos os métodos candidatos possíveis a serem chamados.
2) Em seguida, o editor verificará a assinatura do parâmetro fornecida ao chamar o método.
Se houver um método em todos os métodos chamados Func que correspondam exatamente à assinatura de parâmetro fornecida, selecione este método. Esse processo é chamado de resolução de sobrecarga. Por exemplo, se o FUNC ("Hello") for chamado, o compilador selecionará Func (String) em vez de func (int). Devido à existência de conversão do tipo automático, por exemplo, o INT pode ser convertido para o dobro. Os métodos finais ou múltiplos correspondem a ele e compilam o erro.
Dessa forma, o compilador obtém o nome do método e a assinatura de parâmetros que precisam ser chamados.
3) Se o modificador de método for privado, estático, final (estático e final será explicado posteriormente) ou um construtor, o compilador poderá saber exatamente qual método deve ser chamado. .
Da mesma forma, o método chamado depende do tipo real do objeto e implementa a ligação dinâmica em tempo de execução. Por exemplo, ao chamar Func ("Hello), o editor usará a ligação dinâmica para gerar uma diretiva que chama func (string).
4) Quando o programa é executado e usa a ligação dinâmica para chamar o método, a JVM definitivamente chamará o método da classe que é mais adequado para o tipo real do objeto referenciado pelo OBJ. Assumimos que o tipo real da OBJ é o CAT, que é uma subclasse de animal, e é chamado se o func (string) for definido no CAT; caso contrário, ele será pesquisado na classe de animais e em sua classe pai.
Cada chamada para o método requer pesquisa, o que é bastante caro. Dessa forma, quando o método é realmente chamado, a máquina virtual só pode procurar esta tabela. No exemplo acima, a JVM pesquisa a tabela de métodos da classe CAT para encontrar um método que corresponda à chamada para func ("Hello"). Este método pode ser cat.func (string) ou animal.func (string). Observe que se o Super.func ("Hello") for chamado, o compilador pesquisará a tabela de métodos da classe pai.
Supondo que a classe de animais contenha três métodos: Cry (), GetName () e Getage (), sua tabela de métodos é a seguinte:
Cry () -> Animal.Cry ()
getName () -> animal.getName ()
getage () -> animal.getage ()
De fato, o Animal também possui um objeto de classe pai padrão (que será explicado posteriormente), que herdará o método do objeto; portanto, os métodos listados acima não estão completos.
Supondo que a classe CAT substitua o método Cry () na classe de animais e adiciona um novo método climbtree (), sua lista de parâmetros é:
Cry () -> cat.cry ()
getName () -> animal.getName ()
getage () -> animal.getage ()
climbtree () -> cat.climbtree ()
Ao executar, o processo de chamar o método obj.cry () é o seguinte:
A JVM primeiro acessa a tabela de métodos do tipo real de OBJ, que pode ser a tabela de métodos da classe de animais ou a tabela de métodos da classe CAT e suas subclasses.
A JVM procura um método que corresponda ao CRY () na tabela de métodos e, depois de encontrá -lo, você saberá a qual classe pertence.
A JVM chama esse método.