Java4Android自學記錄(15):對象的轉型

1 目錄及資源索引

  Java4Android自學過程目錄及資源索引

2 向上轉型

2.1 基本概念

  首先了解一個概念,面向對象三個特徵:封裝、繼承、多態。

  什麼是向上轉型?
  向上轉型 —— 將子類的對象賦值給父類的引用;代碼示例:

Student s = new Student();	// 定義子類對象
Person p = s;				// 向上轉型

  參考老師課件,他們的內存分佈圖如下,可以看到都指向同一塊內存地址。
在這裏插入圖片描述
  向上轉型,老師舉了兩個生活中很常見的例子:

  1. 所有的筆記本電腦都是電腦。向上轉型,轉到父類;
  2. 比如張三這個對象,既可以是學生這個類,又可以是人這個類。

  編譯沒有問題,向上向下,父類在上,子類在下。抽象的在上,具體的在下

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:一個引用調用的是哪一個方法,取決於這個引用所指向的對象。

  老師指點:

  1. 要先學會語法,練熟,接下來才能去說怎麼用,用在哪。
  2. 向上轉型:生成一個子類對象,然後把子類對象賦值給父類的引用。不用生成子類對象也可以。例如:Person p = new Student(); 不需要 先生成子類。
  3. 向上轉型是不可能失敗的,是一定會成功的。只要繼承關係沒問題。

3 向下轉型

3.1 基本概念

  向下轉型——將父類的對象賦值給子類的引用。代碼如下:

Student s1 = new Student();		
Person p = s1;				// 向上轉型
Student s2 = (Student)p;		// 向下轉型

  內存分佈圖如下:
在這裏插入圖片描述
  向下轉型的前提就是,首先進行向上轉型。然後再轉換回來,後邊這個過程就叫做向下轉型,前邊必須要加上強制類型轉換。

  老師描述:先把一個對象向上轉型,再把這個對象強制轉換,後邊這個叫做向下轉型。(父類轉換爲子類)

  老師舉的例子:去超市買泡麪,泡麪是有包裝的,我們買回來之後必須要拆開才能吃,那既然這樣很麻煩的話,爲什麼廠家在生產的時候必須要加上包裝呢,不加包裝不是更好嗎?

  老師舉的例子很貼切,總結一下就是,先使用向上轉型,在使用向下轉型,是有用的,不過現在我們還沒體會到。

  需要注意的是:直接生成的父類對象是無法轉型成爲子類對象的。例如:

Person p = new Person();
Student s = (Student)p;

  上述代碼是不正確的,必須要現有子類轉換爲父類的向上轉型,然後接下來的才能叫做向下轉型。

  對象的向上轉型、向下轉型,是面向對象多態性的一種體現。

4 總結

  1. 向上向下轉型只是知道基本概念,區分的還不是很清楚;要說具體作用,那就更迷了。
  2. 老師舉的一些例子真的很貼近生活,通俗易懂;
  3. 向上轉型的兩個語法還不是很理解,成員方法是成員函數嗎?還不確定。如果方法是函數的話,那兩個語法之間不就相互矛盾了嗎。
  4. 後續深入理解後,在來理清楚思路吧。
發佈了92 篇原創文章 · 獲贊 84 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章