Java之語法之方法調用之地址傳值之空對象(null)

[size=medium][b]一、問題:[/b][/size]



public void test(){
String name = null;
setReference(name);

if(name == null){
System.out.println("name is null");
}

}

private void setReference(String name){
name = "java";
}




[b]輸出:[/b]



// name is null


原因是:

[b]只有非空的引用對象纔可以傳值。[/b]


[size=medium][b]二、Java是引用傳遞還是值傳遞?[/b][/size]





package com.journaldev.test;

public class Test {

public static void main(String[] args) {

Balloon red = new Balloon("Red");
Balloon blue = new Balloon("Blue");

swap(red, blue);
System.out.println("red color="+red.getColor());
System.out.println("blue color="+blue.getColor());

foo(blue);
System.out.println("blue color="+blue.getColor());

}

private static void foo(Balloon balloon) {
balloon.setColor("Red"); // refer to param.

balloon = new Balloon("Green"); // refer to a new object.
balloon.setColor("Blue");
}

//Generic swap method
public static void swap(Object o1, Object o2){
Object temp = o1;
o1=o2;
o2=temp;
}
}

/*

red color=Red
blue color=Blue

blue color=Red

*/




通過上面可以看出,Java 是值傳遞。而傳遞的是一個引用。


“值傳遞”和“引用傳遞”的區別是什麼?

在“一、問題”中,如果由於 String name = null;,此時根本沒有值,
也就是沒有產生新的對象。所以無法進行賦值。
那麼,對於有值的情況呢?

下面這段代碼的輸出是什麼?


public void run(){
String name = "AAA";
setReference(name);

System.out.println(name);
}

private void setReference(String name){
name = "BBB";
}




[b]答案:[/b]

AAA 。

當 "AAA" 被作爲參數傳遞過來時,方法體中的局部變量 name 指向 "AAA",
然後 賦值運算符(=)把新的值 "BBB" 賦給了局部變量 name。

因爲是值傳遞,只不過傳遞的值是一個地址。傳遞的是地址,就叫“地址引用”嗎?
非也。何爲“引用”?“引用”的目地是爲了什麼?顯然,引用到地址,就是想要
對其修改。能夠“引用”到地址,修改地址。這裏的“引用”即爲“修改”之意。

但是,Java方法體內並不會直接在傳遞過來的地址上對其做賦值或修改,
而是在方法體內生成局部變量(參數),指向這個地址。然後對局部變量進行操作。

即:方法體內,只能引用,無法修改。

只能引用參數的值(地址),而不能對這個值(地址)進行修改或賦值操作。
這裏特別需要注意賦值運算符(=)所起的作用。

所以Java是值傳遞。無法修改或修改不了傳遞過來的參數的地址的指向。


[b]Java is Pass by Value and Not Pass by Reference![/b]


引用:

http://stackoverflow.com/questions/14017461/null-reference-in-java


http://www.journaldev.com/3884/java-is-pass-by-value-and-not-pass-by-reference


-
發佈了279 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章