Exercicio de Roberto Rubinsten POO

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.

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

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:

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

[]s

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

[quote=“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[/quote]
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…