1. 程式人生 > 其它 >【狂神說Java】學習筆記16:面向物件程式設計(中)

【狂神說Java】學習筆記16:面向物件程式設計(中)

【狂神說Java】學習筆記16:面向物件程式設計(中)

[01] 初識面向物件

[02] 方法回顧和加深

[03] 物件的建立分析

[04] 面向物件三大特徵(重點)

[05] 抽象類和介面

[06] 內部類和OOP實戰

--------------------------------------------------------------------

[03] 物件的建立分析

類與物件

是一個抽象的資料型別。描述抽象特徵,而非具體例項。

​ 類是一個模板,較抽象。靜態的表述(屬性),動態的行為(方法)

​ 屬性:欄位field 成員變數。有預設的初始化。

物件是抽象概念的具體化例項。物件是通過引用來操作的,從棧到堆。

​ 物件的建立和使用,new來創造。

建立物件

實體化一個類並呼叫

學生類裡有屬性(姓名,年齡)和方法(學習)

main方法裡實例化學生類,並給例項化的物件賦予姓名和年齡,然後呼叫學習的方法。

實體化是如何實現的??

例項化new具體是如何操作的,看如下的簡易記憶體圖加深理解。

裡存放main方法(放在最底行來執行),和引用變數名(cat,dog)

裡放記憶體地址(new出來的旺財的資訊,cat的資訊來讓棧呼叫)和方法區。

總結:平常說的引用變數名,其實都是通過棧裡的變數名,來引用堆裡的記憶體資訊。

方法區裡的靜態方法static,是和類一起載入的,所以所有的物件都可以用到靜態方法。

程式碼例項

圖解程式碼例項


[04] 面向物件三大特徵(重點)

三大特性有:封裝,重寫和多型

1.封裝 (屬性私有,get/set)

類比簡介:就像看電視,不需要了解構造和原理,只需要遙控器就可以看電視換臺。

設計要遵循 高內聚,低耦合 的設計觀念。

​ 高內聚:類的內部資料操作細節自己完成,不允許外部干涉。

​ 低耦合:僅暴露少量的方法給外部使用。

封裝的好處:1.提高程式的安全性,保護資料安全性。2.隱藏程式碼實現細節。3.統一介面。4.提高可維護性。



封裝類的例項

student類裡私有屬性name和age,外部無法student.name() 直接呼叫。
因此需要在類裡寫外部介面get/set,讓外部可以呼叫。如student.setName(),student.getName()
※小技巧:Alt + ins鍵可以快速生成屬性的get/set方法。

2.繼承 extends

繼承的本質是對一批類的抽象,讓程式碼實現建模。

子類繼承的是父類的public的,父類的私有的Private類無法被繼承,除非父類寫get/set取到

Java裡的所有類都繼承Object類


#### super

super是訪問父的類。

例項:父類Person,子類student,執行程式Application,在子類寫個test方法,令輸出name的值完全不同。

System.out.println(name); →→name=Application裡定義的值。

System.out.println(this.name); →→this.name=this所在類的屬性值

System.out.println(super.name); →→super.name=父類的屬性值


無參構造

執行main方法的時候,呼叫了student類的無參構造方法,但前提是最先呼叫了父類的無參構造方法。

並且父類的呼叫首先執行(隱藏了 super(); 這個寫法。),再執行子類student類的無參構造方法。

並且super(); 必須放在子類構造器的第一行。放下面則報錯。


super的注意點總結

super注意點:

​ 1.super呼叫父類的構造方法,必須在構造方法的第一個。

​ 2.super必須只能出現在子類的方法或構造方法中

​ 3.super和this不能同時呼叫構造方法。

this VS super:

代表的物件 前提 構造方法
this 代表本身這個物件 沒有繼承也可以使用 this()呼叫本類的構造
super 代表父類物件的應用 必須在繼承條件下才能使用 super()呼叫了父類的構造

#### Override 方法的重寫

Override是重寫,是方法的重寫,和屬性無關所以在此不寫。

Static靜態方法的重寫。

子類A重寫了父類B的test方法,然後呼叫之後有自己的方法體和輸出內容。與父類不一樣。

注意點:此處 B b=new A(); 容易迷惑。AB產生父子的繼承關係之後,父類B的引用b指向了子類A()。(此處涉及多型的概念)


Override

非靜態方法下(無static)重寫時,public共有的可以重寫,private私有的無法重寫。

上面的程式碼,父類B和子類A的static都去掉之後會發現程式碼行標出有 o 的標誌,就是override。

alt+ins鍵找到「override method」,然後就自動生成重寫的方法 @Override,這是功能性註釋。

非靜態方法下用Override來使子類重寫了父類的方法,因此呼叫的父類的方法也變成了子類的方法,結果都是一樣的。


重寫的注意事項

​ 前提是需要有繼承關係,子類重寫父類的方法。
​ 1.方法名必須相同
​ 2.引數列表必須相同。
​ 3.修飾符:範圍可以擴大。public > Protected > Default > Private
​ 4.丟擲異常:範圍可以被縮小,但是不能被擴大。ClassNotFoundException

為什麼需要重寫:父類的功能子類不一定需要,或者無法滿足。


### 3.多型 instanceof

父類的引用指向子類的物件。

把子類轉化為父類,向上轉型

把父類轉化為子類,向下轉型,強制轉換會丟失方法。


附錄1:static總結(靜態方法,靜態屬性)

類裡的靜態變數可以直接呼叫,而非靜態變數則需要例項化才能呼叫。

類裡的靜態方法可以以類名的方法直接被呼叫,而非靜態方法也是需要例項化才能呼叫。

package oop.demo07;

// static  靜態的屬性和靜態方法的總結
public class Student {
    private static int age;     //1.靜態變數
    private double score;       //1.非靜態變數

    public static void main(String[] args) {
        Student s1 = new Student();
        // 2.屬性的呼叫。
        //Student.age 是類名的靜態變數,在類的記憶體中只有一個,可以被類內共享呼叫,推薦使用。
        System.out.println(Student.age);    //類名的靜態變數。無需new,就可以用
        System.out.println(s1.age);         //物件的靜態變數。必須new才能用。


        //3.方法的呼叫。
        //run(); 非靜態方法的run直接用的話報錯,需要例項化run方法。
        new Student().run();       //必須寫明  物件().方法() 才可以使用。
        read();                    //直接用。無需寫物件,預設是類名裡read方法。
    }

    // run方法
    public void run(){

    }
    // 靜態方法
    public static void read(){

    }

}

## 附錄2:程式碼塊的應用。
package oop.demo07;

//  程式碼塊
/*
    1.依次建立以下匿名程式碼塊和靜態程式碼塊,構造方法。
    2.寫一個main方法,例項化person後並執行,
    3.看輸出順序和輸出結果
    總結:靜態程式碼塊。隨著程式執行一起執行,只執行一次。其他的隨著例項的建立一遍遍執行。

 */

public class Person {
    // 匿名程式碼塊,一般會賦初始值。
    {
        System.out.println("匿名程式碼塊");
    }
    // 靜態程式碼塊。
    static{
        System.out.println("靜態程式碼塊");
    }
    public Person(){
        System.out.println("構造方法");
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        System.out.println("==============================");
        Person person2 = new Person();
    }
}

-------------------------------------------------------------------
靜態程式碼塊
匿名程式碼塊
構造方法
==============================
匿名程式碼塊
構造方法