为什么在这个java代码片段中,同一个插入字符串文本有多个值?

为什么在这个java代码片段中,同一个插入字符串文本有多个值?,java,string,reflection,string-pool,Java,String,Reflection,String Pool,我发现这个线程讨论使用反射更改字符串的值 我完全理解这个诀窍,但只做了一些小的改动,就没有预期的效果了 你能解释一下这段代码是怎么回事吗 import java.lang.reflect.Field; 公共类父类{ 静态字符串hello=“hello”; 静止的{ 试一试{ 字段值=hello.getClass().getDeclaredField(“值”); value.setAccessible(true); value.set(hello,“Bye-Bye”.toCharArray());

我发现这个线程讨论使用反射更改字符串的值

我完全理解这个诀窍,但只做了一些小的改动,就没有预期的效果了

你能解释一下这段代码是怎么回事吗

import java.lang.reflect.Field;
公共类父类{
静态字符串hello=“hello”;
静止的{
试一试{
字段值=hello.getClass().getDeclaredField(“值”);
value.setAccessible(true);
value.set(hello,“Bye-Bye”.toCharArray());
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态布尔检查(字符串s){
System.out.println(s++“Hello”);
返回s.equals(“你好”);
}
}

公共类子级扩展父级{
publicstaticvoidmain(字符串[]args)抛出NoSuchFieldException、IllegalAccessException{
System.out.println(check(“Hello”);
}
}
以上代码打印:

你好,再见
假的


为什么字符串literal“Hello”在父类中指的是“Bye Bye”,而在子类中指的是“Hello”?

字符串常量,如文字(“Hello”)、方法名称、导入的常量(公共静态最终字符串)等存储在当前类的常量池中

在子类的主类中,加载父类,初始化静态字段。 然后孩子从它的常量池中加载Hello,并以其他方式实习, 因为值不同。
String.intern
使用
String.equals
,并根据javadoc检查
String.value

你可以试着上一堂爷爷的课,在不同的课上搞个混乱。或者看到父母的问候与实习医生的“再见”完全相同。尽管可能是这样
父级的内部字符串不再可查找,因为哈希代码错误,过时。可以使用相同的哈希代码创建字符串。

请注意,从Java 9开始,字符串处理发生了很大变化(内部编码、字符串重复数据消除等),因此旧的“技巧”可能不再有效。