鍍金池/ 教程/ Java/ Java對(duì)象和類
Java for循環(huán)
Java接口
Java是什么?
Java命名約定
java中方法重載和方法重寫的區(qū)別
Java運(yùn)算符
Java抽象類
Java快速入門
Java實(shí)例初始化程序塊
Java靜態(tài)綁定和動(dòng)態(tài)綁定
Java do-while循環(huán)
Java對(duì)象克隆
Java Object類
Java聚合
Java繼承
Java this關(guān)鍵字
Java虛擬機(jī)內(nèi)部體系結(jié)構(gòu)
Java構(gòu)造器(構(gòu)造方法)
Eclipse安裝和配置
Java多態(tài)
Java方法重載
Java while循環(huán)
Java教程
Java按值調(diào)用和引用調(diào)用
Java strictfp關(guān)鍵字
Java封裝
Java語言特點(diǎn)
Java數(shù)組
Java instanceof運(yùn)算符
Java包裝類
Java命令行參數(shù)
Java包
Java面向?qū)ο螅∣OP)概念
簡(jiǎn)單Java程序
Java基礎(chǔ)實(shí)例程序
Java對(duì)象和類
Java continue語句
Java抽象類和接口的區(qū)別
C++ VS Java比較
Java if/else語句
Java switch語句
Java歷史
Java變量和數(shù)據(jù)類型
安裝Java環(huán)境(Linux)
Java JDK安裝和配置
Hello Java程序的內(nèi)部細(xì)節(jié)
Java break語句
Java方法重寫
Java Unicode編碼系統(tǒng)
怎么樣開始學(xué)習(xí)Java編程?
對(duì)象和類之間的區(qū)別
Java訪問修飾符
Java super關(guān)鍵字
Java注釋
JDK,JRE和JVM之間的區(qū)別
Java final關(guān)鍵字
Java static關(guān)鍵字

Java對(duì)象和類

在本節(jié)教程中,我們將學(xué)習(xí)Java對(duì)象和類。在面向?qū)ο缶幊碳夹g(shù)中,需要設(shè)計(jì)和使用對(duì)象和類的程序。對(duì)象是物理和邏輯實(shí)體,而類是邏輯實(shí)體。

提醒:對(duì)于Java初學(xué)者來說,對(duì)象和類是一個(gè)十分重要的概念,能否理解和掌握對(duì)之后其他Java知識(shí)有直接影響。所以,雖然本節(jié)的內(nèi)容比較多,但建議認(rèn)真閱讀并理解,最好能結(jié)合手動(dòng)實(shí)現(xiàn)本節(jié)中的所有示例代碼。

1. Java中的對(duì)象

具有狀態(tài)和行為的實(shí)體可稱為對(duì)象(女朋友也可以叫對(duì)象)。 椅子,自行車,標(biāo)記,筆,桌子,汽車等。它可以是物理或邏輯(有形和無形)。 無形對(duì)象的例子是銀行系統(tǒng)。

一個(gè)對(duì)象有三個(gè)特點(diǎn):

  • 狀態(tài): 表示一個(gè)對(duì)象的數(shù)據(jù)(值)。
  • 行為: 表示對(duì)象的行為(功能),例如:存款,取款等。
  • 標(biāo)識(shí): 對(duì)象標(biāo)識(shí)通常通過唯一ID實(shí)現(xiàn)。該ID的值對(duì)外部用戶不可見。 但是,它由JVM內(nèi)部使用來唯一地標(biāo)識(shí)每個(gè)對(duì)象。

例如: 汽車是一個(gè)對(duì)象。它的名字是:捷達(dá),顏色是白色等這些就是它的狀態(tài)(數(shù)據(jù)值)。它用于跑路,所以跑路就是它的行為。

對(duì)象的一個(gè)實(shí)例。 類是創(chuàng)建對(duì)象的模板或藍(lán)圖。 所以對(duì)象是一個(gè)類的實(shí)例。

對(duì)象定義:

  • 對(duì)象是一個(gè)現(xiàn)實(shí)世界的實(shí)體。
  • 對(duì)象是一個(gè)運(yùn)行時(shí)實(shí)體。
  • 對(duì)象是具有狀態(tài)和行為的實(shí)體。
  • 對(duì)象是類的一個(gè)實(shí)例。

2. Java中的類

類是具有共同屬性的一組對(duì)象。它是創(chuàng)建對(duì)象的模板或藍(lán)圖。它是一個(gè)邏輯實(shí)體。 它不能是物理存在的實(shí)體。

Java中的類可以包含:

  • 字段
  • 方法
  • 構(gòu)造函數(shù)
  • 代碼塊
  • 嵌套類和接口

聲明一個(gè)類的語法:

class <class_name>{  
    field;  
    method;  
}

2.1. Java中的實(shí)例變量

實(shí)例變量在類內(nèi)部,但在方法外部定義的變量稱為實(shí)例變量。 實(shí)例變量在編譯時(shí)不獲取內(nèi)存。 它在運(yùn)行時(shí)獲取對(duì)象(實(shí)例)創(chuàng)建時(shí)的內(nèi)存。 這是為什么,它被稱為實(shí)例變量。

2.2. Java中的方法

在java中的方法類似函數(shù),用于暴露對(duì)象的行為。

方法的優(yōu)點(diǎn)

  • 代碼可重用性
  • 代碼優(yōu)化

2.3. Java中的new關(guān)鍵字

new關(guān)鍵字用于在運(yùn)行時(shí)分配內(nèi)存。所有對(duì)象在堆內(nèi)存區(qū)域中獲取內(nèi)存。

