1 目錄及資源索引
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 ,特徵如下:
- 在具有父子關係的兩個類當中
- 父類和子類各有一個函數,這兩個函數的定義(返回值類型、函數名和參數列表)完全相同。
下邊可以在定義一個主函數,調用上述子類,測試一下,代碼如下:
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 總結
後續老師在課堂中的總結就與我自己的總結合並。
- 複寫,override;在兩個不同的類中,具有父子類關係,相同的函數名,相同的函數定義,相同的參數列表。
- 函數重載是:在同一個類中,相同的函數名,參數列表不同。
- super,複寫父類函數,怎麼避免重複寫父類函數呢?就用 super 代替即可。
- 對複寫的概念有了基本瞭解;
- 對複寫的使用還需要進一步加強;
- 目前還沒看到複寫的強大之處,後續還需繼續努力學習。