Outra questão

Quem explica a saida?

class Test{

     public static void main(String [] args){
         Base b = new Subclass();
         System.out.println(b.x);
         System.out.println(b.method());
     }
}

class Base{
     int x = 2;
     int method(){
         return x;
     }

}

 class Subclass extends Base{
     int x = 3;
     int method(){
         return x;
     }
}

mmmm

eu acho qeu será:
2
2

pq?! bom pq apesar de estar instanciando uma classe Subclass, vc está atribuindo ela a um Base, que eh de onde Subclass extende, vc pode fazer isso, porém o que vai ser instanciado eh uma Base, e nao a Subclass…

não sei se ficou claro a explicaçao… mas as saídas acho que é isso ai…

está certo?!

Saida 2 e 3

3 porque o metodo int method() foi sobrescrito na subclasse.

(para jujo)
Cara, não é isso!
Tbm não sei explicar… :oops:

saída 2 e 3

quando você acessa uma variável, o que é levado em conta é o tipo do tempo de Compilação, como o tipo é “Base” então a saída é 2
quando você acessa um método, o que é levado em conta é o tipo do tempo de execução, como o tipo do tempo de execução é “SubClass” a saída é 3.Isto é válido quando o tipo do tempo de execução sobrescreve algum método do tipo do tempo de compilação.

Ex: Base b = new Sub();
b.m2();
sendo que m2 foi declarado apenas na classe Sub e nao em Base, ai daria um erro de compilação. mas se Base e Sub declaram este método m2() ai nao da erro e o método que é chamado em tempo de execução é o método m2() da Sub

É isso ai mesmo… nem tinha me ligado no Overriding =)

é verdade… por exemplo se a classe Subclass tivesse um outro método tipo escreve(), esse método não seria acessivel ao objeto criado… pq? pq o objeto é da classe Base, e nao Subclass… em teoria eh isso… alguem pode testar e postar o resultado na prática?!

eu não compilei, e nem rodei mas eu acho que eh isso mesmo!

Cya!

a saida vai ser 3 e 3, pq a classe eh uma referencia para Subclass, e nao para Base, portanto prevalece o x do Subclass