Java物件和類


在本節教學中,我們將學習Java物件和類。在物件導向程式設計技術中,需要設計和使用物件和類的程式。物件是物理和邏輯實體,而類是邏輯實體。

提醒:對於Java初學者來說,物件和類是一個十分重要的概念,能否理解和掌握對之後其他Java知識有直接影響。所以,雖然本節的內容比較多,但建議認真閱讀並理解,最好能結合手動實現本節中的所有範例程式碼。

1. Java中的物件

具有狀態和行為的實體可稱為物件(女朋友也可以叫物件)。 椅子,自行車,標記,筆,桌子,汽車等。它可以是物理或邏輯(有形和無形)。 無形物件的例子是銀行系統。

一個物件有三個特點:

  • 狀態: 表示一個物件的資料(值)。
  • 行為: 表示物件的行為(功能),例如:存款,取款等。
  • 標識: 物件標識通常通過唯一ID實現。該ID的值對外部使用者不可見。 但是,它由JVM內部使用來唯一地標識每個物件。

例如: 汽車是一個物件。它的名字是:捷達,顏色是白色等這些就是它的狀態(資料值)。它用於跑路,所以跑路就是它的行為。

物件的一個範例。 類是建立物件的模板或藍圖。 所以物件是一個類的範例。

物件定義:

  • 物件是一個現實世界的實體。
  • 物件是一個執行時實體。
  • 物件是具有狀態和行為的實體。
  • 物件是類的一個範例。

2. Java中的類

類是具有共同屬性的一組物件。它是建立物件的模板或藍圖。它是一個邏輯實體。 它不能是物理存在的實體。

Java中的類可以包含:

  • 欄位
  • 方法
  • 建構函式
  • 程式碼塊
  • 巢狀類和介面

宣告一個類的語法:

class <class_name>{  
    field;  
    method;  
}

2.1. Java中的範例變數

範例變數在類內部,但在方法外部定義的變數稱為範例變數。 範例變數在編譯時不獲取記憶體。 它在執行時獲取物件(範例)建立時的記憶體。 這是為什麼,它被稱為範例變數。

2.2. Java中的方法

在java中的方法類似函式,用於暴露物件的行為。

方法的優點

  • 程式碼可重用性
  • 程式碼優化

2.3. Java中的new關鍵字

new關鍵字用於在執行時分配記憶體。所有物件在堆記憶體區域中獲取記憶體。

2.4. 物件和類範例: main方法和類

在這個例子中,我們建立了一個有兩個資料成員:idnameStudent類。並通過使用new關鍵字建立Student類的物件,並列印物件的值。

這裡,在類中建立main()方法。Student.java 類檔案的程式碼如下 -

class Student {
    int id;// field or data member or instance variable
    String name;

    public static void main(String args[]) {
        Student s1 = new Student();// creating an object of Student
        System.out.println(s1.id);// accessing member through reference variable
        System.out.println(s1.name);
    }
}

上面程式碼執行結果如下 -

0 
null

2.5. 物件和類範例:main方法在類外部

在真實的開發中,我們一般建立類並從另一個類中使用它。這是比上面的在同一個類中更好的方法。 讓我們來看一個簡單的例子,在另一個類中有main()方法建立其它類。
在不同的java檔案或單個java檔案中有多個類。 如果在單個java原始檔中定義多個類,則最好使用帶有main()方法的類名作為儲存的檔案名。下面來看一個名稱為 TestStudent1.java 的檔案中的程式碼:

class Student {
    int id;
    String name;
}

class TestStudent1 {
    public static void main(String args[]) {
        Student s1 = new Student();
        System.out.println(s1.id);
        System.out.println(s1.name);
    }
}

執行上面程式碼,得到以下結果 -

0 
null

3. 初始化物件

在java中初始化物件有3種方式,它們分別如下 -

  1. 通過參照變數初始化物件
  2. 通過方法初始化物件
  3. 通過建構函式初始化物件

3.1. 通過參照變數初始化物件

初始化物件僅僅是將資料初步地儲存到物件中。下面來看看一個簡單的例子,通過參照變數初始化物件。這裡建立一個 TestStudent2.java 類檔案,程式碼如下:

class Student {
    int id;
    String name;
}

class TestStudent2 {
    public static void main(String args[]) {
        Student s1 = new Student();
        s1.id = 101;
        s1.name = "Sonoo";
        System.out.println(s1.id + " " + s1.name);// printing members with a
                                                    // white space
    }
}

上面程式碼輸出結果如下 -

101 Sonoo

還可以通過參照變數建立多個物件並儲存資訊在這些物件。這裡建立一個 TestStudent3.java 類檔案,程式碼如下:

class Student {
    int id;
    String name;
}

class TestStudent3 {
    public static void main(String args[]) {
        // Creating objects
        Student s1 = new Student();
        Student s2 = new Student();
        // Initializing objects
        s1.id = 101;
        s1.name = "Sonoo";
        s2.id = 102;
        s2.name = "Amit";
        // Printing data
        System.out.println(s1.id + " " + s1.name);
        System.out.println(s2.id + " " + s2.name);
    }
}

上面程式碼輸出結果如下 -

101 Sonoo
102 Amit

3.2. 通過方法初始化物件

在本範例中,將建立Student類的兩個物件,並通過呼叫insertRecord方法來初始化這些物件的值。並通過呼叫displayInformation()方法顯示物件的狀態(資料)。這裡建立一個 TestStudent4.java 類檔案,程式碼如下:

class Student {
    int rollno;
    String name;

    void insertRecord(int r, String n) {
        rollno = r;
        name = n;
    }

    void displayInformation() {
        System.out.println(rollno + " " + name);
    }
}

