public class ploytest {

public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
}

class A {
String s = "[A]";
String getS() {
return s;
}
}

class B extends A{
String s = "";
String getS() {
return s;
}
}
The results:
[A]
[BB]
[BB]
[BB]
====================
[AA]
[BB]
[BB]
[BB]
其实结果不重要。一运行就知道。主要是原理。
将子类对象赋值给父类对象,所得到对象是这样的一个对象:
它是一个编译是为父类对象,但运行却是一个子类对象,具体特征如下.
1.被声明为父类对象
2.拥有父类属性
3.占用子类的内存空间
4.子类方法覆盖父类的方法时,此时对象调用的是子类的方法;否则,自动调用继承父类的方法.
5.我人认为这个对象既不是父类对象,也不是子类对象.当我们用到它的方法时,
我便把它看成子类对象;若用到它的属性时,我把它看成父类对象.
它是一个占用父类属性,而使用子类方法的对象.至于到底是什么对象,我认为还是得根据声明来,它应算是父类对象,但拥有子类方法.
这就是为什么第一个a.s为[A]的道理了。
(A)b是向上转型。(A)b.s相当于把"[AA]"赋值给b的父类对象。所以由上面可以看出。a.s为[AA]而其他的都同上
 
System.out.println(a.getS()); System.out.println(b.getS()); 再看这条语句: a.s = "[AA]"; //这是给对象a中s赋值,跟上转型.s一点关系都没有,不要被弄混,紧记这里面有3个对象,你就会明白的
 
看了前几个留言怎么也没看出来为什么"第一个a.s为[A]的道理". 依我看,这题有三个对象,希望提问者不要弄混. 这三个对象分别是a,b,b的上转型对象, a = b; //自这条语句以下,a便不是a对象,而是b的上转型对象 System.out.println(a.s); System.out.println(b.s);
关键还是a = b; 这句话,其相当于a =(A) b; 所以第一句打印的是[A] 而非[AA]