网上文章都说是传值,有文章如下说
当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。可是我做试验,怎么觉得是传的引用呢
代码如下
Foo.java
public class Foo {
public int bar;
}Test.java
public class Test {
public static void main(String []args) {
Foo f = new Foo();
f.bar = 5;
System.out.println("f.bar=" + f.bar);
func(f);
System.out.println("f.bar=" + f.bar);
} public static void func(Foo p) {
p.bar = 6;
}
}输出结果是
f.bar=5
f.bar=6对象在方法中被改变,这不是传引用的结果吗
当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。可是我做试验,怎么觉得是传的引用呢
代码如下
Foo.java
public class Foo {
public int bar;
}Test.java
public class Test {
public static void main(String []args) {
Foo f = new Foo();
f.bar = 5;
System.out.println("f.bar=" + f.bar);
func(f);
System.out.println("f.bar=" + f.bar);
} public static void func(Foo p) {
p.bar = 6;
}
}输出结果是
f.bar=5
f.bar=6对象在方法中被改变,这不是传引用的结果吗
非基本对象传递的是引用,但这个引用本身是通过值传递来实现的
例如:
public static void tripleSalary(Employee x)
{
x.raiseSalary(100);
}
调用
test=new Employee(...);
tripleSalary(test);
将改变对象中的数据的值,因为此时test和x都指向相同的对象
但是例如:
public static void swap(Employee x,Employee y)
{
Employee temp=x;
x=y;
y=temp;
}
调用
Employee a=new Employee(...);
Employee b=new Employee(...);
swap(a,b);
是不会改变x,y指向的对象的,尽管a和x、b和y指向的是相同的对象,但a,b仅仅是x,y的拷贝
这与c++中的引用a=&x是不同的
---------------------------------- func(f);
System.out.println("f.bar=" + f.bar);
} public static void func(Foo p) {
p.bar = 6;
}那上面的代码根据这句话:
当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。func(f);当调用这个方法传递一个对象时,实际p是f的一个COPY,并把这个引用放到堆栈中,而堆中对象的内容还是一个,复制的只是引用??这时改变p相当于改变了f,因为他们指向同一个对象,只是二个引用。不知道我解释的对不对,呵呵。
是不是这样理解:Employee temp 系统分配空间给temp(相当于C中的指针,该指针指向系统分配的空间);temp=x将x的拷贝放在该分配空间呢?
对于基本数据类型,传递的是数据的拷贝;对于引用类型,传递的引用的拷贝。
基本数据类型直接存储在栈中
传的时候是传堆栈中的数据 所以基本数据类型是传值 而其他是传引用!
我刚学java的学生,不过static功能还是知道的,静态的话就是相当于只有指针(引用或者别的什么?)没有副本了,而且对象前面已经创建了,所以可以直接写入数据了,就这些