首頁 > 軟體

深入淺出分析Java 類和物件

2022-03-23 13:01:12

一、什麼是類

類(Class)是物件導向程式設計(OOP,Object-Oriented Programming)實現資訊封裝的基礎。類是一種使用者自定義的參照資料型別,也稱類型別。每個類包含資料說明和一組運算元據或傳遞訊息的函數,類的範例稱為物件

類的實質是一種參照資料型別,類似於 byte,short,int,char,long, float, double等基本資料型別,不同的是它是一種複雜的資料型別。因為它的本質是資料型別,而不是資料,所以不存在於記憶體中,不能被直接操作,只有被範例化為物件時,才會變得可操作。

二、Java的類和C語言的結構體異同

我們可以發現Java中的類其實和C語言中的結構體很像,那麼他們有什麼區別呢?

1.打包的物件不同

C 語言的結構體是對資料的打包。把一堆概念上相互關聯的資料打包到一起,方便整體處理。外界可以隨意讀寫這些資料

Java的物件可以是對資料的打包,也可以是對職責的打包

2. 存放的位置不同

C 語言的結構體可以存放在棧上,也可以存在堆上

Java的物件只能存在堆上

三、類和類的範例化

類的成員可以包含以下:欄位、方法、程式碼塊、內部類和介面等

可以形象的理解為類是一個模板,類的範例化就是通過這個模板來建立物件(一個模板可以建立無數的物件)

宣告一個類其實就相當於是在自定義一種新的型別,參照型別

類的宣告

基本形式:

class 類名 {
欄位(成員變數/屬性);
方法(成員方法);
}

這裡的 class 就是類的關鍵字

類中的元素:屬性(在類裡面,方法的外面)

類中的方法:成員方法

如下範例:

public class Dog {
    public String name;
    public int age;
    public void bark() {
        System.out.println("汪汪");
    }
}

通過以上程式碼這就建立了一個狗這個類,有姓名和年齡兩個屬性,行為就是叫

屬性前面的public是存取修飾符

成員方法前面不加 static

範例化的物件,成員遵循預設值規則

預設值規則:0 的變形

特殊的:

參照型別:null         

boolean:false     

char:'u0000' (空字元)

類的範例化

class Dog {
    public String name;
    public int age;
    public boolean are;
    public static int a;
    public void bark() {
        System.out.println("汪汪");
    }
}
 
public class Practice {
    public static void main(String[] args) {
        Dog dog = new Dog();   // 範例化一個物件
        System.out.println(dog.are);   // 通過.來存取
    }
}

這裡通過new來範例化一個物件,通過物件的參照 . 成員變數來存取成員變數,普通方法通過物件的參照 . 方法名來呼叫

靜態屬性(靜態成員變數)

被定義在類的內部,方法的外部,加static修飾

如下程式碼:

class Dog {
    public String name;
    public int age;
    public boolean are;
    public static int a;    // 靜態屬性
    public void bark() {
        System.out.println("汪汪");
    }
}

注意: 靜態屬性仍然遵循預設值規則

如何存取:

需要知道靜態成員變數並不屬於物件,而是屬於類,所以我們不能通過物件的參照 . 成員變數去存取,而是 類名 . 靜態屬性 去存取,靜態方法通過類名來存取

如下:

System.out.println(Dog.a);

錯誤範例:

System.out.println(dog.a);

存取類的靜態屬性不需要有物件,直接就可以存取

注意:

  • 靜態屬性存在於方法區
  • 不管new多少個物件,靜態屬性只有一份
  • 靜態方法內部不能夠存取非靜態的資料成員的值,也不能呼叫非靜態方法
  • 靜態方法不依賴物件

四、構造方法

首先我們想想,一個物件時如何產生的?

  • 為物件分配記憶體
  • 呼叫合適的構造方法

在我們使用new來範例化物件時,構造方法會被自動呼叫,完成初始化操作

建立構造方法

  • 方法名必須和類名相同
  • 無返回值型別宣告
  • 每個類至少存在一個構造方法(沒有定義時,系統自動生成一個無參構造)

如下程式碼:

class Dog {
    public String name;
    public int age;
    public boolean are;
    public static int a;
    public Dog() {
 
    }
    public Dog(String name) {
        this.name = name;
    }
    public void bark() {
        System.out.println("汪汪");
    }
}
 
public class Practice {
    public static void main(String[] args) {
        Dog dog = new Dog("旺財");
        System.out.println(dog.name);
    }
}

在這段程式碼中有Dog這個類,裡面共有兩個構造方法,一個無參構造,一個有參構造,在通過new建立物件時,使用了有參構造,可以看到列印出來的結果

所以其實也就能看出來,到底呼叫哪個構造方法,取決於new時傳的引數

需要注意:

  • 當類中沒有構造方法的時候,系統會自動補一個無參構造方法,但是當你自己寫了構造方法的時候,就不會補這個無參構造,若需要用無參構造,就需要自己手動寫
  • 構造方法也支援過載

this

this的作用

在很多情況下,可能都會有人誤以為 this 是當前物件,但其實 this 是當前物件的參照

為什麼this不是物件,而是參照:

我們要知道,構造方法是用來建立物件的,那麼在呼叫構造方法建立物件的過程中,這個物件還是不存在的,哪來的物件之說

因此我們可以通過this去存取屬性、成員方法、構造方法(呼叫構造方法時,只能放在第一行,只能在構造方法裡面寫,只能用一次)

到此這篇關於深入淺出分析Java 類和物件的文章就介紹到這了,更多相關Java 類和物件內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com