gpt4 book ai didi

Java 改变变量名改变程序行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:24 24 4
gpt4 key购买 nike

我发现了一个场景,其中 java 程序在重命名变量后表现不同。我知道这实际上不是任何人都会使用的代码,但如果有人知道发生了什么,最好能有一个解释。我在 Eclipse Kepler 上用 Java 1.6 试过这个。

package _test;

public class TestClass{
public static void main(String...args){
Object testClazz$1 = new Object (){
public String toString() {
return "hello";
}
};
TestClass$1 test = new TestClass$1();
System.out.println(testClazz$1.toString());
test.doStuff();
}
}

class TestClass$1{
public void doStuff(){
System.out.println("hello2");
}
}

这个输出:

hello

Exception in thread "main" java.lang.NoSuchMethodError: _test.TestClass$1.doStuff()V at _test.TestClass.main(TestClass.java:13)

据我所知,编译器为 testClazz$1 对象创建了一个 TestClass$1.class 文件,这会导致命名冲突。

但是在将对象重命名为 testClass$1 之后:

package _test;

public class TestClass{
public static void main(String...args){
Object testClass$1 = new Object (){
public String toString() {
return "hello";
}
};

TestClass$1 test = new TestClass$1();
System.out.println(testClass$1.toString());
test.doStuff();
}
}

class TestClass$1{
public void doStuff(){
System.out.println("hello2");
}
}

输出是:

_test.TestClass$1@2e6e1408

hello2

知道这里发生了什么吗?

最佳答案

匿名类是通过在封闭类的名称后附加一个 $ 符号和一个递增的数字来自动命名的。

在您的第一个示例中,匿名类将被命名为 TestClass$1,它没有 doStuff() 方法,您只需覆盖 toString()这就是你得到 NoSuchMethodError 错误的原因。

在您的第二个示例中,您已经有一个名为 TestClass$1 的局部变量,因此编译器选择的自动生成的名称将是一个不同的名称,很可能是 TestClass$2。由于您实例化 TestClass$1 这不是匿名类,而是您显式定义的类,因此将实例化它具有正确打印 doStuff() 方法"hello2" 并且它不会覆盖 Object.toString() 因此打印其 toString() 方法返回的值将打印指定的默认值java.lang.Ojbect(类名后跟一个 @ 符号,后跟十六进制格式的默认哈希码)。

结论:虽然这是一个有趣的示例,但您永远不应在类名和标识符名称中使用 $ 符号。

关于Java 改变变量名改变程序行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24782924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com