【问题标题】:Why is String a class?为什么 String 是一个类?
【发布时间】:2012-10-03 21:54:24
【问题描述】:

如果它可以启动

String s = "Hello";

那为什么它是一个类?参数在哪里?

【问题讨论】:

  • 你的问题已经有足够好的答案了,只需注意你也可以这样做:Integer i = 5;长l = 6L;等等,而 Integer 也绝对是一个类。语法糖。
  • @AssenKolov 它们的实现方式完全不同
  • @AssenKolov 所以基本上,JVM 魔法?从来不知道,谢谢
  • @Steve:当然。看到问题:为什么 xxx 是一个类,如果它可以用这种方式实例化。答案:语法 suger 适用于 String、Integer 等。
  • 字符串实习由语言和 JVM(实习)处理。 Integer i = 5 只是自动装箱(语言)。另外Integer.valueOf 做了一些pollng,但这是由Integer 类处理的。我猜对用户的最终结果是它是语法糖。

标签: java string syntax


【解决方案1】:

鉴于String 是一个非常有用且经常使用的类,它具有用于创建其实例的特殊语法(通过字符串文字表示:"" 中的文本),但在语义上这两者是等价的:

String s = "Hello"; // just syntactic sugar
String s = new String("Hello");

在幕后,两种形式不是 100% 等效,因为使用"" 的语法试图重用Java 字符串池中的字符串,而使用new String("") 的显式实例化总是会创建一个新的对象。

但请不要误会,任何一种语法都会产生对对象实例的引用,字符串在 Java 中不被视为原始类型,并且是类的实例,就像其他任何语法一样。

【讨论】:

    【解决方案2】:
    String s = "Hello"; 
    

    只是语法糖。它实际上是作为引用类型实现的。 (它是一个不可变的引用类型,所以你不能改变它)

    【讨论】:

      【解决方案3】:

      来自§4.3.3 of the Java Specification

      字符串字面量是对 String 类实例的引用。

      来自§3.10.5

      字符串文字是对 String 类实例的引用

      【讨论】:

        【解决方案4】:
        String s = "Hello";
        

        JVM 将其视为:

        String s = new String("Hello"); 并将其实习到 String 池中作为 String 文字。

        【讨论】:

        • 这在技术上是不正确的,因为您的示例创建了两个 String 对象。
        • @LanguagesNamedAfterCofee:不知道你的意思,你能不能更具体一点,以便我更正我的答案。
        • "Hello" String 对象已创建 ||| new String(...) String 对象被创建
        • 我的回答也是这么说的。我刚刚添加了第二行来说明内部发生的情况。我的回答没有说​​“你好”不会在 OP 语法中创建。
        • 他们不一样。 new String 总是创建一个新的字符串对象。 s = "" 检查实习池并返回一个可能已经创建的字符串。
        【解决方案5】:

        您在示例中的行是创建一个 String 对象。没有您想到的任何传统意义上的参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-19
          • 1970-01-01
          • 1970-01-01
          • 2013-02-26
          • 1970-01-01
          • 1970-01-01
          • 2021-11-02
          相关资源
          最近更新 更多