【问题标题】:What's the deal with object array in java?java中的对象数组有什么用?
【发布时间】:2020-01-20 10:58:47
【问题描述】:

我知道 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 中肯定不是这种情况。

【问题讨论】:

  • 不确定第二个语句是如何做任何事情的,看到 toUpperCase 应该返回一个新字符串,而不是更改现有字符串......也许我错过了什么?
  • 你还需要name你的方法,目前这不是有效的Java。
  • 但是 OP is 是正确的,因为 obj 的元素可以以对方法调用者可见的方式进行更改。 obj[0] = "A New String"; would do it (assuming that obj` 当然至少包含一个元素)。
  • @AndrewTobilko “句号”是针对观众的,所以他们不认为提问者不知道 java 纯粹是“按值传递”,这是我没有的错字t 写方法名。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    但据我了解,您想知道为什么对象值在方法中发生更改而不是前导数据类型值?

    虽然 Java 严格按值传递,但传递原始类型或引用类型的确切效果不同。

    .

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

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

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

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

    【讨论】:

    • 到“当我们传递一个对象时......”,我要补充一点“数组确实是对象”。
    【解决方案3】:

    如果你像下面那样做只会改变值。

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

    我想因此做出改变。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多