2.4. 對(duì)象和類示例: main方法和類

在這個(gè)例子中,我們創(chuàng)建了一個(gè)有兩個(gè)數(shù)據(jù)成員:idnameStudent類。并通過使用new關(guān)鍵字創(chuàng)建Student類的對(duì)象,并打印對(duì)象的值。

這里,在類中創(chuàng)建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);
    }
}

上面代碼執(zhí)行結(jié)果如下 -

0 
null

2.5. 對(duì)象和類示例:main方法在類外部

在真實(shí)的開發(fā)中,我們一般創(chuàng)建類并從另一個(gè)類中使用它。這是比上面的在同一個(gè)類中更好的方法。 讓我們來看一個(gè)簡(jiǎn)單的例子,在另一個(gè)類中有main()方法創(chuàng)建其它類。
在不同的java文件或單個(gè)java文件中有多個(gè)類。 如果在單個(gè)java源文件中定義多個(gè)類,則最好使用帶有main()方法的類名作為保存的文件名。下面來看一個(gè)名稱為 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);
    }
}

執(zhí)行上面代碼,得到以下結(jié)果 -

0 
null

3. 初始化對(duì)象

在java中初始化對(duì)象有3種方式,它們分別如下 -

  1. 通過引用變量初始化對(duì)象
  2. 通過方法初始化對(duì)象
  3. 通過構(gòu)造函數(shù)初始化對(duì)象

3.1. 通過引用變量初始化對(duì)象

初始化對(duì)象僅僅是將數(shù)據(jù)初步地存儲(chǔ)到對(duì)象中。下面來看看一個(gè)簡(jiǎn)單的例子,通過引用變量初始化對(duì)象。這里創(chuàng)建一個(gè) 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
    }
}

上面代碼輸出結(jié)果如下 -

101 Sonoo

還可以通過引用變量創(chuàng)建多個(gè)對(duì)象并存儲(chǔ)信息在這些對(duì)象。這里創(chuàng)建一個(gè) 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);
    }
}

上面代碼輸出結(jié)果如下 -

101 Sonoo
102 Amit

3.2. 通過方法初始化對(duì)象

在本示例中,將創(chuàng)建Student類的兩個(gè)對(duì)象,并通過調(diào)用insertRecord方法來初始化這些對(duì)象的值。并通過調(diào)用displayInformation()方法顯示對(duì)象的狀態(tài)(數(shù)據(jù))。這里創(chuàng)建一個(gè) 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();
    }
}

執(zhí)行上面代碼,得到如下結(jié)果 -

111 Karan
222 Aryan

創(chuàng)建對(duì)象的示意如下 -

從上圖可以看出,對(duì)象在堆內(nèi)存區(qū)域獲取內(nèi)存。 引用變量指的是在堆內(nèi)存區(qū)域中分配的對(duì)象。 這里,s1s2都是引用存儲(chǔ)器中分配的對(duì)象的引用變量。

3.3. 通過構(gòu)造函數(shù)初始化對(duì)象

有關(guān)于通過構(gòu)造函數(shù)初始化對(duì)象,我們將在后面的Java構(gòu)造函數(shù)中學(xué)習(xí)。

3.3.1. 對(duì)象和類示例:Employee

下面我們來看看一個(gè)例子,實(shí)現(xiàn)維護(hù)員工信息的記錄。這里創(chuàng)建一個(gè) 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();
    }
}

上面代碼執(zhí)行得到結(jié)果如下 -

101 ajeet 45000.0
102 irfan 25000.0
103 nakul 55000.0

3.3.2. 對(duì)象和類示例:Rectangle

還有另一個(gè)維護(hù)Rectangle類記錄的例子。這里創(chuàng)建一個(gè) 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();
    }
}

上面代碼執(zhí)行得到結(jié)果如下 -

55 
45

在Java中創(chuàng)建對(duì)象的不同方法有哪些?

在java中有很多方法可以用來創(chuàng)建對(duì)象。它們分別是:

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

在接下來的章節(jié)中,將學(xué)習(xí)這些方法用來創(chuàng)建對(duì)象。

匿名對(duì)象

匿名只是表示沒有名。沒有引用的對(duì)象(也就是不使用實(shí)例變量)稱為匿名對(duì)象。它只能在創(chuàng)建對(duì)象時(shí)使用。如果只需要使用一個(gè)對(duì)象,匿名對(duì)象是一個(gè)很好的方法。 例如:

new Calculation();//匿名對(duì)象
Calculation c = new Calculation();// 使用實(shí)例變量,所以不是匿名對(duì)象

調(diào)用方法通過引用:

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

通過匿名對(duì)象調(diào)用方法:

new Calculation().fact(5);

下面來看看java中的匿名對(duì)象的完整示例。

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
    }
}

上面代碼執(zhí)行得到結(jié)果如下 -

Factorial is 120

僅創(chuàng)建同個(gè)類型的多個(gè)對(duì)象

可以按照一種類型創(chuàng)建多個(gè)對(duì)象,就像在原始數(shù)據(jù)類型中的情況中一樣。
原始變量的初始化:

int a=10, b=20;

引用變量的初始化:

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

下面再看看一個(gè)例子:

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();
    }
}

上面代碼執(zhí)行得到結(jié)果如下 -

55 
45

真實(shí)的應(yīng)用示例: Account

在本節(jié)的最后部分,我們來看看一個(gè)真實(shí)應(yīng)用中的示例,模擬銀行賬戶轉(zhuǎn)帳的實(shí)現(xiàn)。這里創(chuàng)建一個(gè) 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();
    }
}

上面代碼執(zhí)行得到結(jié)果如下 -

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