Duvida Fundamentos

Ola Pessoal, estou tentando entender alguns códigos aqui:

public class Foo {
 public int a;
 public Foo() { a = 3; }
 public void addFive() { a += 5; }
 }
and:
 public class Bar extends Foo {
 public int a;
 public Bar() { a = 8; }
 public void addFive() { this.a +=5; }
 }
invoked with:
 Foo foo = new Bar();
 foo.addFive();
 System.out.println("Value: "+ foo.a);

Gostaria de entender o pq o resultado deste código é tres e não treze?

Simples, não existe polimorfismo para atributos.

So pra completar, quando vc fez:

O construtor de Foo foi chamado:

[code]Bar(){

super()
a = 8;
}[/code]

daí imprimiu 3, quando vc fez foo.a.

E lembre-se não existe polimorfismo para atributos.

realmente eu não havia captado direito isso…

Obrigado evertonsilvagomesjava

O problema aqui foi o sombreamento da varíavel A.

você declarou o atributo A nas duas instãncias. Quando vc invoca o método “addFive” o método invocado será da classe BAR, que irá adicionar 5 ao atributo A da sua instância.

Depois quando vc dá um “foo.a” o compilador encontrar um atributro com o nome a na classe foo e usa ele. Se a classe BAR não tivesse sobreado o atributo imprimiria a soma.