繼承:
定義:子類繼承父類的屬性,使得子類對象具有與父類相同的屬性和行爲。子類可以直接訪問父類中的非私有的屬性和行爲。
好處:1.提高了代碼的複用性。2.使類與類之間產生了關係,是多態的前提。
1.繼承的格式:
通過exends 關鍵字,可以聲明一個子類繼承另一個父類。
定義格式如下:
public class 父類{
}
public class 子類 extends 父類{
}
演示代碼如下:
/*
* 定義員工類Employee,做爲父類
*/
class Employee {
String name; // 定義name屬性
// 定義員工的工作方法
public void work() {
System.out.println("盡心盡力地工作");
}
}
/*
* 定義講師類Teacher 繼承 員工類Employee
*/
class Teacher extends Employee {
// 定義一個打印name的方法
public void printName() {
System.out.println("name=" + name);
}
}
/*
* 定義測試類
*/
public class ExtendDemo01 {
public static void main(String[] args) {
// 創建一個講師類對象
Teacher t = new Teacher();
// 爲該員工類的name屬性進行賦值
t.name = "小明";
// 調用該員工的printName()方法
t.printName(); // name = 小明
// 調用Teacher類繼承來的work()方法
t.work(); // 盡心盡力地工作
}
}
2.繼承後成員變量的特點:
如果成員變量不重名,則這時的訪問不會出現任何影響。
如果子類與父類的成員變量重名了,這時訪問的是子類的成員變量。
這時就需要使用super關鍵字,修飾父類成員變量。 使用格式:super.父類成員變量名
演示代碼如下:
//父類
public class Fu {
String s = "我是父類的成員變量";
}
//子類
public class Zi extends Fu{
String s = "我是子類的成員變量";
public void show() {
System.out.println(super.s);
System.out.println(s);
}
}
//測試類
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
演示結果:
我是父類的成員變量
我是子類的成員變量
3.繼承後成員方法特點
如果子類父類出現不重名的成員方法,這時調用時沒有影響的。對象調用方法時,會先在子類中查找有沒有對應的方法,若子類中存在就會執行子類中的方法,若沒有則執行父類。
如果子類與父類中出現了重名的成員方法時,這時訪問怎會出現一種特殊的情況,叫做方法重寫。
方法重寫:子類中出現與父類一模一樣的方法時(返回值類型,方法名和參數列表都相同),會出現覆蓋效果,也稱爲重寫或複寫。聲明不變,重寫實現。
重寫的好處:在原有的父類的基礎上拓展出自己獨有的功能。
簡單的代碼示例:
//父類
public class Fu {
public void show() {
System.out.println("我是父類的成員方法");
}
}
//子類
public class Zi extends Fu{
public void show() {
super.show();
System.out.println("我是子類的成員方法。");
System.out.println("我可以比父類更健壯!");
}
}
//測試類
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
演示結果:
我是父類的成員方法
我是子類的成員方法。
我可以比父類更健壯!
注:這裏重寫時,用到super.父類成員方法,表示調用父類的成員方法。
重寫的注意事項:
1.子類方法覆蓋父類方法,必須保證權限不小於父類權限
2.子類方法覆蓋父類方法,返回值類型,方法名和參數列表都要一模一樣。
4.繼承後構造方法的特點
1.構造方法名與類名是一致的,所以子類無法重寫子類構造方法。
2.構造方法的作用是初始化成員變量的,所以子類的初始化過程中必須先執行父類的初始化動作。子類的構造
方法中默認有一個super();表示調用父類的構造方法。
代碼如下:
//父類
public class Fu {
public Fu() {
System.out.println("父類構造方法");
}
}
//子類
public class Zi extends Fu{
public Zi() {
//super();默認調用父類構造方法
System.out.println("子類的構造方法");
}
}
//測試類
public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
演示結果:
父類構造方法
子類的構造方法
5.super和this
super:代表父類的引用
this:代表 當前對象的引用
super和this的用法:
1.訪問成員
this.成員變量 ---- 本類的
super.成員變量 ----- 父類的
this.成員方法名() ---- 本類的
super.成員方法名() ----- 父類的
2.訪問構造方法
this(...) --- 本類的構造方法
super(...) --- 父類的構造方法
注:super()和this()都必須在構造方法的第一行,所以不能同時出現。
Java中只支持單繼承,不支持多繼承,但是支持多層繼承。