Como interpretar de maneira bem descritiva esse trecho?
Porque estou com uma duvida quando instancio um objeto de uma classe com um tipo de outra.
Esse exemplo, eu tenho uma variável de referencia a p1, do tipo Pessoa, e se refere a um Aluno,
mas porque eu não posso acessar os atributos que somente estão na classe Aluno e não na classe Professor, se ele se refere a um Aluno?
Olá amigo, Você esta utilizando herança, assim os métodos da classe pai, a classe filha irá possui, como você já fez a herança( Aluno estende Pessoa), fica a seu critério utilizar
Pessoap1=newAluno();ouAlunoa1=newAluno();
Mas você possui a vantagem ao utilizar uma classe mais genérica, caso em algum momento deseje alterar o tipo do Objeto referenciado
Pessoap1=newAluno();//tipo Alunop1=newProfessor();//tipo Professor
O new indica o tipo do objeto utilizado.
allanassis
Mas se eu utilizar
p1.atributoA=algo; //(atributoA é um atributo único do Aluno)
não funciona, por ser do tipo pessoa.
,pu seja só posso utilizar os atributos do Aluno se o tipo da variável de referencia também for do tipo Aluno, mesmo que esteja instanciando um objeto da classe Aluno. Isso que não entendo. Você diz que fica ao meu critério porém tem diferença, em um caso compila
staroski
Justamente pelo fato de a variável ser do tipo Pessoa, o compilador não sabe o que está sendo referenciado nas variáveis, isso quem saberá é a máquina virtual em tempo de execução.
Para você acessar os membros de Aluno, deveria ter declarado a variável como sendo do tipo Aluno.
Mas pode ficar tranquilo que a variável p1 realmente está referenciando um objeto do tipo Aluno, tanto que se você fizer um cast para Aluno, vai funcionar.
allanassis
Então esse código deveria funcionar correto? (matricula é um atributo único do Aluno).
Não, da forma como você fez o cast é inútil, você só consegue acessar atributos do tipo específico, se a variável do objeto manipulado é do tipo específico.