在字符串文字上调用方法 (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)的主要内容,如果未能解决你的问题,请参考以下文章

在浏览器中调用 Java 方法

如何在Android平台上使用JS直接调用Java方法

在方法中调用方法以在 Ruby 中进行 Titleize

scala在Java中调用scala方法

scala在Java中调用scala方法

将方法名称作为字符串给出时,如何调用 Java 方法?