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
-