1 目錄及資源索引
2 向上轉型
2.1 基本概念
首先了解一個概念,面向對象三個特徵:封裝、繼承、多態。
什麼是向上轉型?
向上轉型 —— 將子類的對象賦值給父類的引用;代碼示例:
Student s = new Student(); // 定義子類對象
Person p = s; // 向上轉型
參考老師課件,他們的內存分佈圖如下,可以看到都指向同一塊內存地址。
向上轉型,老師舉了兩個生活中很常見的例子:
- 所有的筆記本電腦都是電腦。向上轉型,轉到父類;
- 比如張三這個對象,既可以是學生這個類,又可以是人這個類。
編譯沒有問題,向上向下,父類在上,子類在下。抽象的在上,具體的在下
2.2 代碼示例
直接用代碼來演示,新建一個父類 Person,代碼如下:
class Person
{
String name;
int age;
void introduce()
{
System.out.println("我的姓名是" + name + ",我的年齡是" + age);
}
}
新建一個子類 Student,代碼如下:
class Student extends Person
{
String address;
void introduce()
{
super.introduce();
System.out.println("我的家在" + address);
}
void study()
{
System.out.println("我正在學習");
}
}
新建一個類,用來寫主函數,代碼如下:
class Test
{
public static void main(String args[])
{
Student stu = new Student();
Person per = stu; // 向上轉型
per.name = "張三";
per.age = 20;
per.address = "北京";
}
}
上述代碼編譯結果如下:
可以看到出錯了,提示找不到符號,分析一下原因,發現變量 per ,類型爲 Person,而 Person類型中沒有這個 address 這個變量。
語法1:一個引用 能夠調用哪些成員(變量和函數),取決於這個引用的類型。
嘗試用父類對象 per 調用子類成員函數 study,發現編譯也是會報錯誤的。
2.3 問題1
父類和子類都有這個函數,如果是向上轉型,到底調用的是哪個裏邊的這個函數?
修改主函數中代碼,如下:
class Test
{
public static void main(String args[])
{
Student stu = new Student();
Person per = stu; // 向上轉型
per.name = "張三";
per.age = 20;
per.introduce();
}
}
編譯後的運行結果如下:
由上圖運行結果可以看到,運行的應該是子類的函數。至於爲什麼是 NULL,因爲沒有給他賦初值,就是 NULL了。
語法2:一個引用調用的是哪一個方法,取決於這個引用所指向的對象。
老師指點:
- 要先學會語法,練熟,接下來才能去說怎麼用,用在哪。
- 向上轉型:生成一個子類對象,然後把子類對象賦值給父類的引用。不用生成子類對象也可以。例如:Person p = new Student(); 不需要 先生成子類。
- 向上轉型是不可能失敗的,是一定會成功的。只要繼承關係沒問題。
3 向下轉型
3.1 基本概念
向下轉型——將父類的對象賦值給子類的引用。代碼如下:
Student s1 = new Student();
Person p = s1; // 向上轉型
Student s2 = (Student)p; // 向下轉型
內存分佈圖如下:
向下轉型的前提就是,首先進行向上轉型。然後再轉換回來,後邊這個過程就叫做向下轉型,前邊必須要加上強制類型轉換。
老師描述:先把一個對象向上轉型,再把這個對象強制轉換,後邊這個叫做向下轉型。(父類轉換爲子類)
老師舉的例子:去超市買泡麪,泡麪是有包裝的,我們買回來之後必須要拆開才能吃,那既然這樣很麻煩的話,爲什麼廠家在生產的時候必須要加上包裝呢,不加包裝不是更好嗎?
老師舉的例子很貼切,總結一下就是,先使用向上轉型,在使用向下轉型,是有用的,不過現在我們還沒體會到。
需要注意的是:直接生成的父類對象是無法轉型成爲子類對象的。例如:
Person p = new Person();
Student s = (Student)p;
上述代碼是不正確的,必須要現有子類轉換爲父類的向上轉型,然後接下來的才能叫做向下轉型。
對象的向上轉型、向下轉型,是面向對象多態性的一種體現。
4 總結
- 向上向下轉型只是知道基本概念,區分的還不是很清楚;要說具體作用,那就更迷了。
- 老師舉的一些例子真的很貼近生活,通俗易懂;
- 向上轉型的兩個語法還不是很理解,成員方法是成員函數嗎?還不確定。如果方法是函數的話,那兩個語法之間不就相互矛盾了嗎。
- 後續深入理解後,在來理清楚思路吧。