将引用类型变量作为方法参数传递

时间:2010-01-29 23:23:06

标签: java

运行下面的代码后,我得到了这个输出: 前夕 1200

有人能解释一下为什么Person类型变量的值被改变而Integer类型变量的值不是? 我已经读过这个:

  1. www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
  2. www.yoda.arachsys.com/java/passing.html#formal
  3. 但我不明白为什么使用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"; 
        }
    }
    

7 个答案:

答案 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,则会更改Personname

编辑:

编译问题错了。在Java中,引用按值复制。所以在第一种情况下,引用指向不同的内存。在第二种情况下,PersonPerson的一部分。由于您要更改名称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);
}