java中按值傳遞以及引用傳遞對比

原文鏈接:java中按值傳遞以及引用傳遞對比

一、基本類型和引用類型理解

在java中分爲兩種類型:

1、基本數據類型(內置數據類型)

2、引用數據類型


1、基本數據類型(內置數據類型)java提供了八種基本類型,分別爲

byte、shot、int、long、float、double、boolen、char、

2、引用類型

引用類型變量保存引用值,引用的爲對象的內存空間地址,通過‘首個地址’來操作對象。

注意:基本數據類型保存在’棧’中,引用保存在’堆’中,所以"= ="比較的是’棧’是否相等,只有基本類型才能用==來判斷。


二、值傳遞和引用類型的區別

示列1:值傳遞
public class JavaParamsType {
    private static final int num = 5;

    public static void main(String[] args) {

        System.out.println("值引用前__before:" + num);
        JavaParamsType.changeValue(num);
        System.out.println("值引用後__after:" + num);
    }

    //擴大值10倍
    private static void changeValue(int value) {
        value = 10 * value;
        //System.out.println(value);
    }
    }

如上圖代碼輸出結果:

值引用前__before:5、值引用後__after:5

分析:

1):value被num拷貝值爲5

2):value乘10後變爲50,並未指向num此時依然爲5。

3):方法結束後,value被棄用回收。

結論:當傳遞參數爲基本數據類型,方法不可修改一個基本數據類型參數。

示列2:引用調用

private static UserTestBo userTestBo = null;

public static void main(String[] args) {
    userTestBo = new UserTestBo("番茄", "34");
    System.out.println("對象引用前__before:" + userTestBo.getUserName() + userTestBo.getUserAge());
    changeUser(userTestBo);
    System.out.println("對象引用後__aefter:" + userTestBo.getUserName() + userTestBo.getUserAge());
}

//修改值方法
private static void changeUser(UserTestBo user) {
    user.setUserName("土豆");
    user.setUserAge("18");
}

如上圖代碼輸出結果:

對象引用前__before:番茄34、對象引用後__aefter:土豆18

分析:

1)userBo初始引用初始化的地址對象,並賦默認數值。

2)userBo拷貝一份給user,user採用set修改內部值。

3)方法結束後,釋放user對象,而userBo依然指向user對象,且值已修改。

結論:當傳遞參數類型爲引用類型時,一個方法將修改引用對象所指向的值。

 

 

區別:前者不會修改引用對象的值,後者會修改引用對象的值,

雖然以上示例說明:

java存在引用調用,但是java中確實只有按值調用而沒有按引用調用。

之所以能夠修改數據,只是同時指向了一個對象,這依然時按值調用,非按引用調用。

 

 

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