Exercicio de Roberto Rubinsten POO

5 respostas
G

Pessoal eu to com muita duvida a respeito desse exercicio:

interface I {int i = 0;}
class A implements I {int i = I.i + 1;}
class B extends A{
   int i = I.i + 2;

   static void printAll(A obj){
       System.out.print(obj.I);
   }


public static void main(String args[]){
  B b = new B();
  A a = new B();
  I i = new B();
 printAll(b);
 printAll(a);
 printAll(i);
 }

}

Qual será a tentativa de compilar e executar o seguinte programa?
Selecione uma alternativa.
A) Erro de Compilação
B) Imprime "000"
C) Imprime "222"
D) Imprime "210"
E) Nenhuma das alternativas

Minha resposta E, pois o metodo estatico não pode ser sobrescrito;

Resposta do Roberto Rubeinsten.

Este código não compilara pois o método printAll() recebe um argumento do tipo A. Nós declaramos a variavel I no metodo main e tentamos passa-lo ao metodo printAll(). Note que I não pode ser passada onde A é separada pois A esta implementando I. Uma referencia Interface/SuperClasse pode ser atribuida a uma referencia subclasse mas o oposto não é permitido. Portanto o compilador reclama que o método não é compativel.

Eu não entendi nd da explicação dele!!! Voces podem dar uma melhor?
e o que seria referencia Interface/superClasse?

Grato.

5 Respostas

W

Simples. Se A implementa I, você pode colocar um A numa referência do tipo I, mas não pode colocar um I numa referência do tipo A.

O código:

É perfeitamente válido, mas:

Não é válido! O método printAll espera um A, não um I. Apesar do A ser um I, outras classes podem ser um I também e elas não podem ter os mesmos métodos/variáveis que serão usadas para o método printAll, por isso a proibição. Um B pode ser colocado, por exemplo, pois ele é uma sub-classe de A, logo possuirá todos os métodos/variáveis disponíveis num A, obrigatoriamente. Note que, no exemplo, o objeto que a variável i está referenciado é de fato um A, mas o compilador não tem como saber isso durante sua compilação, por isso mesmo assim ocorre o erro.

Waocnek

S

Ao meu ver, antes mesmo de olhar todo esse codigo, eu diria que nao compila, tipo se I é a interface, então int i declarado dentro da interface é uma constante public static final que não pode ser alteradas nas classes que implementam I.
então, quando a class A faz

class A implements I { int i = I.i + 1; }

ela está tentando alterar uma constante final, isso da erro de compilação.
t+

ps.: se eu estiver enganado, minhas desculpas :stuck_out_tongue:

eltonk

Não pode alterar o valor nem referência de um static final… mas sobreescrever não tem problemas…

[]s

W

Não, ele está alterando o valor da variavel do tipo int denominada i da classe A, que NÃO É a variável (quase idêntica) presente na interface I. Confesso que quando vi esta questão, eu pensei que não iria compilar em razão desta linha:

Note que a classe A não possui nenhuma variável denominada I.

Waocnek

S

“Waocnek”:
Não, ele está alterando o valor da variavel do tipo int denominada i da classe A, que NÃO É a variável (quase idêntica) presente na interface I. Confesso que quando vi esta questão, eu pensei que não iria compilar em razão desta linha:

Note que a classe A não possui nenhuma variável denominada I.

Waocnek


E não compila mesmo. São 2 erros na questão.
Um, por não existir essa variável “I” e outro por causa do objeto esperado.

Embora eu ache que esse “I” tenha sido erro de digitação…

Criado 27 de dezembro de 2006
Ultima resposta 29 de dez. de 2006
Respostas 5
Participantes 5