Ayuda con Polimorfismo

public class A {
int i = 10;
public void printValue() {
System.out.println("Value-A");
}

}

public class B extends A{
int i = 12;
public void printValue() {
System.out.print("Value-B");
}
}

public class Test{

public static void main(String argv[]){

A a = new B();
a.printValue();
System.out.println(a.i);

}
}

Señores al final esto pinta Value-b 10

pero porque ??
entiendo porque pinta value-B por lo de polimorfismo, pero porque no pinta tambien el 12 de la clase b ??
Esto quiere decir que en los caso donde hacemos A a = new B () accede a los metodos de la clase hijo pero a los argumentos de a clase padre ???

Haber quien me puede orientar gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Consejo: Siempre DEBES poner

Consejo: Siempre DEBES poner tu codigo entre <code> y </code>

Ok, todo claro, tu estas manejando un objeto de tipo A y estas heredando la funcionalidad de B cuando haces el DownCast pero las propiedades de A siguen siendo las de A...

Para tener acceso directamente a laspropiedades de B, tendras que usar el objeto B

B b = (B)a;

de esta manera cuando hagas println(b.i) tendras el valor de la propiedad i de la clase B

Imagen de ezamudio

Sobreescritura

Se puede hacer sobreescritura (override) de métodos, pero no de variables de instancia. Si modificas tu código para que salga así:

 A a = new B();
 B b = new B();
 a.printValue();
System.out.println();
 System.out.println(a.i);
 b.printValue();
System.out.println();
 System.out.println(b.i);
 System.out.println(((A)b).i);

Eso te imprime

Value-B
10
Value-B
12
10

Muchas Grax

Es la pregunta de un examen de simulacion de java
jejeje
pero si me confundio grax

Claro, ahi la bronca es si

Claro, ahi la bronca es si @ramiro.rosales quiere acceder directamente al metodo de A aunqe se haya sobreescrito en B, ejemplo, si se pudiera hacer esto segun yo seria algo asi:

a.super.printValue();

donde en quiero decir que del objeto a quiero traer la clase padre y de él ejecutar el metodo printValue() ... no pos no es valido eso (directamente)!