首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java支持按值传递。但是我不能理解下面代码的原因

Java支持按值传递。但是我不能理解下面代码的原因
EN

Stack Overflow用户
提问于 2013-04-07 01:39:19
回答 4查看 97关注 0票数 0

代码:

代码语言:javascript
运行
复制
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

EN

回答 4

Stack Overflow用户

发布于 2013-04-07 01:51:45

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

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

添加了来回应Arijeet Saha的评论:

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

考虑以下示例:

代码语言:javascript
运行
复制
public void test(Person p) {
    p.setName("Pino");
    p = new Person();
    p.setName("John");
}

test()的第一行更改了该方法接收到的对象的内容,第二行更改了整个对象(它将一个新对象赋给了形参),第三行更改了新对象的内容。在本例中,调用者看到的是名为"Pino“而不是"John”的Person对象,因为test()的第二行所做的更改对调用者是不可见的;它不可见是因为对象不是通过引用传递的。

票数 2
EN

Stack Overflow用户

发布于 2013-04-07 02:08:00

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

这意味着无论你向一个方法传递什么,它都会收到它的副本,而不是实际的地址。

因此,在本例中,您也是在传递变量a的值,并且它的值(引用对象或对对象的地址)被复制到方法(AB)。

票数 1
EN

Stack Overflow用户

发布于 2013-04-07 01:54:10

Java的参数传递相当棘手--当一个对象被传递给一个函数时,你可以操作该对象的字段,但不能操作对象本身。对象引用是通过值传递的。所以,你可以说:

代码语言:javascript
运行
复制
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);
  }
}

期望您的输出为:

代码语言:javascript
运行
复制
5
3

对c字段的更改仍然存在。

但如果操作对象本身,这种操作将只在Foo.func()中持久存在,而不会在该函数之外存在:

代码语言:javascript
运行
复制
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);
  }
}

期望您的输出为:

代码语言:javascript
运行
复制
5
3
5

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15854032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档