Questao - essa eh facil

o que acontece quando se compilar e executar esse codigo?

public class Teste{
 public static void main(String args[]){
  Y y = new Y();
  X x = y;
  System.out.println(x.toString());
 }
}
interface X{
 public void fazAlgo();
}
class Y implements X{
 public void fazAlgo(){
  System.out.println("fazAlgo");
 }
 public String toString(){
  return "Calss Y";
 }
}

Acho que dá erro na linha: X x = y;

Y é um X, mas o inverso, não.

vai imprimir o resultado do toString da interface.como ta implementado, vc so tem acesso aos metodos da classe que foram sobrescritos.toString não ta definido na interface, então quando vc coloca o objeto y dentro de x, vc so vai enxergar da classe y o metodo fazAlgo.
a chamada a toString vai usar o metodo do objeto x.
é isso??

[]'s

vai imprimir o resultado do toString da interface.como ta implementado, vc so tem acesso aos metodos da classe que foram sobrescritos.toString não ta definido na interface, então quando vc coloca o objeto y dentro de x, vc so vai enxergar da classe y o metodo fazAlgo.
a chamada a toString vai usar o metodo do objeto x.
é isso??

[]'s

Acho q vai imprirmir “Calss Y” pois métodos sobrescritos são definidos em run-time e não em compile-time.

Se o método toString fosse estático então seria o toString da interface.

Y y = new Y(); X x = y;

Pois x recebe a referência de y.

Por favor se falei besteira me corrijam.

o resultado sera “Calss Y” (era pra ser Class, hehehe, mas teve um erro de digitacao)

pq a interface garante para o compilador que os metodos que ela declara existirao no objeto instanciado, apesar do metodo toString() nao estar definido na interface, o codigo compila, pq o metodo toString() esta definido na classe Object, e como todas as classes extendem a Object entaum eh garantido que a o objeto tera o metodo toString()…

Vale a pena ressaltar que interfaces não estedem de Object.

sim, as interfaces nao estendem a classe Object, mas a classe que implementa a interface extende a Object, seja direta ou indiretamente

acho q vai imprimir “Calss Y”,

perfeitamente valido, pois y eh um objeto de uma classe q implementa
a interfaxe X. … lembrando q posso fazer

Collection coll = new ArrayList();
ja q ArrayList implementa Collection…

A Interface X, diz q devemos implementar o metodo

Entao qq outro metodo eh especifico de Y,

porem como toda classe extends de Object, ela
tera acesso a toString, e como a interface x eh um instancia de y,
logo ela ira buscar a implementacao feita em y…

como houve uma sobreescrita do metodo toString, ira ser feita o
que o toString em Y faz …, q eh imprimir “Calss Y”.