【问题标题】:Confusion in passing an object to a function [duplicate]将对象传递给函数时的困惑[重复]
【发布时间】:2014-07-25 10:06:32
【问题描述】:

在学习 C 语言时,我了解到将变量传递给函数时。您没有传递变量本身,而是传递了它的副本,因此实际变量的值不会改变,除非函数返回一个值并将该值分配给变量。 但是我刚刚执行了这个程序,当我将“Newobj”对象传递给“changer”函数然后更改变量的值,然后打印它正在工作的新变量值时,就会发生这种情况。它不应该发生对吗?因为我将“Newobj”的副本发送到“copyobj”。请解释一下,我很困惑。

注意:请详细解释。我的大脑很慢。我知道c的概念和c++的一些概念;

这是我的代码:

public class PassObjects {
int regno;
String name;
double per;

PassObjects(int a,String s,double p){
    regno=a;
    name=s;
    per=p;
}
PassObjects changer (PassObjects copyobj){
    copyobj.regno=797;
    copyobj.name="Srimanth";
    copyobj.per=70.9;
    return copyobj;

}

public static void main(String[] args){

    PassObjects Newobj= new PassObjects(86,"srimanth",85.4);
    System.out.println("The original values of Instance variables are "+Newobj.regno+" "+Newobj.name+" "+Newobj.per);
    Newobj.changer(Newobj);
    System.out.println("The changeed values of Newobj are "+Newobj.regno+" "+Newobj.name+" "+Newobj.per);
}

}

输出在这里:

The original values of Instance variables are 86 srimanth 85.4
The changeed values of Newobj are 797 Srimanth 70.9

【问题讨论】:

  • 在 Java 中 对对象的引用是按值传递的

标签: java function object copy


【解决方案1】:

你正在做的是传递一个指向对象的指针。您正在有效地修改 PassObjects 对象。

引用类型和值类型是有区别的。例如,一个接受整数并对其进行修改的函数确实会收到该整数的副本。

public void add(int x)
{
    x = x + 1;
}

不过,ints 的数组也是引用类型。

当您使用以下代码调用此函数时:

int x = 5;
add(x);
// X will still have a value of 5.

这是因为 x 是一个值类型。您调用该函数并传入整数的副本。

但是,当您创建一个对象时,您不会传递整个对象的副本。请参阅下面的代码。

public void ChangeName(SomeObject x, String newname)
{
    x.name = newname;
}

SomeObject x = new SomeObject("thename");
ChangeNameTo(x, "newname"); // As the comment below pointed out, you don't even have to reassign.
//x.name will have the value "newname" now.

你可以阅读更多herehere

【讨论】:

  • 有效点,已更改答案! :)
【解决方案2】:

Java确实通过引用来操作对象,所有的对象变量都是引用。

这意味着你只创建了一个对同一个对象的新引用,当你更改了值时,它会在实际对象中发生变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多