//( Aluno estende Pessoa)
Pessoa p1 = new Aluno();
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
Pessoa p1 = new Aluno();
ou
Aluno a1 = new Aluno();
Mas você possui a vantagem ao utilizar uma classe mais genérica, caso em algum momento deseje alterar o tipo do Objeto referenciado
Pessoa p1 = new Aluno();//tipo Aluno
p1 = new Professor();//tipo Professor
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
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.
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.