我知道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);
}
}
答案 0 :(得分:3)
传递给u
方法的对象initialize
的引用正在通过值(引用的值)传递。这不会影响u.name
的访问方式。
当您执行u.name = "John"
时,您正在更改传递给方法的u
(通过引用)。这会影响u
方法中的main
。{/ p>
在此图片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)
这是非常简单和重要的部分。
当你编写一个类或使用一个类时,它们不是原始类型。 私有类型按值传递,其余类型不传递。
当你传递一个不是它的引用所发送的变量的变量时,这就像发送在内存中一样。
您在其中所做的任何更改都将更改原始变量