关于多态的一个有关问题

关于多态的一个问题。

public class PolymophyTest {

public static void main(String[] args) {
SuperA t = new SubB();
System.out.println("t.a = " + t.a); //  t.a = 10;
t.test();; //打印SubB.method()
}

}

class SuperA {
int a = 10;

public void test() {
System.out.println("SuperA.method()");
}
}

class SubB extends SuperA {

int a = 100;

public void test() {
System.out.println("SubB.method()");
}
}


这道题只知其然不知其所以然。当实现多态的时候 知道子类对象调用方法会调用子类自己的方法(test()),取变量取的是父类变量的值(a = 10).
不是说 SuperA t = new SubB(); 这时的t在内存中指向的是SubB, 可为什么会出现取方法和取变量时候的不一样咧?麻烦指点下小弟。
------解决方案--------------------
重写是对方法而言,调用方法时会调用运行时的对象的方法,而成员变量值是根据引用值(声明的类型的类里的变量值)
------解决方案--------------------
成员属性按声明类型为准,方法按实现对象为准。
------解决方案--------------------
这个其实就是一个向上转型的应用,这样的好处是既可以调用父类共有的特性,也可以调用子类更加强大的方法。
首先当执行这个语句的时候

 SuperA t = new SubB();
//因为Sub是子类,super是父类,所以父类会先实例化,然后再实例化子类。

A以为自己就是一个A,但是给他的却是个B。所以A不知道这些,他就以为他是自己,也就是A
所以调用的都是A自己有的方法和属性。但是事实上是残酷的,其实给他的实例是个B。当调用实例变量的时候,他会
调用他自己有的变量,(因为变量不能重写,A有变量的值,所以就会调用他自己的,即使你B里面没有也没关系,他只想调用
他自己的东西),当要调用方法的时候,发现自己的方法已经被覆盖了,所以只能调用子类的方法了。如果没有的话,还是会调用自己的方法的。
******:我感觉关键点就是,属性不能覆盖这一点上面了!!!
------解决方案--------------------
new SubB时,内存中会分配空间,因为继承的关系,即有SuperA.a也有SubB.a。当调用t.a的时候,由于t这个引用声明的是SuperA类型,所以会对应的找SuperA.a,所以结果就是10。
但是方法就不一样了,方法是存在代码区的,并在程序运行期间动态加载,此时会判断 t 真正的类型(而不是引用的类型),类型为SubB,所以结果是调用SubB.test。