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