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?
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.
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+
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.
[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…