Java教程 25 對象執(zhí)行過程

深入理解對象的生命周期

在Java中,對象是通過類(class)的實例化來創(chuàng)建的。理解對象在計算機中的執(zhí)行原理,有助于我們更好地掌握面向?qū)ο缶幊獭?/p>

對象創(chuàng)建的過程

當我們編寫如下代碼時:

Student s1 = new Student("張三", 90, 85);

這行代碼實際上執(zhí)行了以下步驟:

  1. 棧內(nèi)存分配:在棧內(nèi)存中,為Student類型的變量s1分配空間。這個變量將用于存儲對象的引用(即對象的內(nèi)存地址)。

  2. 堆內(nèi)存分配:在堆內(nèi)存中,為Student對象分配空間。這個空間用于存儲對象的屬性和方法。系統(tǒng)為這個對象分配一個唯一的地址,比如0x12345678

  3. 對象構(gòu)造:調(diào)用Student類的構(gòu)造方法(constructor),初始化對象的屬性。在這個例子中,構(gòu)造方法接收三個參數(shù)(姓名、語文成績、數(shù)學(xué)成績),并將它們分別賦值給對象的name、chineseScoremathScore屬性。

  4. 引用賦值:將堆內(nèi)存中對象的地址賦值給棧內(nèi)存中的變量s1。這樣,通過s1就可以訪問和操作堆內(nèi)存中的對象了。

對象訪問的過程

當我們執(zhí)行如下代碼時:

s1.printStudentInfo();

這行代碼實際上執(zhí)行了以下步驟:

  1. 查找引用:在棧內(nèi)存中查找變量s1,獲取它存儲的對象地址。

  2. 訪問對象:根據(jù)對象地址,在堆內(nèi)存中查找對應(yīng)的對象。

  3. 調(diào)用方法:在找到的對象上調(diào)用printStudentInfo方法。這個方法會輸出對象的姓名、總成績和平均成績。

注意事項

  • 對象獨立性:每個對象在堆內(nèi)存中都有自己的獨立空間,因此一個對象的修改不會影響到另一個對象。

  • 引用共享:如果多個變量引用同一個對象,那么這些變量都會指向同一個內(nèi)存地址。因此,通過任何一個變量修改對象的屬性,都會影響到其他變量訪問該屬性時的結(jié)果。

示例代碼及注釋

// 定義一個Student類
class Student {
    // 成員變量(屬性)
    private String name;
    private int chineseScore;
    private int mathScore;

    // 構(gòu)造方法,用于初始化對象
    public Student(String name, int chineseScore, int mathScore) {
        this.name = name;
        this.chineseScore = chineseScore;
        this.mathScore = mathScore;
    }

    // 計算總成績的方法
    public int calculateTotalScore() {
        return chineseScore + mathScore;
    }

    // 計算平均成績的方法
    public double calculateAverageScore() {
        return calculateTotalScore() / 2.0;
    }

    // 打印學(xué)生信息的方法
    public void printStudentInfo() {
        System.out.println("學(xué)生姓名: " + name);
        System.out.println("總成績: " + calculateTotalScore());
        System.out.println("平均成績: " + calculateAverageScore());
    }
}

// 主類,包含main方法
public class Main {
    public static void main(String[] args) {
        // 創(chuàng)建第一個Student對象,并初始化其屬性
        Student s1 = new Student("張三", 90, 85);

        // 調(diào)用s1對象的方法,打印學(xué)生信息
        s1.printStudentInfo();

        // 創(chuàng)建第二個Student對象,并初始化其屬性(注意:這是一個新的對象,與s1無關(guān))
        Student s2 = new Student("李四", 88, 92);

        // 調(diào)用s2對象的方法,打印學(xué)生信息
        s2.printStudentInfo();

        // 示例:多個變量引用同一個對象
        Student s3 = s1; // s3和s1都引用同一個Student對象

        // 通過s3修改對象的屬性
        s3.name = "王五";

        // 再次調(diào)用s1和s3的方法,打印學(xué)生信息(注意:由于s1和s3引用同一個對象,因此輸出會相同)
        s1.printStudentInfo();
        s3.printStudentInfo();
    }
}

注釋說明

  • Student類定義了三個屬性(namechineseScore、mathScore)和四個方法(構(gòu)造方法、calculateTotalScorecalculateAverageScore、printStudentInfo)。
  • Main類的main方法中,我們創(chuàng)建了三個Student對象(s1、s2s3),并演示了對象的創(chuàng)建、方法的調(diào)用以及多個變量引用同一個對象的情況。

四、類和對象的一些注意事項

在面向?qū)ο缶幊讨?,類和對象是核心概念。以下是一些關(guān)于類和對象的注意事項:

  1. 文件命名與public類

    • 一個Java源文件中可以包含多個類,但只能有一個類是public的。
    • 如果源文件中包含public類,則源文件的名字必須與public類的名字相同(包括大小寫)。
  2. 對象的獨立性

    • 每個對象在內(nèi)存中都有自己的獨立空間,因此修改一個對象的屬性不會影響到其他對象。
  3. 引用共享

    • 如果多個變量引用同一個對象,則這些變量都會指向同一個內(nèi)存地址。因此,通過任何一個變量修改對象的屬性,都會影響到其他變量訪問該屬性時的結(jié)果。
  4. 構(gòu)造方法

    • 構(gòu)造方法是用于初始化對象的特殊方法。它的名字必須與類名相同,且沒有返回類型。
    • 如果沒有顯式定義構(gòu)造方法,則Java編譯器會自動提供一個無參數(shù)的默認構(gòu)造方法。但是,如果定義了至少一個構(gòu)造方法,則編譯器不會提供默認構(gòu)造方法。
  5. 封裝

    • 封裝是面向?qū)ο缶幊痰囊粋€重要特性,它通過將對象的屬性和方法結(jié)合在一起,并隱藏對象的內(nèi)部實現(xiàn)細節(jié),只對外提供必要的接口來訪問對象的狀態(tài)和行為。
    • 在Java中,可以使用private關(guān)鍵字來隱藏對象的屬性,并提供public的getter和setter方法來訪問和修改這些屬性。
  6. 繼承

    • 繼承是面向?qū)ο缶幊痰牧硪粋€重要特性,它允許一個類(子類)繼承另一個類(父類)的屬性和方法。
    • 通過繼承,子類可以重用父類的代碼,并實現(xiàn)多態(tài)性。
  7. 多態(tài)性

    • 多態(tài)性允許我們使用父類類型的引用來指向子類對象。這樣,我們就可以在運行時動態(tài)地確定要調(diào)用哪個類的方法。
    • 在Java中,多態(tài)性通常通過方法重寫(子類重寫父類的方法)和接口實現(xiàn)來實現(xiàn)。

通過遵循這些注意事項,我們可以更好地設(shè)計和使用類和對象來構(gòu)建健壯、可維護和可擴展的Java程序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容