在字符串文字上调用方法 (Java)
Posted
技术标签:
【中文标题】在字符串文字上调用方法 (Java)【英文标题】:Calling methods on string literals (Java) 【发布时间】:2019-09-24 18:23:19 【问题描述】:我知道字符串文字是对象。 根据
https://en.wikibooks.org/wiki/Java_Programming/Classes,_Objects_and_Types
创建对象时,也会创建对该对象的引用。 在 Java 中不能直接访问该对象,只能通过此对象引用。 该对象引用具有分配给它的类型。在将对象引用作为参数传递给方法时,我们需要这种类型。
但是当我们让字面量访问 String 方法时,我们是否违反了这一点?
例如:
System.out.println("Literal".toUpperCase());
这不是直接访问对象吗?而不是通过引用访问对象。
例如:
String x = "Literal";
System.out.println(x.toUpperCase());
【问题讨论】:
你可以看到"Literal"
,就像new String("Literal")
一样。 String
并不是真正的魔法类,它只是使用特定系统创建实例
它的工作方式与在方法 someMethod().doSomething()
的返回值上调用某些东西时非常相似。您没有专用的 name(我的意思是变量)来指向实例,但您仍然有一个由方法返回的实例的 reference。
我发现“无法在Java中直接访问该对象,只能通过此对象引用。”一个无意义且令人困惑的评论(您的问题清楚地表明了该评论是如何令人困惑的)对象引用是标识对象实例的内容。如果你不能识别它,你就不能访问它。没有比这更“直接”的方法了。
请注意:使用文字创建的字符串来自内部字符串缓存(字符串实习)。与 new String(...)
不同,new String(...)
总是会创建一个全新的未缓存值。
@ErwinBolwidt 我猜它是指支持对象的内存,您不能将其作为值访问。但你是对的,使用“对象”这个词是有误导性的。
【参考方案1】:
这不是直接访问对象吗?而不是通过引用访问对象。
不,您仍在使用参考。作为字符串文字的表达式的值是字符串引用。它仍然不是您可以直接访问的对象。
在您的示例中,x
的值仍然是一个引用,除了变量 x
的存在之外,您的两个 sn-ps 是等效的。
【讨论】:
所以字符串文字是对包含字符串文字数据的字符串对象的引用? @omaewa:好吧,我会说“它包含与字符串文字中相同的字符序列”。这并不像涉及额外的间接级别 - 它只是对具有正确内容的字符串的引用。 有趣!这将是java中字符串的一个特殊功能吧? 没那么特别。还有类字面量,空字面量也是一个计算对象引用的字面量。 @omaewa 引用不一定在源代码中可见以上是关于在字符串文字上调用方法 (Java)的主要内容,如果未能解决你的问题,请参考以下文章