Java是传值还是传引用
来源:互联网 发布:旅游市场调查数据 编辑:程序博客网 时间:2024/05/17 04:47
在Java里参数都是按值来传递的。比较难理解的可能是Java传递的是对象的引用,但这些引用是按值传递。
比如:
01
public
static
void
main( String[] args ){
02
Dog aDog =
new
Dog(
"Max"
);
03
foo(aDog);
04
if
( aDog.getName().equals(
"Max"
) ){
//true
05
System.out.println(
"Java passes by value."
);
06
}
else
if
( aDog.getName().equals(
"Fifi"
) ){
07
System.out.println(
"Java passes by reference."
);
08
}
09
}
10
public
static
void
foo(Dog d) {
11
d.getName().equals(
"Max"
);
// true
12
d =
new
Dog(
"Fifi"
);
13
d.getName().equals(
"Fifi"
);
// true
14
}
在这个例子里面,执行完foo()方法之后,在main方法里再调用aDog.getName()方法依然会返回”Max”,在main方法中的
aDog并没有因为foo()的执行而被重写,这说明了参数是按值来进行传递的。如果是按照引用来传递的话在执行完foo()
方法之后aDog.getName()将会返回”Fifi”。
就像这样:
1
Dog aDog =
new
Dog(
"Max"
);
2
foo(aDog);
3
aDog.getName().equals(
"Fifi"
);
// true
4
5
public
void
foo(Dog d) {
6
d.getName().equals(
"Max"
);
// true
7
d.setName(
"Fifi"
);
8
}
在Java的规范里说明了在Java中一切参数都是按值传递的,根本就没有引用传递这一说。
理解这个概念的关键是要明白
1
Dog myDog;
这里声明的并不是一个Dog对象,而是在栈中声明一个指向Dog对象的指针。
这是什么意思呢,就是当你执行
1
Dog myDog =
new
Dog(
"Rover"
);
2
foo(myDog);
本质上是你把创建好的Dog对象的地址传递给foo方法。(我说的‘本质上’其实是因为Java中的指针并不是直接的地址,不过可以简单的理解成这样)。
假设Dog对象在内存中的地址是42。那我们就是把42这个值传递给了foo方法。
如果foo方法的定义如下:
1
public
void
foo(Dog someDog) {
2
someDog.setName(
"Max"
);
// AAA
3
someDog =
new
Dog(
"Fifi"
);
// BBB
4
someDog.setName(
"Rowlf"
);
// CCC
5
}
执行过程如下:
1. someDog的值设置为42。
2. 在AAA行
a.someDog指向一个内存地址为42的Dog对象。
b.把Dog(内存地址为42)对象的name属性改为Max。
3. 在BBB行
a.一个新的Dog对象被创建,我们假设它的内存地址是74。
b.把这个74的内存地址值赋给someDog。
4. 在CCC行
a.someDog指向一个内存地址为74的Dog对象。
b.把Dog(内存地址为74)对象的name属性改为Rowlf。
5. 方法执行完毕。
现在让我们来想想在这个方法外面发生了什么:
myDog改变了吗?
这个问题的关键在于:
要明确myDog是一个指针,而不是一个实际的Dog对象。所以答案是它没有改变,myDog的值还是42;它指向的还是最开始的那个Dog对象(虽然在foo方法中的AAA行把它指向对象的name属性改成了Max,但是它指向的还是那个最初的Dog对象)。
这验证了改变所指对象的属性,但没有改变其指向。
Java的运行机制跟C很像。你可以给一个指针赋值,然后把这个指针传递给一个方法,之后在这个方法中你可以改变这个指针指向对象的数据,但是你不能改变这个指针的指向。
在C++,Ada,Pascal以及其他支持引用传递的语言中你可以直接改变传递的参数。如果Java是引用传递的话,那么在执行上面定义的foo方法的BBB行的时候someDog的指向就会被改变。
可以把引用参数当成被传递参数的别名,当这个别名被赋值的时候就相当于被传递的参数被赋值。
- Java 是传值还是传引用
- Java是传值还是传引用
- Java 是传值还是传引用
- Java是传值还是传引用
- Java是传值还是传引用
- Java是传值还是传引用
- java是传值还是传引用
- java是传值还是传引用?
- java是传值还是传引用
- Java是传值还是传引用
- java是传值还是传引用
- Java是传值还是传引用
- Java是传值还是传引用
- Java是传值还是传引用
- Java是传值还是传引用?
- Java是传值还是传引用
- Java是传值还是传引用
- java到底是传值还是传引用
- iOS架构设计-URL缓存(上)
- 数组和切片作为函参传递的不同
- 四.SpringBoot集成实例系列-注解型多数据源mybatis
- java程序性能优化之设计优化--设计模式:单例模式(1)
- 安装单个Nginx
- Java是传值还是传引用
- 前后端交互项目总结
- ArcMap坐标转换及投影详解
- 在HTML中使用Javascript (第二章)
- HTML语义化
- 面向对象笔记(Object)
- 面向过程与面向对象的区别
- C++ 服务器与客户端通信 (网络编程)
- codeup-How Many Tables