Recentemente, tenho alguma experiência em atribuir objetos de subclasse a objetos de classe pai e gostaria de compartilhar isso com vocês. Mas meu nível é limitado, então, por favor, corrija-me e critique-me.
Mais perto de casa, aqui estão alguns pequenos exemplos, dê uma olhada.
Teste um
Classe pai:
Subclasse:
Resultado: este é o método print() da classe pai - o objeto neste momento é Subclass@126b249
Neste momento o objeto é Subclass@126b249
ilustrar:
Suclasse sup=new Subclasse();
Embora o objeto declarado seja um objeto de classe pai, o espaço de memória real pertence ao objeto da subclasse.
O método public void print() herdado da classe pai é chamado e a saída é a resolução de nome do objeto da subclasse.
Conclusão: O objeto declarado em tempo de compilação é um objeto de classe pai, mas em tempo de execução é um objeto de subclasse. Se a subclasse não substituir o método da classe pai, o objeto neste momento chama o método herdado da classe pai.
Teste 2
Classe pai:
Subclasse:
Resultado: este é o método print() da subclasse - neste momento o objeto é Subclass@126b249
Neste momento o objeto é Subclass@126b249
ilustrar:
Com base no exemplo anterior, reescrevi o método print() da classe pai. Neste momento, o método print() da subclasse foi chamado.
Conclusão: Com base na conclusão do exemplo anterior, cheguei a uma conclusão: neste momento, o objeto é de fato um objeto de subclasse durante a execução.
Então o objeto neste momento chama o método herdado da classe pai; caso contrário, o objeto neste momento chama o método da subclasse;
Pergunta: Podemos tirar a seguinte conclusão do teste acima: atribuir o objeto da subclasse ao objeto da classe pai (ou seja, Supclass sup=new Subclass()),
O que obtemos é um objeto de subclasse, ou seja, sup é um objeto de subclasse??????
Teste três
Classe pai:
Subclasse:
Resultado: Atributos neste momento: atributos da classe pai
Nota: Com base no primeiro teste, adicionei um atributo className à classe pai e substituí esse atributo na subclasse.
Mas quando eu mostro as propriedades do objeto neste momento, elas são as propriedades da classe pai.
Conclusão: Ao atribuir objetos de subclasse a objetos de classe pai, os métodos e propriedades são muito diferentes de nosso relacionamento de herança ortodoxo.
pergunta:
O objeto neste momento é um objeto de subclasse ou um objeto de classe pai?
Comece a especular:
Há alguns pontos que preciso abordar antes de especular:
1. Quando criamos um novo objeto de subclasse, o construtor do objeto da classe pai também é executado ao mesmo tempo, ou seja, algumas informações necessárias da classe pai e do objeto da subclasse ocupam o mesmo espaço de memória.
Quando substituímos o método, podemos usar o superobjeto para nos referir à classe pai.
2. Os objetos em Java não são completamente orientados a objetos, ou seja, os atributos e métodos de um objeto não são encapsulados no objeto ao mesmo tempo.
Mas o objeto tem seus próprios atributos, mas o método refere-se ao método da classe. Pode-se dizer que ele encapsula as referências dos atributos e métodos da classe no objeto.
Portanto, o método chamado pelo objeto não é o seu próprio método, mas o método da classe. Quanto ao motivo pelo qual Java faz isso, não sei.
3. Quando o objeto é carregado na memória, a classe é carregada primeiro na memória e depois a classe deve permanecer na memória. Não sei quando a classe desaparece da memória.
Acho que Java deve ter seu próprio mecanismo de reciclagem, assim como a reciclagem de objetos.
4. Compilar e executar são coisas completamente diferentes. As principais coisas que você faz durante a compilação são declarar o tipo do objeto, atribuir atributos, verificar erros de sintaxe, etc.
O que o tempo de execução faz é carregar objetos na memória (geralmente usando new, reflexão também é comumente usada), executar funções de execução de código, etc.
5. Se você, leitor, e eu não concordamos um com o outro sobre esses pontos, ou se não tivermos o mesmo entendimento sobre esses pontos, você pensará que estou falando bobagem.
Talvez você pense que minha pontuação de especialista é muito baixa e, portanto, minha credibilidade é baixa. Mas o que quero dizer é que não existe uma ordem de aprendizado e quem domina primeiro vem primeiro.
Haha, estou pronto para transformar meus pontos de especialista em valores negativos, chega de bobagens, vamos continuar.
Especulação:
1. Quando compilamos Supclass sup=new Subclass(), o objeto sup é declarado como a classe Supclass, portanto, os atributos do objeto sup são os valores dos atributos do objeto da classe pai.
3. Continuando a partir da etapa 2, se substituirmos o método da classe pai, uma vez que o espaço de memória do objeto sup é o espaço de memória do objeto da subclasse, o método da subclasse public void print() foi carregado na memória.
Então, o que chamamos é o método public void print() da subclasse; se você precisar chamar o método substituído da classe pai, precisará usar super.
Esta passagem pode explicar o teste 2.
Resumir:
As seguintes são opiniões puramente pessoais:
Atribua o objeto da subclasse ao objeto da classe pai e o objeto resultante será um objeto como este:
Ele é compilado como um objeto de classe pai, mas é executado como um objeto de subclasse. As características específicas são as seguintes.
1. Declarado como um objeto de classe pai 2. Possui atributos de classe pai 3. Ocupa o espaço de memória da subclasse 4. Quando o método da subclasse substitui o método da classe pai, o objeto chama o método da subclasse neste momento, caso contrário, a herança é automaticamente; chamados Métodos da classe pai.
5. Acho que este objeto não é um objeto de classe pai nem um objeto de subclasse. Quando usamos seus métodos,
Eu o trato como um objeto de subclasse; se uso suas propriedades, eu o trato como um objeto de classe pai.
É um objeto que ocupa os atributos da classe pai e usa os métodos da subclasse. Quanto ao tipo de objeto, acho que depende da declaração. Deve ser considerado um objeto da classe pai, mas tem subclasse. métodos.
Pense nisso:
Com base no teste 3, como extraímos os atributos da subclasse? ? ? ? ?