JAVA传递论点

时间:2015-06-19 10:37:00

标签: java

我知道JAVA正在通过值(复制)传递参数。为什么这段代码会返回John?

public class User {
    String name;
    public static void main(String[] args) {
        User u = new User();
        u.name = "Sebastian";
        System.out.println(u.name);
        initialize(u);
        System.out.println(u.name);
    }
    public static void initialize(User u){
        u.name = "John";
        System.out.println(u.name);
        User u2 = new User();
        u2.name="dsafsa";
        u = u2;
        System.out.println(u.name);
        u.name = "Lilly";
        System.out.println(u.name);
    }
}

8 个答案:

答案 0 :(得分:3)

传递给u方法的对象initialize的引用正在通过值(引用的值)传递。这不会影响u.name的访问方式。

当您执行u.name = "John"时,您正在更改传递给方法的u(通过引用)。这会影响u方法中的main。{/ p>

enter image description here

在此图片Person person与您User u方法中的main类似。在initialize内,您User u就像Person anotherReferencetoTheSamePersonObject。因此,更新一个会更新另一个。

答案 1 :(得分:1)

在初始化方法

中创建新用户时,这是范围问题
User u2 = new User();
u2.name="dsafsa";

并将其设置为参数

u = u2;

您只更新方法范围中参数的引用。但是你不要改变在main方法中创建的用户。因为Java按值传递参数(引用的值)。

如果你不改变参数的引用

public static void initialize(User u) {
    u.name = "John";
    System.out.println(u.name);
    // User u2 = new User();
    // u2.name = "dsafsa";
    // u = u2;
    System.out.println(u.name);
    u.name = "Lilly";
    System.out.println(u.name);
}

您真正更新在main方法中创建的用户。因为引用的值始终是main方法中创建的用户之一。

答案 2 :(得分:0)

因为您的案例中的值是指向某个对象的引用。初始化方法中的引用 u 与main函数中的 u 不同,但它们仍然指向同一个对象。

此帖中评分最高的答案详细说明了这一点:Is Java "pass-by-reference" or "pass-by-value"?

答案 3 :(得分:0)

Java总是按值传递参数。

  

也会传入参考数据类型参数,例如对象   方法的价值。这意味着当方法返回时,   传入引用仍引用与以前相同的对象。   但是,可以在中更改对象字段的值   方法,如果他们具有适当的访问级别。[1]

在此处创建一个新的User对象,并按值将其引用传递给initialize方法。因此,你可以参考内部初始化方法 您在main方法中创建的相同对象。这就是原始对象被修改的原因。

这样u.name = "John";修改您在main方法中创建的对象。 u = u2;引用u指向initialize方法中创建的新对象后。因此,u.name = "Lilly"会修改第二个对象。

1 - https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

答案 4 :(得分:0)

主要是u -(1)-> name,当initialize被调用时,您有u' -(2)-> u -(1)-> name,当您u = u2时,参考(2)已更改u' -(2)-> u2 -(3)-> name2 。因此,在u.name = "Lilly";中,您正在更改u2的名称,并且main中的u仍然保持不变。

答案 5 :(得分:0)

上面的许多答案都足够了......再增加一点

Java不支持基本类型的引用传递,以使Java有可能被称为原始类型的包装类,通过它可以构造基本类型的对象并通过引用传递它。

  

什么是包装类?

正如名称所示,包装类围绕数据类型包装(封闭)并为其提供对象外观。无论何处,数据类型都需要作为对象,可以使用此对象。包装类包括解包对象和返回数据类型的方法。它可以与巧克力进行比较。制造商用一些箔或纸包裹巧克力以防止污染。用户拿出巧克力,去掉并扔掉包装并吃掉它。

答案 6 :(得分:-1)

你错了。如果它是原始类型,Java会按值传递参数。作为对象的参数通过引用传递。这意味着,如果您操作作为参数传递给方法的Object,则可以操作相同的Object。

答案 7 :(得分:-2)

这是非常简单和重要的部分。

当你编写一个类或使用一个类时,它们不是原始类型。 私有类型按值传递,其余类型不传递。

当你传递一个不是它的引用所发送的变量的变量时,这就像发送在内存中一样。

您在其中所做的任何更改都将更改原始变量