Java是值傳遞還是引用傳遞

前些時(shí)日有人問我Java到底是值傳遞還是引用傳遞哎甲,我的第一反應(yīng)便是“肯定是引用傳遞啊”,然后思考片刻后發(fā)現(xiàn)其實(shí)Java是值傳遞扑馁。

那么如何理解Java中類似引用傳遞的行為呢蹲堂?

  • 首先這要批評(píng)下Thinking In java的作者Bruce Eckel ,他在介紹這塊時(shí)的表達(dá)不清楚或详,導(dǎo)致別人想起問這個(gè)問題系羞。
  • 其次,要搞清楚 引用傳遞霸琴、值傳遞椒振、指針傳遞這三者之間的區(qū)別。

舉個(gè)例子來說明Java是值傳遞梧乘。

public class Student {
    
    int score;
    
    public Student(int score) {
        super();
        this.score = score;
    }
    
    public static void Change(Student s1, Student s2) {
        s1 = s2;
    }
    public static void Change2(Student s1) {
        s1.score = 95;
    }

    public static void main(String[] args) {
        Student s1 = new Student(59);
        Student s2 = new Student(95);
        Student.Change(s1, s2);
        System.out.println(s1.score);       //59
        Student.Change2(s1);
        System.out.println(s1.score);       //95
    }

}

如上面代碼所示澎迎,倘若Java是“引用傳遞”,那么Change()后的結(jié)果應(yīng)該是95选调,但是實(shí)際結(jié)果是59夹供,所以說明Java是值傳遞。

那么類似“引用傳遞”的行為——修改類實(shí)例的屬性該如何解釋仁堪?
在本人的理解中哮洽,Java的類≈C中的結(jié)構(gòu)體[指針],類的實(shí)例≈結(jié)構(gòu)體指針弦聂。因此這種行為應(yīng)看作指針傳遞鸟辅。對(duì)上面代碼用C改寫,就更好理解了横浑。
本人并沒有閱讀過Java實(shí)現(xiàn)源碼剔桨,類的實(shí)現(xiàn)并不是這樣,這里僅僅是為了方便理解而編寫的代碼

#include <stdio.h>
#include <stdlib.h>
typedef struct Student {
    int score;
}Student;
void Change(Student *s1, Student *s2)
{
    s1 = s2;
}
void Change2(Student *s1)
{
    s1->score = 95;
}
int main()
{
    Student *s1 = (Student*)malloc(sizeof(Student));
    s1->score = 59;
    Student *s2 = (Student*)malloc(sizeof(Student));
    s2->score = 95;

    Change(s1, s2);
    printf("%d\n", s1->score);      //59
    Change2(s1);
    printf("%d\n", s1->score);      //95

    return 0;
}

由于Change()沒有修改s1指針指向的空間的值徙融,所以并沒有修改到s1的值洒缀。

因此,Java引用傳遞的說法是不準(zhǔn)確的欺冀。

雖然Java中刻意回避了指針的概念树绩,但是實(shí)際上Java中實(shí)際上還是存在指針的。比如Java的數(shù)組就和C中的數(shù)組一樣隐轩,首地址是類似指針的存在饺饭。

public class ArrayTest {
    public static void changeArray(int a[]) {
        a[1] = 6;
    }
    public static void main(String[] args) {
        int a[] = {1, 2, 3};
        changeArray(a);
        for (int i : a) {
            System.out.print(i + " ");
        }
        // output:  1 6 3 
    }
}

對(duì)于Bruce Eckel的說法,理解成變量是引用型的更為準(zhǔn)確职车。如int a = 1從底層的角度看瘫俊,也可以理解是變量a引用了一個(gè)內(nèi)容為1的地址鹊杖。也就是引用無(wú)處不在(最后一段看不懂就算了,逃

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扛芽,一起剝皮案震驚了整個(gè)濱河市骂蓖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌川尖,老刑警劉巖登下,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叮喳,居然都是意外死亡被芳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門馍悟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畔濒,“玉大人,你說我怎么就攤上這事赋朦÷ǔ澹” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宠哄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我嗤攻,道長(zhǎng)毛嫉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任妇菱,我火速辦了婚禮承粤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闯团。我一直安慰自己辛臊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布房交。 她就那樣靜靜地躺著彻舰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪候味。 梳的紋絲不亂的頭發(fā)上刃唤,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音白群,去河邊找鬼尚胞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帜慢,可吹牛的內(nèi)容都是我干的笼裳。 我是一名探鬼主播唯卖,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼躬柬!你這毒婦竟也來了耐床?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤楔脯,失蹤者是張志新(化名)和其女友劉穎撩轰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧廷,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堪嫂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了木柬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皆串。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖眉枕,靈堂內(nèi)的尸體忽然破棺而出恶复,到底是詐尸還是另有隱情,我是刑警寧澤速挑,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布谤牡,位于F島的核電站,受9級(jí)特大地震影響姥宝,放射性物質(zhì)發(fā)生泄漏翅萤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一腊满、第九天 我趴在偏房一處隱蔽的房頂上張望套么。 院中可真熱鬧,春花似錦碳蛋、人聲如沸胚泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玷室。三九已至,卻和暖如春愕乎,著一層夾襖步出監(jiān)牢的瞬間阵苇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工感论, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绅项,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓比肄,卻偏偏與公主長(zhǎng)得像快耿,于是被迫代替她去往敵國(guó)和親囊陡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法掀亥,類相關(guān)的語(yǔ)法撞反,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法搪花,異常的語(yǔ)法遏片,線程的語(yǔ)...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,520評(píng)論 3 93
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,103評(píng)論 0 62
  • 秋葉落了 初雪也消融了 我依舊愛坐在**路公交車的最后一排 看書 看故事 思考 偶爾扭頭看看窗外 這座城市在我眼里...
    _顧夕涼閱讀 177評(píng)論 1 2
  • 昨天下班前喝了幾口飲料撮竿,被同事們看到了吮便,我拿著飲料瓶一個(gè)勁兒地抱怨:娃哈哈的格瓦斯也忒酸了。有位同事忍無(wú)可忍:你還...
    識(shí)字蘿閱讀 1,412評(píng)論 1 3