Java 传引用
来源:互联网 发布:网络诈骗心得体会 编辑:程序博客网 时间:2024/06/05 19:57
Java中,对于method是传的引用。用一些小例子才阐述。
更正一下,这里参考了一下几篇文章,众说纷纭。看得我也是迷惑不已,主要是对引用和值的理解。
两条真理:
Truth #1: Everything in Java is passed by value. Objects, however, are never passedat all.
Truth #2: The values of variables are always primitives or references, never objects.
为了方便记忆以及混淆,我们可以这样理解。
凡是参数为基本类型或String, 那么是只是传值,方法中对该值的任何改变不会保留。
凡是参数为对象或对象的属性,那么是传引用,方法中对该对象属性的任何改变都会保留。
代码如下:
public class ParamTest {
public void funcString(String input)
{
input += "123";
}
public void funcInt (int input)
{
input += 1;
}
public void funcObj(Fresher input)
{
input.setName("Changed");
input.setAge(2);
}
public static void main(String[] args)
{
ParamTest pTest= new ParamTest();
//1. Test String
String test = "test";
pTest.funcString(test);
System.out.println(test);
//2. Test primitive types
int num = 1;
pTest.funcInt(num);
System.out.println(num);
//3. Test Object
Fresher fresher = pTest.new Fresher();
pTest.funcObj(fresher);
System.out.println("Fresher: "+fresher.getName()+" "+fresher.getAge());
}
class Fresher
{
private String name;
private int age;
Fresher()
{
name = "init";
age = 1;
}
String getName() {
return name;
}
void setName(String name) {
this.name = name;
}
int getAge() {
return age;
}
void setAge(int age) {
this.age = age;
}
}
}
没加注释哈,不要BS。
1. 对于primitive types:
在上面代码中,本来num是指向stack中的1的,当调用method funcInt(int input)时,它的引用被复制然后赋给input,即二者指向同一快地址。
方法内有input = input +1; 实际上stack中就出现了2,而input就指向这个2.而num却还是指向1的。
当方法退出时,input的指向没有更新给num。所以num依然指向 1.
此时input == num---false!
故打印 1.
2. 对于String
同上。input的指向不会影响到test。
注:String是不可变类。String+=“123”; 编译时会生成一个StringBuilder。最终将更新后的StringBuilder生成的String返回。
此时input == test ---false!
故打印 "test"
3.对于Object
Object比较特殊。input 和 fresher指向同一快地址,在方法里面调用Object自己的方法去更新值,那么Object内部属性变量的指向发生了变化。当方法退出时,input和fresher还是指向相同的地址,即 input == fresher --true!
故打印 Fresher: Changed 2
- Java 传值-传引用?!
- java 中传值 * 传引用
- Java传值&传引用
- Java 传引用
- java传引用笔记
- Java 传值引用
- Java 是传值还是传引用
- Java是传值还是传引用
- Java 是传值还是传引用
- Java是传值还是传引用
- Java是传值还是传引用
- java传值or传引用
- java 传引用 or 传值
- Java是传值还是传引用
- java是传值还是传引用
- java是传值还是传引用?
- Java 传值 vs 传引用
- java是传值还是传引用
- Windows Xp 优化文件 的一段BAT代码
- 守护进程和守护线程
- JDK6 新增窗口最小化至托盘
- 时间动态显示
- Java String
- Java 传引用
- Linux Java安装
- Linux下安装Oracle Application Server 10g
- 在部署JEE程序时可能用到的linux和OAS命令
- Oracle10g Windows下重新安装
- Eclipse常用快捷键
- UNIX网络编程——基于UDP协议的网络程序
- Jboss配置HTTPS说明(转)
- Java keytool 安全证书学习笔记(转)