Java中的对象数组有什么处理?

时间:2019-09-19 11:56:20

标签: java arrays pass-by-reference pass-by-value

我知道java是按值传递的,是句点。但是,我仍然不知道这一点。

public static void changeTheName(String obj){
 obj.toUpperCase();
}

此方法不会影响原始的字符串对象,完全可以理解。因为字符串是不可变的,并且字符串文字的更改意味着引用变量现在将引用新对象,而旧变量将留给垃圾收集器。但是,当我传递字符串数组时,我可以更改字符串文字,这意味着我可以更改引用。为什么在数组上发生这种情况,因为如果我们做obj [] = new String [] {},它将不会影响原始数组,而原始数组仍然引用旧数组,这类似于直接更改字符串文字。

public static void ChangeTheName(String obj[]){
 for(int i=0;i<obj.length();i++) obj[i]=obj[i].toUpperCase;
}

编辑: 我一直在寻找的答案是obj和obj [0]的引用是唯一的,这就是第二种方法能够更改数组的全部内容的原因。因为我来自C背景,所以我认为obj和obj [0]具有相同的引用,但是肯定不是Java中的情况。

3 个答案:

答案 0 :(得分:1)

toUpperCase不会更改字符串,它会返回一个新的大写字符串。

答案 1 :(得分:1)

@karthikdivi说-toUpperCase()不会更改字符串。它返回一个大写的新字符串。

但是据我所知,您想知道为什么在方法中更改了对象值,但没有更改原始数据类型的值吗?

尽管Java严格按值传递,但传递原始类型还是引用类型的精确效果有所不同。

当我们将原始类型传递给方法时,它会按值传递。但是,当我们将对象传递给方法时,情况发生了巨大变化,因为对象是通过有效的按引用调用传递的。 Java做了一件有趣的事情,即按值传递和按引用传递之间的混合。基本上,函数无法更改参数,但是函数可以通过调用其中的某些方法来要求参数更改自身。

在创建类类型的变量时,我们仅创建对对象的引用。因此,当我们将此引用传递给方法时,接收该方法的参数将指向与参数所引用的对象相同的对象。

这实际上意味着对象的行为就像通过引用调用将它们传递给方法一样。

对方法内部对象的更改会反映在用作参数的对象中。

答案 2 :(得分:0)

如果您执行以下操作,只会更改该值。

public static void(String obj[]){
 for(String s:obj) {
   s=s.toUpperCase();
  }
}

我认为可以做出改变。