classA{publicvoidf(){
System.out.printf("AAAA\n");}}classBextendsA{publicvoidf(){
System.out.printf("BBBB\n");}}classCextendsB{publicvoidf(){
System.out.printf("CCCC\n");}}publicclassM{publicstaticvoidg(A aa){
aa.f();}publicstaticvoidmain(String[] args){
A aa =newA();
B bb =newB();
C cc =newC();g(aa);g(bb);g(cc);//這就是多態! 同樣的代碼做不同的事情//向後兼容}}
程序運行示例:
——————————————————————————————————
AAAA
BBBB
CCCC
——————————————————————————————————
classA{publicvoidf(){
System.out.printf("AAAA\n");}}classBextendsA{publicvoidf(){
System.out.printf("BBBB\n");}}publicclassM{publicstaticvoidmain(String[] args){
A aa =newA();
B bb =newB();// aa = bb;
aa =(A)bb;//單獨此行代碼不會影響bb的本身類型,這條語句本身是錯誤的//aa.f();//bb.f();}}
程序運行示例:
——————————————————————————————————
Exception in thread "main" java.lang.ClassCastException:classA cannot be cast to classB(A and B are in unnamed module of loader 'app')
at M.main(M.java:28)
——————————————————————————————————
程序運行示例:(三條註釋語句取消後,且刪除27行)
——————————————————————————————————
BBBB
——————————————————————————————————
classA{publicvoidf(){
System.out.printf("AAAA\n");}}classBextendsA{publicvoidf(){
System.out.printf("BBBB\n");}publicvoidg(){
System.out.printf("GGGG\n");}}publicclassM{publicstaticvoidmain(String[] args){
A aa =newA();
B bb =newB();
aa = bb;
aa.f();//OK 此時父類aa在調用子類的重寫函數
aa.g();//error 此時父類aa在調用子類的特有函數 //*********}}
程序運行示例:
——————————————————————————————————
M.java:34: 錯誤: 找不到符號
aa.g();//error 此時父類aa在調用子類的特有函數^
符號: 方法 g()
位置: 類型爲A的變量 aa
1 個錯誤
——————————————————————————————————
classA{}classBextendsA{}publicclassM{publicstaticvoidmain(String[] args){
A aa =newA();
B bb =newB();
bb =(B)aa;//16行 編譯沒有錯誤,但運行時出錯! 因爲aa指向的是父類的對象
A aa2 =newB();
bb =(B)aa2;//OK 因爲aa2本身指向的就是一個B類對象,// 所以可以進行強制轉化,注意與16行的區別,在Java中絕不可能直接把父類引用賦給子類引用的}}