Confusão com objeto

10 respostas
diguix

Olha eu aki.
Galera to com uma dúvida meio boba,não estou entendendo a que o objeto está sendo referenciado. vejam só:

Vector s=new Stack();

quando uso : System.out.print(s.getClass().getName());
a jvm me diz que esse é inicializado pela classe Stack, mas quando chamo o
método pop(), da classe Stack ele me diz que não encontrou em Vector.

cannot find symbol
symbol  : method pop()
location: class java.util.Vector
        Object o3=s.pop();

Alguem pode me dar uma luz em relação a isso??

Abs’[]

10 Respostas

nbluis

Claro, voce esta instanciando um objeto Vector e apontando para um Stack.
Ao obter a referencia ele é um stack.
mas o teu Vector não tem o metodo pop, por isso não pode chamalo.

exemplo.
o que aconteceria se eu fizesse isto?

Vector d = new Stack();
d = new Vector();

Lógicamente ele não é mais um stack, como posso chamar o método pop?

ou seja para poder invocar o método pop só se ele for um objeto stack na instancia ou filho dela.
Assim:

Stack d = new Stack();

Até…

L

nbluis:
Claro, voce esta instanciando um objeto Vector e apontando para um Stack.
Ao obter a referencia ele é um stack.
mas o teu Vector não tem o metodo pop, por isso não pode chamalo.

exemplo.
o que aconteceria se eu fizesse isto?

Vector d = new Stack();
d = new Vector();

Lógicamente ele não é mais um stack, como posso chamar o método pop?

ou seja para poder invocar o método pop só se ele for um objeto stack na instancia ou filho dela.
Assim:

Stack d = new Stack();

Até…


Isso é Polimorfismo. Agora vc pode contar para os amigos numa roda de chopp.
Bem vindo a orientação a objetos! :lol: :lol: :lol: :lol:
Em Tempo: Polimorfismo é uma prática de OO muito usada em Design Patterns, é bom reforçar a idéia.
[]'s

nbluis

Bem lembrado… a gente explica explica explica e não ensina o que importa…

Valeu…

Mantu

diguix, vale a pena você dar uma lida nesse material aqui:
http://www.javaranch.com/campfire/StoryCups.jsp
Além de didático, é bem divertido.

ViniGodoy

O princípio é o seguinte, todo Stack é um Vector, mas nem todo Vector é um Stack. Isso porque Vector é uma superclasse de Stack. Quando você faz:

Vector d = new Stack();

Você está dizendo ao java, o Vector “d” é aquele Stack ali. O java entende isso, mas continua encarando o Stack como um Vector.

O método pop vai ficar “escondido”, afinal, vocë disse para o java que para você só interessa as propriedades de Vector dele.

Você tem duas alternativas:

  1. Alterar a declaração para: Stack d = new Stack();
  2. Fazer um cast, indicando ao Java que você sabe que o Vector em questão é um Stack (isso nem sempre pode ser verdade). Se isso não for verdade, você rebecerá um ClassCastException. Você também pode se prevenir tetando o tipo da classe com um if. Exemplos:
Vector s = new Stack();
Vector v = new Vector();
Object a = ((Stack)s).pop(); //Ok.
Object b = ((Stack)v).pop(); //Gera um ClassCastException

Opção com um if (muito comum em métodos)

public Object popIfStack(Vector s) {
    if (s instanceof Stack) //Testamos se o Vector é mesmo um Stack
      return ((Stack)s).pop(); //Somente se for fazemos o cast.

    return null;
}
sergiotaborda

ViniGodoy:
O princípio é o seguinte, todo Vector é um Stack, mas nem todo Stack é um Vector. Isso porque Vector é uma superclasse de Stack.

Não será que é ao contrário? Veja bem, se Stack herda de Vector , Todos os Stack são tb Vector. Mas nenhum outro Vector é Stack excepto o poprio Stack.

Se todo o Vector fosse Stack, como vc afirma então se: ClassX extends Vector , ClassX é um Vector e pelo que vc disse ClassX seria um Stack. Isso é falso. ClassX não tem o método pop(), por exemplo.

diguix

Pow galera vlw… os fusíveis ja começaram a trabalhar rsrsr…
vou dar uma olhada melhor e estudar um pouco mais … !!

Abs’[]

L

sergiotaborda:
ViniGodoy:
O princípio é o seguinte, todo Vector é um Stack, mas nem todo Stack é um Vector. Isso porque Vector é uma superclasse de Stack.

Não será que é ao contrário? Veja bem, se Stack herda de Vector , Todos os Stack são tb Vector. Mas nenhum outro Vector é Stack excepto o poprio Stack.

Se todo o Vector fosse Stack, como vc afirma então se: ClassX extends Vector , ClassX é um Vector e pelo que vc disse ClassX seria um Stack. Isso é falso. ClassX não tem o método pop(), por exemplo.


Sim, seu conceito está certo. É isso mesmo, não prestei atenção .

Se ClasseX extends Vector e
Stack extend Vector

Você pode:

Vector classeX = new ClasseX();

Vector stack = new Stack();

Se você fizer:

classeX = stack;

classeX vira referência de Stack então

Stack classeY = (Stack)classeX;

Se fizer isso vai dar erro:

ClasseX classeZ = (ClasseX)classeX; // erro de cast.

Compreenda variáveis como referência ao endereço de memória do objeto, fica mais fácil entender

[]'s
ViniGodoy

sergiotaborda:
ViniGodoy:
O princípio é o seguinte, todo Vector é um Stack, mas nem todo Stack é um Vector. Isso porque Vector é uma superclasse de Stack.

Não será que é ao contrário? Veja bem, se Stack herda de Vector , Todos os Stack são tb Vector. Mas nenhum outro Vector é Stack excepto o poprio Stack.

Se todo o Vector fosse Stack, como vc afirma então se: ClassX extends Vector , ClassX é um Vector e pelo que vc disse ClassX seria um Stack. Isso é falso. ClassX não tem o método pop(), por exemplo.

Ops, era ao contrário mesmo, foi um acidente, desculpem. Já tá corrigido no post original. :oops:

danieldestro

Na verdade está instanciando um Stack e referenciando numa variável do tipo Vector. Então você só pode usar os métodos definidos na classe Vector ou superclasses.

Criado 27 de fevereiro de 2007
Ultima resposta 27 de fev. de 2007
Respostas 10
Participantes 7