java如何使用StringAppend编译字符串添加操作,以及如何定义这样的自建对象的操作行为
----------更新------- 我原以为不会那么简单,但结果证明它可以无缝地工作 它只适用于汽车java如何使用StringAppend编译字符串添加操作,以及如何定义这样的自建对象的操作行为,java,string,char,Java,String,Char,----------更新------- 我原以为不会那么简单,但结果证明它可以无缝地工作 它只适用于汽车String a=“abc”+“c”以及字符串a=“abc”+“a” 我查看了String和CharSequence类的源代码,但还没有找到支持此场景的确切方法 此外,我怀疑可能会有类似于字符串或字符的“+”加号运算符重写的情况,但我不知道在哪里搜索线索 我以这种方式表示怀疑,因为我也是python用户有几年了,并且存在着覆盖像python这样的神奇函数的场景 __add__定义对象作为“+”
String a=“abc”+“c”代码>以及字符串a=“abc”+“a”代码>
我查看了String和CharSequence类的源代码,但还没有找到支持此场景的确切方法
此外,我怀疑可能会有类似于字符串或字符的“+”加号运算符重写的情况,但我不知道在哪里搜索线索
我以这种方式表示怀疑,因为我也是python用户有几年了,并且存在着覆盖像python这样的神奇函数的场景
__add__
定义对象作为“+”或add操作数时的操作。
我只想知道在哪里可以找到java编译的线索String a=“abc”+“c”使用StringBuilder.append()
将>编码为。我只是想看看这个过程发生在哪里。
但知道了这一点,我想我可以知道如何启用自创建对象的行为,当它们是一些基本操作的操作数时
非常感谢。Java编译器透明地转换表达式,如
String str3 = str1 + str2;
到
由于StringBuilder
具有许多数据类型的匹配方法,包括char
,因此可以使用+运算符连接字符串和char
我查看了String和CharSequence类的源代码,但还没有找到支持此场景的确切方法
你找错地方了
此外,我怀疑可能会有类似于字符串或字符的“+”加号运算符重写的情况,但我不知道在哪里搜索线索
可参观的地方有:
- 字节码编译器发出的字节码。您可以使用
javap
命令检查它们。使用-c
选项查看反汇编字节码
- Java语言规范(JLS)明确说明了
+
的含义,并解释了如何允许Java编译器将+
转换为对String
方法的各种不同调用序列。要阅读的部分是
- Java编译器本身的源代码;i、 e.
javac
或第三方同等产品。这将给出编译器在决定如何翻译字符串+
运算符时使用的最终逻辑
事实上,上述内容适用于Java8和更早版本。在Java9/JEP280中,他们改变了使用invokedynamic
来表示串联序列的方式,这样JIT编译器就可以更自由地优化实际的调用序列。见:
在Java9或更高版本中,您需要查看JIT编译器发出的本机代码,以了解串联是如何实际实现的
此外,正如我所更新的那样,我对此表示怀疑,因为在python中重写神奇的方法(如\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu)可以定义对象在执行添加操作时的行为。这与我考虑java中的字符串连接时的情况类似
不要试图用Python知识来理解Java实现。这些语言及其实现非常不同。首先,Java没有与Python的\uuuuuu
方法等价的方法(除了\uuuu init\uuuu
)。Java应用程序不能重载运算符
相反,请阅读Java语言和虚拟机规范。能够将char
与String
连接起来与Character[][]
到char[][]
转换有什么关系?您能给出什么样的输入和输出示例吗?“我怀疑可能会有类似于重写"+“字符串或字符的加号运算符”:您“对此表示怀疑”为什么。。。但我不知道去哪里寻找线索。真的吗?你考虑过查阅Java语言规范吗?@user207421我知道我是Java和here的初学者,所以我的问题可能看起来很愚蠢。我通常会迷失在java语言规范中,很难找到自己的方向,因为英语不是我的第一语言。此外,正如我所更新的那样,我对此表示怀疑,因为在python中重写神奇的方法(如\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu)可以定义对象在执行添加操作时的行为。这和我考虑java中的字符串连接时的情况类似。是的,我明白了,我正在寻找错误的地方。但我真的没有意识到有JLS,可能是因为在中国的网络中人们不经常谈论它。但是我仍然想知道是否有一种方法可以定义我自己对象的+
动作,使它看起来就像int+int
?你不能。Java不支持运算符重载。是的,当然,我会试着分别理解它们,非常感谢你的建议。
StringBuilder sb = new StringBuilder();
sb.append(str1).append(str2);
str3 = sb.toString();