看了也不會系列-函數參數傳遞方式

在開始學習數據結構以前,先對java的變量的特性作一個瞭解java

Java內存管理

名稱 特徵 做用 配置參數 異常
程序計數器 佔用內存小,線程私有,生命週期與線程相同 大體爲字節碼行號指示器
虛擬機棧 線程私有,生命週期與線程相同,使用連續的內存空間 Java 方法執行的內存模型,存儲局部變量表、操做棧、動態連接、方法出口等信息 -Xss StackOverflowErrorOutOfMemoryError
java堆 線程共享,生命週期與虛擬機相同,能夠不使用連續的內存地址 保存對象實例,全部對象實例(包括數組)都要在堆上分配 -Xms-Xsx-Xmn OutOfMemoryError
方法區 線程共享,生命週期與虛擬機相同,能夠不使用連續的內存地址 存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據 -XX:PermSize:16M-XX:MaxPermSize64M OutOfMemoryError
運行時常量池 方法區的一部分,具備動態性 存放字面量及符號引用

這是java最多見內存管理模型,在這篇文章中重點討論的是虛擬機棧和java堆,具體的特徵和做用在表中可見。數組

Java基本數據類型

java的基本數據類型共有8種,即int,short,long,byte,float,double,boolean,char。經過常見的變量聲明方式,好比a=2;來定義。數據結構

當java編譯器運行時,遇到a=2;這一行,它會首先在棧中建立一個變量爲a的引用,而後查找有沒有字面值爲2的地址,有的話則讓a指向2,沒有則開闢一個內存地址存儲2,而後讓a指向這個地址。函數

以上全部操做涉及到底內存區域都是在棧中完成的學習

Java對象類型

當java編譯器運行時,遇到聲明對象的時候,好比 Object a=new Object();,它會在棧區爲a分配內存空間。此時的a是一個引用變量。而後會在堆區分配內存,裏面保存對象的相關數據。最後讓a指向堆區的地址spa

Java函數值傳遞方式

  • 基本數據類型和包裝類型: 方法的入參對於基本數據類型和字符串常量來講,傳遞的其實只是這個值自己的一個拷貝而已,對於外面的變量來講,並無改變什麼,入參的做用域也僅限函數內部,屬於局部變量(對於包裝類型和String,依然如此)
  • 對象類型: 傳遞進去的都是對象的引用的拷貝,而不是值的拷貝(包裝類型傳入的雖然也是引用,可是傳遞進去的仍然是值的拷貝)。拷貝跟原對象指定的是同一塊內存區域,因此在函數裏面改變該內存區域的內容對外面會有一樣的影響和效果。

示例

public class test {
    public static void main(String[] args) {
        int a = 1;
        test(a);
        System.out.println("a的值是:"+a);
        Integer c=2;
        test(c);
        System.out.println("c的值是:"+c);
    }

    public static void test(int b) {
        b = 3;
    }
}
複製代碼

這裏使用基本數據類型和包裝類,能夠看到值並無被更改線程

public class Test {
    public static void main(String[] args) {
        Test1 test1 = new Test1();
        test1.number = 0;
        test(test1);
        System.out.println("test1的number:" + test1.number);
    }

    public static void test(Test1 test1) {
        test1.number = 100;
    }
}

class Test1 {
    int number;
}
複製代碼

這裏使用的是對象,能夠看到屬性被修改了。code

總結

之後的數據結構的學習就基於以上的特色。由於java是面向對象的語言,因此後面不管是哪一種數據結構,都是經過對象和對象嵌套實現的。對象

相關文章
相關標籤/搜索