向上轉型:父類引用指向子類對象,例如:Father f1 = new Son(); 當子類向上造型后的對象的方法中不存在子類的自己的特色的方法,只有父類的方法。而且子類對於父類進行重寫的方法。向上造型的對象的方法為重寫后新的方法。
在這個例子中 person類分別是man,weman,child 的父類
package DAY12; public class Demo { public static void main(String[] args) { Person p=new man();//向上轉型,編譯是Person對象,運行的時候是man類對象 聲明是父類,調用的方法卻只能是子類的 System.out.println(p.getClass());//class DAY12.man p.speak();// 我是man類 此時運行調用的是man類中的方法 } } class Person{ String name; int age; void speak() { System.out.println("我是Person類,是所有人的父類"); } } class man extends Person { void speak() { System.out.println("我是man類"); } void doThing() { System.out.println("我是man類,我可以做重活"); //這是子類的特有方法 } } class weman extends Person { void speak() { System.out.println("我是weman類"); } void doThing() { System.out.println("我是weman類,我可以做針線活"); //這是子類的特有方法 } } class child extends Person { void speak() { System.out.println("我是child類"); } void doThing() { System.out.println("我是child類,我可以玩游戲"); //這是子類的特有方法 } }
.向下造型:把指向子類對象的父類引用賦給子類引用,需要強制轉換,父類引用的對象轉換為子類類型。但是對於父類的引用對象一定要是由子類實例化的,也就是說向下造型的出現一般的情況都是和向上造型一起出現的。例如:
Father f1 = new Son();
Son s1 = (Son)f1;
但有運行出錯的情況:
Father f2 = new Father();
Son s2 = (Son)f2;//編譯無錯但運行會出現錯誤
在不確定父類引用是否指向子類對象時,可以用instanceof來判斷:
if(f3 instanceof Son){
Son s3 = (Son)f3;
}
也可以來個通俗點的:
A類是父類,B類是子類
A a = new A(); B b = new B();
A a1 = b; ---向上造型
B b1 =(B)a1;-----向下造型
B b2 = (A)a;--------這個就會報錯。ClassCastException
詳情可以看我的https://www.cnblogs.com/xuwangqi/p/11106535.html
作用:就好像是一個工廠可以生產多種品牌的電腦,那么我們讓工廠生產的時候如果是按品牌給工廠,那么我們要工廠開多個品牌的流水線生產,而不同品牌的電腦又可以統稱為電腦,這個時候我們給工廠就讓他生產電腦,等他生產出來的時候我們在貼上不同品牌的商標。這樣讓工廠的使用更方便了。
這個過程就是電腦作為不同品牌的父類,生產的時候先向上轉型成電腦,隨后在向下轉型轉換為個品牌的電腦。講的不好,請諒解。
---------------------
作者:Syaxis
來源:CSDN
原文:https://blog.csdn.net/syaxis/article/details/54585086
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!