Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java如何使用StringAppend编译字符串添加操作,以及如何定义这样的自建对象的操作行为_Java_String_Char - Fatal编程技术网

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();