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]