【问题标题】:Why does Java allow to assign a string literal to a String object?为什么 Java 允许将字符串文字分配给 String 对象?
【发布时间】:2026-01-14 15:10:02
【问题描述】:

String 是 java 中的一个类。在声明和分配字符串时,说 String name = "Paul" 是正确的,尽管我们要从 java 类中实例化一个对象 String name = new String(); 以name为对象,我想知道为什么我们可以为对象分配一系列字符“保罗”。这个是在什么概念下工作的,它是如何工作的?

【问题讨论】:

  • 它有来自语言本身的“特殊”支持。否则,您将无法做到这一点。
  • Java Language Specifications, section 3.10.5 声明:字符串文字始终是 String 类型。这就是它起作用的原因。
  • @zellus:副本并没有真正很好地回答这个问题,IMO。它并没有真正要求它们之间的区别,而是我们为什么能做到。
  • @jlordo:您介意将其扩展为答案吗?如果你这样做,我会删除我的社区答案。
  • @nhahtdh:编辑了你的答案:P 太懒了,重新开始:D

标签: java string oop


【解决方案1】:

在 Java 代码中

"Paul"

是一个字符串字面量并且

String name

String 类型的变量,名称为 name.

Java Language Specifications, section 3.10.5 声明:

字符串文字的类型始终为String

由于123int 字面量,int number 是类型为int 的变量,名称为number,因此以下两个语句都是合法的,因为作业匹配:

int number = 123;
String name = "Paul";

【讨论】:

    【解决方案2】:

    这是因为隐式字符串 - "..." 也被视为对象。

    在封面下,JVM 在所谓的String pool 中寻找类似的“对象”,然后如果在那里找到它,它会返回该对象(而不是创建新对象),否则会创建新对象并将其放入字符串池。

    这是为了内存效率,和"Paul" 所以new String("Paul") 是不一样的。

    这是可能的,因为我们知道,字符串在 Java 中是不可变的。

    您可以通过搜索关键字“字符串池”来阅读有关此行为的更多信息。

    【讨论】: