Java4Android自學記錄(14):函數的複寫

1 目錄及資源索引

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

2 複寫

  先看如下兩段代碼,首先是父類 Person 代碼如下:

class Person
{
	String name;
	int age;

	void introduce()
	{
		System.out.println("我的姓名是" + name + ", 我的年齡是" + age);
	}
}

  在定義一個子類 Student ,繼承 Person 父類,代碼如下:

class Student extends Person
{
	String address;

	void introduce()
	{
		System.out.println("我的姓名是" + name + ", 我的年齡是" + age);
		System.out.println("我的家在" + address);
	}
}

  分析上邊兩個類中的同名函數,基本一樣,只是方法體不太一樣,他們之間的關係叫複寫,也叫覆蓋,重寫。
  複寫 Java 中英文名字爲 override ,特徵如下:

  1. 在具有父子關係的兩個類當中
  2. 父類和子類各有一個函數,這兩個函數的定義(返回值類型、函數名和參數列表)完全相同。

  下邊可以在定義一個主函數,調用上述子類,測試一下,代碼如下:

class Test
{
	public static void main(String args[])
	{
		Student stu = new Student();
		stu.name = "張三";
		stu.age = 20;
		stu.address = "北京";
		
		stu.introduce();
	}
}

  編譯測試上述代碼,第一次編譯測試的時候碰到了亂碼,放上來看大家能不能看出來問題
在這裏插入圖片描述
  然後老師又交了一種新的編譯方法,就是使用通配符 “*” ,具體如下:

javac *.java -encoding UTF-8

  然後又嘗試使用此種方法,發現編譯出來的運行結果是正常的,截圖如下:
在這裏插入圖片描述
  編譯全部 java 文件,且使用字符集UTF-8,結果正確,之前的方法爲什麼錯誤呢?原來是編譯最後一個文件時,沒有加上使用的字符集編碼,導致異常。

  接下來,在主函數中,在定義一個父類對象,代碼如下:

class Test
{
	public static void main(String args[])
	{
		Student stu = new Student();
		stu.name = "張三";
		stu.age = 20;
		stu.address = "北京";
		stu.introduce();
		
		Person per = new Person();
		per.name = "李四";
		per.age = 22;
		per.introduce();
	}
}

  重新編譯,然後運行,結果截圖如下:
在這裏插入圖片描述
  可以看到上述結果正確。但此時老師又提出了一個問題,面嚮對象語言的終極目標是什麼?消除重複代碼;但是子類複寫函數中,明顯有重複代碼,此時怎麼辦,可以考慮使用 super,修改代碼,如下:

class Student extends Person
{
	String address;

	void introduce()
	{
		super.introduce();	// 調用父類同名函數
		System.out.println("我的家在" + address);
	}
}

  此時再次重新編譯,代碼執行結果如下:
在這裏插入圖片描述
  發現結果與之前的並無差異。

  使用 super 調用父類的成員函數,一般不會完全推翻父類定義的函數。這句話是老師講的,目前還不是特別清楚。

3 總結

  後續老師在課堂中的總結就與我自己的總結合並。

  1. 複寫,override;在兩個不同的類中,具有父子類關係,相同的函數名,相同的函數定義,相同的參數列表。
  2. 函數重載是:在同一個類中,相同的函數名,參數列表不同。
  3. super,複寫父類函數,怎麼避免重複寫父類函數呢?就用 super 代替即可。
  4. 對複寫的概念有了基本瞭解;
  5. 對複寫的使用還需要進一步加強;
  6. 目前還沒看到複寫的強大之處,後續還需繼續努力學習。
發佈了92 篇原創文章 · 獲贊 84 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章