1.1 super 關(guān)鍵字的概述和使用
1.1.1super 關(guān)鍵字的概述
- super的用法和this很像
- this代表本類對象的引用
- super代表父類存儲空間的標(biāo)識(可以理解為父類對象引用)
- 用法(this和super均可如下使用)
- 訪問成員變量
- this.成員變量 super.成員變量
- 訪問構(gòu)造方法
- this(…) super(…)
- 訪問成員方法
- this.成員方法() super.成員方法()
- 訪問成員變量
1.1.2示例代碼
package com.itheima_02;
public class Father {
public int age = 45;
}
package com.itheima_02;
/*
* super和this的用法很像:
* this:代表本類對象的引用
* super:代表父類的存儲空間(可以理解為代表父類對象的引用)
*
* 用法:
* 訪問成員變量:
* this.成員變量
* super.成員變量
* 訪問構(gòu)造方法:
* this(...)
* super(...)
* 訪問成員方法:
* this.成員方法()
* super.成員方法()
*/
public class Son extends Father {
public int age = 20;
public void printAge() {
int age = 10;
System.out.println(age);
//我要訪問成員范圍的age?
System.out.println(this.age);
//我要訪問父類成員范圍的age?
System.out.println(super.age);
}
}
package com.itheima_02;
public class ExtendsTest {
public static void main(String[] args) {
Son s = new Son();
s.printAge();
}
}
2.2 Java 繼承中構(gòu)造方法的特點
- 子類中所有的構(gòu)造方法默認(rèn)都會訪問父類中空參數(shù)的構(gòu)造方法
- 為什么呢?
- 因為子類會繼承父類中的數(shù)據(jù),可能還會使用父類的數(shù)據(jù),所以,子類初始化之前,一定要先完成父類數(shù)據(jù)的初始化
- 每一個構(gòu)造方法的第一條默認(rèn)語句都是super
- 如果父類中沒有構(gòu)造方法,該怎么辦呢?
- 在父類中加一個無參的構(gòu)造方法
- 通過使用super關(guān)鍵字去顯示的調(diào)用父類的帶參構(gòu)造方法
- 通過這里我們發(fā)現(xiàn)第一種解決方案最簡單,所以,建議我們自定義類的時候永遠(yuǎn)自己給出無參構(gòu)造方法
1.2.1 示例代碼
package com.itheima_03;
public class Father {
/*
public Father() {
System.out.println("Father無參構(gòu)造方法");
}
*/
public Father(String name) {
System.out.println("Father帶參構(gòu)造方法");
System.out.println(name);
}
}
package com.itheima_03;
/*
* Java繼承中構(gòu)造方法的訪問特點:
* A:子類構(gòu)造方法執(zhí)行前都會先執(zhí)行父類無參構(gòu)造方法
* B:為什么呢?
* 因為子類繼承父類,會繼承父類的非私有成員。
* 而子類在初始化的時候,可能會使用父類的數(shù)據(jù),如果父類數(shù)據(jù)沒有先初始化,
* 子類就不能使用這些數(shù)據(jù),所以,在子類初始化之前,一定要先完成父類數(shù)據(jù)的初始化。
*
* 注意:在子類的構(gòu)造方法中,默認(rèn)第一行有一條語句:super()
*
* 問題:假如父類中沒有無參構(gòu)造方法,怎么辦呢?
* A:在父類中添加一個無參構(gòu)造方法。
* B:可以通過super去訪問父類的帶參構(gòu)造方法。
* 建議使用第一種解決方案,其實就是要求我們寫代碼的時候,每次都手動的給出無參構(gòu)造方法。
*/
public class Son extends Father {
public Son() {
//super();
super("林青霞");
System.out.println("Son無參構(gòu)造方法");
}
public Son(String name) {
//super();
super("林青霞");
System.out.println("Son帶參構(gòu)造方法");
System.out.println(name);
}
}
package com.itheima_03;
public class ExtendsTest {
public static void main(String[] args) {
Son s = new Son();
System.out.println("---------");
Son s2 = new Son("林青霞");
}
}
1.3 Java繼承中成員方法的特點
1.3.1 Java繼承中成員方法的特點
- 通過子類對象去訪問一個方法
- 首先在子類中找
- 然后在父類中找
- 如果還是沒有就會報錯
1.3.2 示例代碼
package com.itheima_04;
public class Father {
public void show() {
System.out.println("Father show");
}
}
package com.itheima_04;
/*
* Java繼承中成員方法的訪問特點:
* A:子類中方法和父類中方法的聲明不一樣,這個太簡單
* B:子類中方法和父類中方法的聲明一樣,調(diào)用的到底是誰的呢?
* 執(zhí)行的是子類中的方法。
*
* 通過子類對象調(diào)用方法:
* a:在子類中找,有就使用
* b:在父類中找,有就使用
* c:如果沒有就報錯
*/
public class Son extends Father {
public void method() {
System.out.println("Son method");
}
public void show() {
System.out.println("Son show");
}
}
package com.itheima_04;
public class ExtendsTest {
public static void main(String[] args) {
Son s = new Son();
s.method();
s.show();
//s.function();
}
}
1.4 方法重寫的概述和使用
1.4.1 方法重寫的概述
- 方法重寫:子類中出現(xiàn)了和父類中一摸一樣的方法聲明
1.4.2 方法重寫的應(yīng)用
- 當(dāng)子類需要父類的功能,而功能主體子類有自己特有的內(nèi)容時,可以重寫中的方法,這樣重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內(nèi)容
1.4.3方法重寫的注意事項
注解
- @Override
- 表明該方法的重寫父類的方法
- 方法重寫的注意事項
- 父類中私有方法不能被重寫
- 子類重寫父類方法時,訪問權(quán)限不能更低
- 子類重寫父類方法時,建議訪問權(quán)限一摸一樣
1.4.4 示例代碼
package com.itheima_01;
public class Phone {
public void call(String name) {
System.out.println("給"+name+"打電話");
}
}
package com.itheima_01;
public class NewPhone extends Phone {
public void call(String name) {
System.out.println("開啟視頻功能");
//System.out.println("給"+name+"打電話");
super.call(name);
}
}
package com.itheima_01;
/*
* 方法重寫:子類中出現(xiàn)了和父類中一模一樣的方法聲明的情況。
*
* 方法重寫的應(yīng)用:
* 當(dāng)子類需要父類的功能,而功能主體子類又有自己的特有內(nèi)容的時候,就考慮使用方法重寫,
* 這樣即保證了父類的功能,還添加了子類的特有內(nèi)容。
*/
public class PhoneTest {
public static void main(String[] args) {
Phone p = new Phone();
p.call("林青霞");
System.out.println("-----------");
NewPhone np = new NewPhone();
np.call("林青霞");
}
}