运行下面的代码后,我得到了这个输出: 前夕 1200
有人能解释一下为什么Person类型变量的值被改变而Integer类型变量的值不是? 我已经读过这个:
但我不明白为什么使用Person和Integer类型它会有所不同。
public class Test {
public static void main(String[] args) {
Object person = new Person("Adam");
Object integer = new Integer("1200");
changePerson(person);
changeInteger(integer);
System.out.println(person);
System.out.println(integer);
}
private static void changeInteger(Object integer) {
integer = 1000;
}
private static void changePerson(Object person) {
((Person)person).name="Eve";
}
}
答案 0 :(得分:3)
在Java中,primitive types(例如整数)总是由值专门处理,对象(例如您的Person)和数组总是由reference专门处理。
如果传递原语将复制值,如果传递引用类型,则地址将被复制,因此存在差异。
如果你按照上面的链接和/或做一些googlin',你会发现更多。
答案 1 :(得分:2)
在Integer
情况下,您正在更改参数本身的值(该方法的本地值)。在Person
情况下,您正在更改参数内字段的值。该字段是对象的一部分,因此它对调用者可见。
答案 2 :(得分:1)
在changeInteger()
中,当您执行integer = 1000时,将创建一个新对象并为其指定一个局部变量整数。
所以,如果你这样做
person = new Person();
person.name="Eve";
changePerson()
中的
您将获得与整数相同的行为。
PS:一旦将旧引用分配给函数内新创建的对象,旧引用就会丢失。
答案 3 :(得分:1)
仅供将来参考,在这种情况下,接受的答案不是正确的答案(尽管链接确实提供了足够的信息以获得正确的答案)。 OP问题与原始对象和对象无关。在给出的示例代码中,没有使用原语,整数和人都是完整对象。以下答案的答案更有帮助。关键是参数变量(即用于存储方法中传入参数的变量)被赋予方法调用中使用的变量的当前值。对象通过Java引用存储,因此它们指向对象而不是直接存储对象。因此,方法中的参数变量被赋予此指针地址,并使用它来访问对象详细信息。因此,如果方法更改了对象,则这与调用代码指向的对象相同,因此两个位置都将看到更改。在整数示例中,当您说integer = 1000时,它将使用指向新Integer对象的新指针覆盖传入的指针 - 您已丢失与原始对象的连接。
注意,创建Integer对象后无法更改它(例如没有.setValue()方法),因此无法以可能更改原始Integer对象的方式编写代码。
答案 4 :(得分:0)
下面的代码编译?它需要演员。
private static void changeInteger(Object integer) {
integer = 1000;
}
如果integer
嵌入另一个object
,则会更改Person
。 name
。
编辑:
编译问题错了。在Java中,引用按值复制。所以在第一种情况下,引用指向不同的内存。在第二种情况下,Person
是Person
的一部分。由于您要更改名称Person
而不更改name
,因此{{1}}中的更改会反映在方法外部。希望这会有所帮助。
答案 5 :(得分:0)
在changeInteger()
方法中,您将一个全新的对象(1000)分配给引用变量integer
。但integer
方法中的引用变量main()
仍然指向旧对象(1200)。因此main()方法中的print()语句打印旧值(1200)
但是,在changePerson()
方法中,引用变量person
仍然指向旧对象。只是其中一个领域的价值正在发生变化。
Aslo,请记住Integer(以及其他原始包装器)是可变的。只要您需要为ref var分配新值,JDK就会创建一个全新的对象。
希望这有帮助!
答案 6 :(得分:0)
在changePerson()中,您可以通过其公共名称属性更改给定对象本身。 在changeInteger()中,您可以更改本地Integer对象;
放一个System.out.println(整数);在changeInteger()函数中,您将看到Integer发生了变化,但仅在函数范围内发生..
private static void changeInteger(Object integer) {
integer = 1000;
System.out.println(integer);
}