1. 程式人生 > >JAVA基礎初探(五)繼承、父子繼承的初始化順序、子類方法重寫、super關鍵字、final關鍵字

JAVA基礎初探(五)繼承、父子繼承的初始化順序、子類方法重寫、super關鍵字、final關鍵字

該篇部落格目錄

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類的屬性且不初始化其值,則必須在構造方法中對其初始化,否則報錯

這裡寫圖片描述

4、修飾變數:即為常量

這裡寫圖片描述