首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java引用传递问题

Java引用传递问题
EN

Stack Overflow用户
提问于 2011-09-15 19:57:55
回答 3查看 445关注 0票数 1

可能重复:

Is Java pass by reference?

我这里有一节课:

代码语言:javascript
复制
public class Cat { 
    private String catNum;

    private static Cat cat1;
    private static Cat cat2;


    public Cat(String catNumber) {
        catNum = catNumber;
    }

    public static void change(Cat cat1, Cat cat2) {  
        Cat temp = cat1;
        cat1 = cat2;
        cat2 = temp;
    }

    public String toString() {
        return "cat number: " + catNum;
    }

    public static void main(String[] args) {
        cat1 = new Cat("1");   
        cat2 = new Cat("2");  
        System.out.println("cat1=" + cat1);  
        System.out.println("cat2= " + cat2);
        change(cat1, cat2);
        System.out.println("cat1=" + cat1);  
        System.out.println("cat2= " + cat2);
    }
}

我想让change()函数正常工作。我知道这是关于通过引用传递对象的一些问题,但不确定如何修复它。谁来帮帮忙。

EN

回答 3

Stack Overflow用户

发布于 2011-09-15 20:02:03

您的问题是java是通过值传递的,而不是引用。因此,您不能像以前那样编写交换函数。

你可以做这样的事

代码语言:javascript
复制
class CatContainer {
    Cat cat1;
    Cat cat2;

    CatContainer(Cat cat1, Cat cat2) {
       this.cat1 = cat1;
       this.cat2 = cat2;
    }
    ...
}

然后有一个方法

代码语言:javascript
复制
public static void swapCatsInContainer(container) {
    Cat tmp = container.getCat1();
    container.setCat1(container.getCat2());
    container.setCat2(tmp);
}

差不多是这样的。现在,在称为swapCatsInContainer、cat1和cat2的范围内进行交换。

票数 3
EN

Stack Overflow用户

发布于 2011-09-15 20:01:11

您拥有名为cat1和cat2的change()参数和类变量。如果你重新命名一套,我想你会看到发生了什么。如果没有,请删除评论。

票数 2
EN

Stack Overflow用户

发布于 2011-09-15 22:53:39

你的范围有问题。

每个方法都将其参数定义为它们自己的引用。传入的值分配给方法签名中定义的引用。方法签名本质上是在调用方法时被赋值的局部变量的声明。这就是其他答案所指的“通过价值传递”。

代码语言:javascript
复制
private static Cat cat1;  // < this cat1 and cat2 are
private static Cat cat2;  //   never referred to

public static void change(Cat cat1, Cat cat2) {  
    Cat temp = cat1; //         ^         ^
    cat1 = cat2;     // < cat1--'         |
    cat2 = temp;     // < cat2 means------'
}

如果有帮助的话,你可以这样想:

代码语言:javascript
复制
// pseudo code
method change() {
    Cat cat1 = method.Argument[0];
    Cat cat2 = method.Argument[1];
    ...
}

通过写入cat1和cat2,您只需写入定义为方法签名一部分的局部变量。您没有写入相同名称的静态作用域变量。

要使代码正常工作,可以显式引用静态值。

代码语言:javascript
复制
public static void change(Cat cat1, Cat cat2) {
    Cat.cat1 = cat2;  // cat1 and cat2 are static
    Cat.cat2 = cat1;  // i.e. defined on the class
}

或者你可以给他们重新命名。

代码语言:javascript
复制
public static void change(Cat c1, Cat c2) {  
    cat1 = c2;
    cat2 = c1;
}

或者,由于它们是静态的,所以可以完全取消方法参数。

代码语言:javascript
复制
public static void change() {
    Cat temp = cat1;
    cat1 = cat2;
    cat2 = temp;
}

注意,只有最后一个仍然需要temp变量。

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

https://stackoverflow.com/questions/7436761

复制
相关文章

相似问题

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