Java(9)面向對象概念、對象內存分析、對象引用分析、引用傳遞與垃圾產生分析

面向對象概念

面向對象設計有三個主要的特徵:

  • 封裝性:內部的操作對外部而言不可見,當內部的操作都不可直接使用的時候才安全
  • 繼承性:在已有結構的基礎上繼續進行功能的擴展
  • 多態性:在繼承性的基礎上擴充而來的概念,指的是類型的轉換處理。

類是對每一類事物的共性抽象概念,而對象描述的是一個具體的產物。例如:現在我和某一位先生站在一起,可以立刻區分出我還有別人,因爲我們各自有很多不同的特徵,比如頭髮顏色不相同,衣服顏色不相同,眼睛大小不相同。通過這些可以區分,相比其他國家的人,我和哪位先生都有一個共性的標誌:中國人。人和人之前的不同是依靠他們自身各種的屬性,這些屬性的集合就構成了一個對象,但是所有的屬性都應該是羣體的定義,而羣體的定義就形成了一個類。類是一個模板,而對象纔是類可以使用的實例,先有類再有對象。

在類之中一般有兩部分組成:

  • 成員屬性,比如姓名、年齡
  • 操作方法,比如唱歌、跳舞、跑步

對象內存分析

對象內存分析,是一個很簡化版進行內存分析,是爲了幫助我們快速瞭解對象創建過程。
常用的內存空間:

  • 堆內存:保存對象的基本信息,比如對象屬性的name、age。注意,堆內存是由new關鍵字開闢的。
  • 棧內存:保存的是一塊內存地址

聲明並初始化對象內存分析

1.分析的代碼

class Person{
    String name;
    int age;
    public void info(){
        System.out.println("name =" + name + " age = " + age);
    }
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "ike";
        person.age = 18;
        person.info();
    }
}

2.分析過程

1)程序在棧內存聲明類型爲Person的引用,名爲person。person裏存儲的是內存地址。
2)程序執行到new關鍵字時,在堆內存開闢一塊空間,內存地址是0x112233。
3)程序執行到Person();對開發的空間進行內容聲明,聲明name、age。因爲這時並沒有對name和age賦值,所以name、age是默認值。引用類型默認值是null,整形默認值是0
4) 程序將這塊準備好的內存地址賦值給person
對象實例化流程截圖
5)程序調用引用person爲name賦值
對象實例化流程截圖
6)程序調用引用person爲age賦值
7)程序調用info方法執行。
8)程序結束
在這裏插入圖片描述

聲明與實例化分步完成對象內存分析

通過分析聲明和實例化對象分開,聲明對象引用,這個時候它的默認值爲null。也就是沒有指向任何堆內存空間。

1.分析的代碼

class Person{
    String name;
    int age;
    public void info(){
        System.out.println("name =" + name + " age = " + age);
    }
    public static void main(String[] args) {
        Person person;
        person = new Person();
        person.name = "ike";
        person.age = 18;
        person.info();
    }
}

2.分析過程

1)程序在棧內存聲明類型爲Person的引用,名爲person。person裏存儲的是內存地址。這個時候person引用沒有指向任何空間,所以爲null
在這裏插入圖片描述
2)程序執行到new關鍵字時,在堆內存開闢一塊空間,內存地址是0x112233。程序執行到Person();對開發的空間進行內容聲明,聲明name、age。因爲這時並沒有對name和age賦值,所以name、age是默認值。引用類型默認值是null,整形默認值是0。程序將這塊準備好的內存地址賦值給person
在這裏插入圖片描述
3)程序調用引用person爲name賦值
在這裏插入圖片描述
**4)程序調用引用person爲age賦值
5)程序調用info方法執行。
6)程序結束
在這裏插入圖片描述

對象引用分析

通過引用分析,對於引用類型數據的傳遞實際上引用傳遞,引用傳遞的本質:同一塊內存空間可以被不同的引用指向,也可以更換引用。

1.分析的代碼

class Person{
    String name;
    int age;
    public void info(){
        System.out.println("name =" + name + " age = " + age);
    }
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "ike";
        person.age = 18;
        person.info();
    }
}

引用傳遞與垃圾產生分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章