Java基礎-面向對象相關(二)

繼承

子類繼承父類使用的是extends關鍵字。Java繼承的特點是單繼承。

優點

1.提高代碼的復用性。
2.讓類與類之間產生了關系,為多態提供了前提。

使用場景

當事物之間存在著所屬關系時,可以通過繼承來體現這個關系。

對比多繼承

多繼承復用性更高,單繼承復用性低。
多繼承關系復雜且有菱形缺陷,單繼承沒有。
PS:
1.菱形缺陷:B、C兩個類同時繼承于A,D繼承于B和C,如果B和C中存在同名方法,不知道執行從哪個類種中繼承過來的。
2.所有類的根類是Object。

子類重寫父類方法Override

前提:

子類可以訪問父類方法。

注意事項:

1.子類方法覆蓋父類方法,必須保證權限大于等于父類的權限。
2.靜態只能覆蓋靜態,或者被靜態覆蓋。
PS:注意是覆蓋,不是重寫。寫上super.run();會報錯

參考代碼

父類-Person類

public class Person {
    private String name;// 私有變量能繼承,不能訪問
    private int age;

    public Person() {
        System.out.println("Person init");
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {

    }

    public static void run() {
        System.out.println("run");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

子類-Teacher類

public class Teacher extends Person {

    private int number;
    public static String haha = "haha";


    public Teacher() {
        System.out.println("Teacher init");
    }// 會先調用父類的無參構造方法

    public Teacher(String name, int age, int number) {
        super(name, age);//調用父類的構造器
        this.number = number;
    }


    /**
     * 重寫父類方法
     * 注意事項:
     *     子類方法權限大于等于父類方法權限
     *     子類可以訪問父類被重寫的方法;
     */

    @Override/*加上注解會為我們檢測父類是否擁有當前方法,
    如果沒有代表不是重寫,會提示我們*/
    public void eat() {
        super.eat();// super指的是父類的空間,不是父類對象
        System.out.println(getName());
    }

    public static void run() {
        System.out.println("Teacher Run!");
    }// 靜態只能覆蓋靜態,或者被靜態覆蓋 注意是覆蓋,不是重寫。 
    方法內寫super.run();會報錯
}

單例設計模式

解決問題

保證一個類的對象在內存中的唯一性。

應用場景

多處需要共享數據的時候。

步驟

1.類中構造函數私有化。
2.在本類中new一個對象。
3.定義一個靜態方法返回該對象。

代碼

餓漢式

public class Singleton {
    // 在本類中創建一個對象
    private static final Singleton s = new Singleton();

    // 構造器私有化
    private Singleton() {

    }
    // 在靜態方法中將對象返回
    public static Singleton getInstance() {

        return s;
    }

}

懶漢式

public class SingletonSecond {
    private static SingletonSecond s = null;

    private SingletonSecond() {
    }

    // 延遲加載內存,不調用getInstance(),不開辟內存
    public static SingletonSecond getInstance(){
        if (s ==null) {
            s = new SingletonSecond();
        }
        return s;
    }

}

final關鍵字

1.可以修飾類:被final修飾的類不可被繼承(斷子絕孫)
2.可以修飾方法:被final修飾的方法不能被重寫
3.可以修飾變量:被final修飾的變量被初始化后不能被更改值(只初始化一次)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容