代码:
class AB{
int i=5;
}
class BC{
public void test(AB a){
a.i=10;
}
}
public class ATest{
public static void main(String aa[]){
AB a = new AB();
//Base class variable value
System.out.println(a.i);
BC b = new BC();
//Modifying the object "a"
b.test(a);
//Printing the base class object
System.out.println(a.i);
}
}
// Output : 5
// 10如果是按值传递,则输出应为5和5
发布于 2013-04-07 01:51:45
Java使用按值传递,但如果参数是一个对象,则Java通过值传递对该对象的引用,因此被调用的方法可以更改对象的内容,而不是整个对象。
这并不意味着对象是通过引用传递的( Joachim Isaksson的注释是错误的)。
添加了来回应Arijeet Saha的评论:
当我说“被调用的方法可以改变对象的内容,而不是整个对象”时,我的意思是,如果你作为一个整体改变了对象,调用者看不到改变。
考虑以下示例:
public void test(Person p) {
p.setName("Pino");
p = new Person();
p.setName("John");
}test()的第一行更改了该方法接收到的对象的内容,第二行更改了整个对象(它将一个新对象赋给了形参),第三行更改了新对象的内容。在本例中,调用者看到的是名为"Pino“而不是"John”的Person对象,因为test()的第二行所做的更改对调用者是不可见的;它不可见是因为对象不是通过引用传递的。
发布于 2013-04-07 02:08:00
让我先弄清楚按值传递是什么意思?
这意味着无论你向一个方法传递什么,它都会收到它的副本,而不是实际的地址。
因此,在本例中,您也是在传递变量a的值,并且它的值(引用对象或对对象的地址)被复制到方法(AB)。
发布于 2013-04-07 01:54:10
Java的参数传递相当棘手--当一个对象被传递给一个函数时,你可以操作该对象的字段,但不能操作对象本身。对象引用是通过值传递的。所以,你可以说:
class someClass{
int i = 5;
}
class Foo
{
static void func(someClass c)
{
c.i = 3;
}
}
class MainClass{
public static void main(){
someClass c = new someClass();
System.out.println(c.i);
Foo.func(c);
System.out.println(c.i);
}
}期望您的输出为:
5
3对c字段的更改仍然存在。
但如果操作对象本身,这种操作将只在Foo.func()中持久存在,而不会在该函数之外存在:
class someClass{
int i = 5;
}
class Foo
{
static void func(someClass c)
{
c.i = new someClass();
c.i = 3;
System.out.println(c.i);
}
}
class MainClass{
public static void main(){
someClass c = new someClass();
System.out.println(c.i);
Foo.func(c);
System.out.println(c.i);
}
}期望您的输出为:
5
3
5发生了什么?c.i在Foo.func()中的MainClass.main()中值为5,c本身被修改为指向包含值3的someClass的另一个实例。但是,此更改不会反映到已传递的实际对象。Foo.func()和MainClass.main()中的c现在是不同的对象。这就是为什么对Foo.func()的c的更改不会影响MainClass.main()中的c。
https://stackoverflow.com/questions/15854032
复制相似问题