class TestStudent4 {
    public static void main(String args[]) {
        Student s1 = new Student();
        Student s2 = new Student();
        s1.insertRecord(111, "Karan");
        s2.insertRecord(222, "Aryan");
        s1.displayInformation();
        s2.displayInformation();
    }
}

執行上面程式碼,得到如下結果 -

111 Karan
222 Aryan

建立物件的示意如下 -

從上圖可以看出,物件在堆記憶體區域獲取記憶體。 參照變數指的是在堆記憶體區域中分配的物件。 這裡,s1s2都是參照儲存器中分配的物件的參照變數。

3.3. 通過建構函式初始化物件

有關於通過建構函式初始化物件,我們將在後面的Java建構函式中學習。

3.3.1. 物件和類範例:Employee

下面我們來看看一個例子,實現維護員工資訊的記錄。這裡建立一個 TestEmployee.java 類檔案,程式碼如下所示 -

class Employee {
    int id;
    String name;
    float salary;

    void insert(int i, String n, float s) {
        id = i;
        name = n;
        salary = s;
    }

    void display() {
        System.out.println(id + " " + name + " " + salary);
    }
}

public class TestEmployee {
    public static void main(String[] args) {
        Employee e1 = new Employee();
        Employee e2 = new Employee();
        Employee e3 = new Employee();
        e1.insert(101, "ajeet", 45000);
        e2.insert(102, "irfan", 25000);
        e3.insert(103, "nakul", 55000);
        e1.display();
        e2.display();
        e3.display();
    }
}

上面程式碼執行得到結果如下 -

101 ajeet 45000.0
102 irfan 25000.0
103 nakul 55000.0

3.3.2. 物件和類範例:Rectangle

還有另一個維護Rectangle類記錄的例子。這裡建立一個 TestRectangle1.java 類檔案,程式碼如下所示 -

class Rectangle {
    int length;
    int width;

    void insert(int l, int w) {
        length = l;
        width = w;
    }

    void calculateArea() {
        System.out.println(length * width);
    }
}

class TestRectangle1 {
    public static void main(String args[]) {
        Rectangle r1 = new Rectangle();
        Rectangle r2 = new Rectangle();
        r1.insert(11, 5);
        r2.insert(3, 15);
        r1.calculateArea();
        r2.calculateArea();
    }
}

上面程式碼執行得到結果如下 -

55 
45

在Java中建立物件的不同方法有哪些?

在java中有很多方法可以用來建立物件。它們分別是:

  • 通過new關鍵字
  • 通過newInstance()方法
  • 通過clone()方法
  • 通過反序列化
  • 通過工廠方法等

在接下來的章節中,將學習這些方法用來建立物件。

匿名物件

匿名只是表示沒有名。沒有參照的物件(也就是不使用範例變數)稱為匿名物件。它只能在建立物件時使用。如果只需要使用一個物件,匿名物件是一個很好的方法。 例如:

new Calculation();//匿名物件
Calculation c = new Calculation();// 使用範例變數,所以不是匿名物件

呼叫方法通過參照:

Calculation c = new Calculation();  
c.fact(5);

通過匿名物件呼叫方法:

new Calculation().fact(5);

下面來看看java中的匿名物件的完整範例。

class Calculation {
    void fact(int n) {
        int fact = 1;
        for (int i = 1; i <= n; i++) {
            fact = fact * i;
        }
        System.out.println("factorial is " + fact);
    }

    public static void main(String args[]) {
        new Calculation().fact(5);// calling method with anonymous object
    }
}

上面程式碼執行得到結果如下 -

Factorial is 120

僅建立同個型別的多個物件

可以按照一種型別建立多個物件,就像在原始資料型別中的情況中一樣。
原始變數的初始化:

int a=10, b=20;

參照變數的初始化:

Rectangle r1=new Rectangle(), r2=new Rectangle();//creating two objects

下面再看看一個例子:

class Rectangle {
    int length;
    int width;

    void insert(int l, int w) {
        length = l;
        width = w;
    }

    void calculateArea() {
        System.out.println(length * width);
    }
}

class TestRectangle2 {
    public static void main(String args[]) {
        Rectangle r1 = new Rectangle(), r2 = new Rectangle();// creating two
                                                                // objects
        r1.insert(11, 5);
        r2.insert(3, 15);
        r1.calculateArea();
        r2.calculateArea();
    }
}

上面程式碼執行得到結果如下 -

55 
45

真實的應用範例: Account

在本節的最後部分,我們來看看一個真實應用中的範例,模擬銀行賬戶轉帳的實現。這裡建立一個 TestAccount.java 類檔案,程式碼如下所示 -

class Account {
    int acc_no;
    String name;
    float amount;

    void insert(int a, String n, float amt) {
        acc_no = a;
        name = n;
        amount = amt;
    }

    void deposit(float amt) {
        amount = amount + amt;
        System.out.println(amt + " deposited");
    }

    void withdraw(float amt) {
        if (amount < amt) {
            System.out.println("Insufficient Balance");
        } else {
            amount = amount - amt;
            System.out.println(amt + " withdrawn");
        }
    }

    void checkBalance() {
        System.out.println("Balance is: " + amount);
    }

    void display() {
        System.out.println(acc_no + " " + name + " " + amount);
    }
}

class TestAccount {
    public static void main(String[] args) {
        Account a1 = new Account();
        a1.insert(832345, "Ankit", 1000);
        a1.display();
        a1.checkBalance();
        a1.deposit(40000);
        a1.checkBalance();
        a1.withdraw(15000);
        a1.checkBalance();
    }
}

上面程式碼執行得到結果如下 -

832345 Ankit 1000.0
Balance is: 1000.0
40000.0 deposited
Balance is: 41000.0
15000.0 withdrawn
Balance is: 26000.0