0

代码:

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

4

4 回答 4

2

Java 使用按值传递,但如果参数是对象 Java 会按值传递对对象的引用,因此被调用的方法可以更改对象的内容,而不是整个对象。

这并不意味着对象是通过引用传递的(Joachim Isaksson 的评论是错误的)。

添加以回答 Arijeet Saha 的评论

当我说“被调用的方法可以改变对象的内容,而不是整个对象”时,我的意思是如果你改变整个对象,调用者看不到变化。

考虑以下示例:

public void test(Person p) {
    p.setName("Pino");
    p = new Person();
    p.setName("John");
}

第一行test()更改方法接收到的对象的内容,第二行更改整个对象(它为形参分配一个新对象),第三行更改新对象的内容。在这种情况下,调用者会看到一个Person名为“Pino”的对象,而不是“John”,因为调用者看不到第二行所做的更改test();它不可见,因为对象不是通过引用传递的。

于 2013-04-06T17:51:44.860 回答
1

让我先弄清楚传值是什么意思?

这意味着您传递给方法的任何内容,它都会收到其副本而不是实际地址。

因此,在您的情况下,您也将值传递给变量 a,并且其值(对对象的引用或对对象的地址)被复制到方法(AB a)。

于 2013-04-06T18:08:00.180 回答
0

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

发生了什么事?ci 在MainClass.main()in 中的值为 5 Foo.func(),c 本身被修改为指向 的另一个实例someClass,包含值 3。但是,此更改不会反映到已传递的实际对象中。cinFoo.func()和现在是不同的MainClass.main()对象。这就是为什么更改cofFoo.func()不会影响cin MainClass.main()

于 2013-04-06T17:54:09.510 回答
0

Java 总是按值传递参数。

了解值是什么(变量包含什么)很重要。

对于原语,它是价值本身。

对于对象,它是一个参考。

当您将对象作为参数传递时 - 复制了对该对象的引用,但它仍指向原始对象。

于 2013-04-06T18:13:05.963 回答