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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章