JAVA基礎初探(五)繼承、父子繼承的初始化順序、子類方法重寫、super關鍵字、final關鍵字
阿新 • • 發佈:2019-02-19
該篇部落格目錄
1、JAVA繼承
2、父子繼承的初始化順序
3、子類方法的重寫
4、super關鍵字
5、final關鍵字
一、JAVA繼承
多個類中存在相同屬性和方法時,將這些內容抽取到一個類中,那麼多個類無需再定義這些屬性和方法,只要繼承那個類即可。“is a”關係
1、繼承的優點
- 子類擁有父類的所有屬性和方法(private無效)
- 實現程式碼複用
2、語法規則
class 子類 extends 父類{
....
}
class pig extends Animal{
....
}
3、Demo
父類
package extends_eg;
public class Father {
public void say() {
System.out.println("我在說話");
}
public void sleep() {
System.out.println("我在睡覺");
}
}
子類
package extends_eg;
public class Daughter extends Father {
}
主函式
package extends_eg; public class Main_q { public static void main(String[] args) { // TODO Auto-generated method stub Daughter obj=new Daughter();//因為子類繼承了父類所以可以呼叫父類方法 obj.say(); obj.sleep(); } } //輸出 //我在說話 //我在睡覺
二、父子繼承的初始化順序
- 先初始化父類再初始化子類
- 先執行初始化物件中屬性,再執行構造方法中的初始化
下面是一個父類子類先後執行順序的Demo
父類
package com.xxxx;
public class Animal {
public int age=10;
public Animal() {
System.out.println("Animal類執行了");
age=20;
}
}
子類
package com.xxxx; public class Dog extends Animal { public Dog() { System.out.println("dog執行"); } }
主函式
package com.xxxx;
public class Initail {
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog dog =new Dog();
}
}
//輸出:
//Animal類執行了
//dog執行
很明顯可以看出先執行父類再執行子類
三、子類方法的重寫
如果子類對繼承父類的方法不滿意或者有其他需求,是可以重寫父類繼承下來的方法的,當呼叫方法時會優先呼叫子類的方法
語法規則
- 返回值型別相同
- 方法名相同
- 引數型別及個數相同
下面是子類方法重寫的Demo
父類
package extends_eg;
public class Father {
public void say() {
System.out.println("我在說話");
}
public void sleep() {
System.out.println("我在睡覺");
}
}
子類
package extends_eg;
public class Daughter extends Father {
public void say() {
System.out.println("我覺得父類的say方法不夠好,我要用自己這個");
}
}
主函式
package extends_eg;
public class Main_q {
public static void main(String[] args) {
// TODO Auto-generated method stub
Daughter obj=new Daughter();
obj.say();//優先呼叫子類重寫後的同名方法
}
}
//輸出:
//我覺得父類的say方法不夠好,我要用自己這個
四、super關鍵字
在物件的內部使用,可以代表父類物件
1、訪問父類成員變數
- super.成員變數
2、訪問父類的方法
- super.成員方法()
3、訪問父類構造方法(呼叫父類構造方法)
- super(..)
- Tip1:如果父類構造方法是無參的,那將會在子類中隱式呼叫super();。如果父類構造方法是有參的,需要自己顯示呼叫super(..);
- Tip2:super(..)必須出現在第一條語句(可以通過下面的Demo發現)
4、super Demo
父類
package extends_eg;
public class Father {
private int a;
public Father(int a) {
this.a=a;
System.out.println("呼叫父類構造方法");
}
}
子類
package extends_eg;
public class Daughter extends Father {
private int b;
public Daughter(int a,int b){
super(a);//一定要在第一句(且因為有參,所以要自己顯示呼叫)
this.b=b;
System.out.println("呼叫了子類的構造器");
}
}
主函式
package extends_eg;
public class Main_q {
public static void main(String[] args) {
// TODO Auto-generated method stub
Daughter obj=new Daughter(1,2);
}
}
//輸出:
//呼叫父類構造方法
//呼叫了子類的構造器
5、super的應用
- 子類的構造方法中必須呼叫其父類的構造方法所以要用到super
- 如果父類構造方法是無參的,那將會在子類中隱式呼叫super();。如果父類構造方法是有參的,需要自己顯示呼叫super(..);
五、final關鍵字
final關鍵字可以理解成“最終的”含義,可以修飾類,方法,屬性,變數
1、修飾類:該類不允許被繼承
final修飾Father類
假設Daughter類繼承Father類
報錯資訊
2、修飾方法:該方法不允許被重寫
final修飾父類中的print方法
如果子類對其父類的print方法進行重寫的話,將會報錯
報錯資訊
3、修飾類的屬性:該類的屬性不會進行隱式的初始化,所以只能選擇對該屬性初始時必須有值或者在構造方法中賦值(兩者選其一)
final修飾Father類的屬性並且初始化其值後,其他位置不能對其進行修改,否則報錯
final修飾Father類的屬性且不初始化其值,則必須在構造方法中對其初始化,否則報錯