为什么Java中需要copyValueOf方法?

3

我正在Tutorials Point上学习Java。那里copyValueOf方法的语法如下。

public static String copyValueOf(char[] data)

它说这个方法是静态的,这意味着它必须使用类名调用。 但是在这里,程序被针对对象调用时仍然可以正常工作,为什么会这样呢?

public class Test {

  public static void main(String args[]) {
    char[] Str1 = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
    String Str2 = "";
    Str2 = Str2.copyValueOf( Str1 );
    System.out.println("Returned String: " + Str2);
  }

}

此外,我觉得将上述的第4行和第5行替换为此内容是多余的。
String Str2 = new String(Str1);

所以,请告诉我它到底有什么用处。

因为静态方法可以在实例上调用,但反过来不成立。 - Federico klez Culloca
6
静态方法指的是与实例无关,而与类有关的方法。您可以从对象或类中调用它,这没有任何区别。唯一的变化是,如果您从对象而不是从类中调用静态方法,则不清楚您正在调用静态方法,因此建议从类中调用它。 - vincrichaud
3
这可能只是一个教育性的例子,不是“有用”的生产代码。它似乎引导你询问它想让你问的问题。 - timgeb
不是直接与您的问题相关,但强烈建议遵循一些命名约定。变量应始终以小写字母开头,以避免类和对象之间的混淆。因此,在您的情况下,请使用“String str2”。 - vincrichaud
可能重复:什么是静态方法和非静态方法的区别。 - user202729
显示剩余3条评论
1个回答

1
静态方法指的是不与实例相关,而与类相关。您可以从对象或类中调用它,这不会改变任何内容。唯一的变化是如果您从对象而不是从类中调用静态方法,则不清楚您正在调用静态方法,因此建议从类中调用。
为了说明这一点,在您的代码中,当您编写str2.copyValueOf(str1)时,不清楚它做什么。因为在对象上调用方法,读者会期望这将对对象进行某些操作,或返回对象的属性,但事实并非如此。 如果您编写String.copyValueOf(str1),读者知道您调用了一个与String相关的静态方法,但该方法不会访问或修改实例,因此读者期望此方法仅返回与str1相关的内容。

在这种情况下,静态方法非常有用,因为它可以防止您在不必要时初始化对象。

String str2 = "";
str2 = str2.copyValueOf(Str1);

在这里,您创建了2个对象。首先是一个空字符串。然后是第二个字符串,其值为str1。第一个初始化是无用的,因为您将在创建它后立即放弃第一个String对象。它会浪费内存。因此,您可以删除初始化。
String str2;
str2 = str2.copyValueOf(str1);

这里的问题是由于您没有初始化str2,系统将其定义为“null”。因此,您无法在其上调用方法。str2.copyValueOf(str1);会抛出NullPointerException异常。但幸运的是,该方法是静态的,因此我们可以直接从类中调用它。代码变为
String str2;
str2 = String.copyValueOf(str1);

注意:这可以缩减为一行,但在执行方面不会改变任何内容:String str2 = String.copyValueOf(str1);

String str2 = String.copyValueOf(str1);String str2 = new String(str1); 没有区别。因为方法 copyValueOf(char[]) 只是调用构造函数 String(char[])。来自 OpenJDK 7 line 2919

 /**
 * Returns a String that represents the character sequence in the
 * array specified.
 *
 * @param   data   the character array.
 * @return  a <code>String</code> that contains the characters of the
 *          character array.
 */
public static String copyValueOf(char data[]) {
    return new String(data);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接