Por que não posso declarar com Object e instanciar como minha classe?

4 respostas
xxmayconxx

Criei uma variável de referencia para object e instanciei como uma classe que eu criri, uma classe que só tinha atributos como idade nome e um método void sem nada demais.Esse objeto que criei não pode usar nada da minha classe, por que?Se eu qquiser usar tenho que declara com o tipo da minha classe.

4 Respostas

drigo.angelo

Você está confundindo variável, classe e objeto, três coisas bem diferentes, por exemplo:

Pessoa p = new Pessoa(); p.andar("150m"); p.conversar(); p.wait(); //etc..
No exemplo acima, você tem uma variável p, do tipo Pessoa, que “aponta” para um objeto Pessoa, que é uma instância da classe Pessoa que extende a classe Object. (se ficar muito confuso tente fazer um esqueminha em papel, garanto que ajuda :D)
Então, como você declarou a variável como sendo do tipo Pessoa, você (e a JVM) sabe que p pode andar, conversar, e tudo o mais que uma pessoa pode fazer, além de tudo que qualquer outro Object pode fazer…

Object o = new Pessoa(); o.wait(200); o.toString(); //etc.. o.andar() //Erro de compilação, o é do tipo Object, não tenho certeza se o que tem aí dentro é uma pessoa ou não..
Aqui ocorre o erro pois você tem uma variável o, do tipo Object, que “aponta” para um objeto Pessoa que é instância de uma classe que extende Object (no caso, Pessoa)

Ou seja, uma variável do tipo Object pode “apontar” pra qualquer objeto que extenda Object (no caso de java, qualquer objeto mesmo :stuck_out_tongue: ) mas você está “vendo” apenas a parte “Object” do objeto, e não da parte que foi extendida

Espero ter sido claro (ou ao menos “entendível” )

[]'s

Jeferson_Manetti

Então…

Object e a classe pai/mae de td em java… logo vc pode colocar qlq coisa dentro dela…
porem so consiguira utilizar metodos pertencentes a classe Object.

como Object e pai de td em java vc so consegue chamar metodos q tds tenham… tendeu?

imagina o seguinte vc tem a classe Transporte q possui o metodo acelera();

dai vc tem duas filhas de transporte Carro e Avião

a Carro possui o metodo acelerar(); (herdado de transporte) e o Avião tem o metodo acelerar(); (herdado de transporte) e tambem o metodo voar();

agora imagine se eu faço assim…

crio um Carro e coloco em Transporte…
dai tento chamar transporte.voar();

como o Carro vai voar??? ele não tem esse metodo… ele não é capaz de fazer isso… mesmo ele sendo um Transporte

então qnd vc faz isso so pode chamar os metodos q existe na classe Pai, logo seria correto fazer Transporte.acelera();

Com isso temos… qnd vc atribui sua classe a Object vc so pode chamar os metodos q existe em Object, oq siginifica q tds suas filhas terão os metodos e não havera riscos de dar alguma coisa errado… tipo fazer um carro voar so pq ele e um transporte… tendeu?

putz espero q vc entenda meu exemplo…

flw t+ abs

drigo.angelo

Pra poder utilizar os métodos da sua classe especializada você deve fazer um casting:

Object o = new Pessoa(); //o aponta para um objeto Pessoa, eu tenho certeza, mas a JVM não.. o.wait(100); //Posso usar a vontade os métodos da classe Object... //Quero utilizar os métodos da classe Pessoa, e agora? o = o instanceof Pessoa ? (Pessoa) o : o; //A linha acima é o mesmo que: if(o instanceof Pessoa) o = (Pessoa) o;

esmiralha

Maycon,

quando você declara o tipo de uma referência, você está restringindo o que pode ser usado a partir dessa referência. Os métodos que você poderá invocar são determinados pelo tipo declarado da referência. Ao declarar a variável como Object, você poderá invocar apenas métodos que estão declarados na classe Object. Lembre-se porém que você pode sobrescrever um método de Object na sua classe e será essa implementação do método que será invocada e não a implementação definida em Object.

Criado 25 de janeiro de 2011
Ultima resposta 25 de jan. de 2011
Respostas 4
Participantes 4