天天看點

Java中的對象使用、局部變量與成員變量的差別

對象的使用

對象的使用格式

建立對象:

類名 對象名 = new 類名();

使用對象通路類中的成員:

對象名.成員變量;

對象名.成員方法();

對象的使用格式舉例:

public static void main(String[] args) {
        // 1. 導包。
        // 我需要使用的Student類,和我自己Demo02Student位于同一個包下,是以省略導包語句不寫

        // 2. 建立,格式:
        // 類名稱 對象名 = new 類名稱();
        // 根據Student類,建立了一個名為stu的對象
        Student stu = new Student();

        // 3. 使用其中的成員變量,格式:
        // 對象名.成員變量名
        System.out.println(stu.name); // null
        System.out.println(stu.age); // 0
        System.out.println("=============");

        // 改變對象當中的成員變量數值内容
        // 将右側的字元串,指派交給stu對象當中的name成員變量
        stu.name = "趙麗穎";
        stu.age = 18;
        System.out.println(stu.name); // 趙麗穎
        System.out.println(stu.age); // 18
        System.out.println("=============");

        // 4. 使用對象的成員方法,格式:
        // 對象名.成員方法名()
        stu.eat();
        stu.sleep();
        stu.study();
    }
           

成員變量的預設值

資料類型 預設值
基本類型 整數(byte,short,int,long)
浮點數(float,double) 0.0
字元(char) \u0000'
布爾(boolean) false
引用類型 數組,類,接口 null

對象記憶體圖

一個對象,調用一個方法記憶體圖

Java中的對象使用、局部變量與成員變量的差別

通過上圖,我們可以了解,在棧記憶體中運作的方法,遵循"先進後出,後進先出"的原則。變量p指向堆記憶體中

的空間,尋找方法資訊,去執行該方法。

但是,這裡依然有問題存在。建立多個對象時,如果每個對象内部都儲存一份方法資訊,這就非常浪費記憶體

了,因為所有對象的方法資訊都是一樣的。那麼如何解決這個問題呢?請看如下圖解。

兩個對象,調用同一方法記憶體圖

Java中的對象使用、局部變量與成員變量的差別

對象調用方法時,根據對象中方法标記(位址值),去類中尋找方法資訊。這樣哪怕是多個對象,方法資訊

隻儲存一份,節約記憶體空間。

一個引用,作為參數傳遞到方法中記憶體圖

Java中的對象使用、局部變量與成員變量的差別
引用類型作為參數,傳遞的是位址值。

成員變量和局部變量差別

  • 在類中的位置不同
    • 成員變量:類中,方法外
    • 局部變量:方法中或者方法聲明上(形式參數)
  • 作用範圍不一樣
    • 成員變量:類中
    • 局部變量:方法中
  • 初始化值的不同
    • 成員變量:有預設值
    • 局部變量:沒有預設值。必須先定義,指派,最後使用
  • 在記憶體中的位置不同
    • 成員變量:堆記憶體
    • 局部變量:棧記憶體
  • 生命周期不同
    • 成員變量:随着對象的建立而存在,随着對象的消失而消失
    • 局部變量:随着方法的調用而存在,随着方法的調用完畢而消失