Java 值傳遞Or引用傳遞?that's a question

前言

相信大多數(shù)學(xué)習(xí)java的人都曾有過這樣的疑惑,java參數(shù)傳遞究竟是怎么一回事?
1.是不是傳基本類型就是值傳遞,傳對象就是引用傳遞?。?br> 2.為啥在傳遞引用的方法中,有時形參變化實參跟著變了,有時卻沒有呢?
3.java只有值傳遞?

本文就是圍繞這幾個問題,針對java參數(shù)傳遞進行學(xué)習(xí)歸納與總結(jié)。如有錯誤,敬請指正。

概念

在開始學(xué)習(xí)之前,首先得弄明白什么是值傳遞,什么是引用傳遞?

值傳遞(pass by value)是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣在函數(shù)中如果對參數(shù)進行修改,將不會影響到實際參數(shù)。
引用傳遞(pass by reference)是指在調(diào)用函數(shù)時將實際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)所進行的修改,將影響到實際參數(shù)。

以上概念來自于百度百科,也是網(wǎng)絡(luò)上的主流說法。

思考

1.根據(jù)這個概念,豈不是承認(rèn)了第一個問題:傳基本類型就是值傳遞,傳對象就是引用傳遞?
因為我們知道,基本類型傳遞就是值的拷貝,對象傳遞實際傳遞的是對象的地址的拷貝。
2.如這概念所言,引用傳遞在函數(shù)中對形參就行修改,那實際參數(shù)就會受到影響。為什么對于第二個問題,實際傳遞地址之后,函數(shù)內(nèi)對形參進行修改,實參也未必受到影響啊?
3.地址的拷貝是否算值的復(fù)制從而算值傳遞呢?這不就對應(yīng)了網(wǎng)上的java只有值傳遞的說法嗎?
4.讀到這里,可能對值傳遞、引用傳遞定義產(chǎn)生疑問,再一百度,發(fā)現(xiàn)值傳遞和引用傳遞其實是一種求值策略。然后又產(chǎn)生一系列的疑問...

所以,我想說的是沒必要去扣字眼來糾結(jié)于究竟是值傳遞還是引用傳遞,這些字面上的歧義是很容易將人引入誤區(qū)的,理解了本質(zhì)就行啦

我們來看一下這段測試的代碼:

package com.weixin.javalearingtest;

public class Person {
    int age;
    int height;

    Person(int age,int height){
        this.age=age;
        this.height=height;
    }

    public static void main(String[] args){
        Person alex =new Person(10,10);
        alex.setAge(0);
        alex.newPerson(alex);
        System.out.println("[" + alex.age + "," + alex.height + "]");
        Person army =new Person(9,9);
        System.out.println("[" + alex + "]");
        exchange(alex,army);
        System.out.println("[" + alex.age + "," + alex.height + "]"+"[" + army.age + "," + army.height + "]");
    }

    private void setAge(int age){
        this.age = age;
    }

    private void newPerson(Person a){
        a=new Person(2,3);
    }

    private static void exchange(Person a,Person b){
        System.out.println("[" + a + "]");
        Person temp = a;
        a=b;
        b=temp;
        temp.setAge(120);
        temp=new Person(8,8);
    }

}

運行結(jié)果:

[0,10]
[com.weixin.javalearingtest.Person@42a57993]
[com.weixin.javalearingtest.Person@42a57993]
[120,10][9,9]

顯然,當(dāng)實參是對象時,傳遞給形參的實際是實參對象在堆中地址的拷貝,形參調(diào)用方法改變自身,則實參也跟著改變,而形參的重引用對實參無影響。
于是嘞,我們的結(jié)論就出爐嘍。

結(jié)論

當(dāng)傳遞的參數(shù)是基本類型時,傳遞的是值的拷貝。
當(dāng)傳遞的參數(shù)是引用類型時,傳遞的是實參在堆中地址的拷貝。

當(dāng)參數(shù)是基本類型時,方法無法對其改變。(這其實是基本類型不可變性質(zhì)所決定的)
當(dāng)參數(shù)是引用類型時,可對其進行狀態(tài)的改變,但不可改變其引用。

?著作權(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ù)。

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