【发布时间】:2015-01-22 13:55:44
【问题描述】:
我在下面编写了运行良好的代码,但我对合成方法有一点疑问。因为这些是为了访问私有数据而生成的。但是我有 public instance variable 的外部类在成员类中使用,所以为了访问实例变量它创建了 synthetic method (因为它在类文件中!! )。
代码 sn-p 为:
public class TestInnerClass {
public int x = 10;
public static void main(String[] args) {
TestInnerClass test= new TestInnerClass();
A obj = test.new A();
obj.display();
}
class A {
void display() {
System.out.println(x);
}
}
}
类文件生成如下。 对于内部类 A 为 TestInnerClass$A:
import java.io.PrintStream;
class TestInnerClass$A {
TestInnerClass$A(TestInnerClass paramTestInnerClass) {
}
void display() {
System.out.println(this.this$0.x);
}
}
为 TestInnerClass 生成类文件:
import java.io.PrintStream;
public class TestInnerClass {
public int x = 10;
public static void main(String[] args) {
TestInnerClass test = new TestInnerClass();
TestInnerClass tmp13_12 = test; tmp13_12.getClass(); A obj = new A();
obj.display();
}
class A {
A() {
}
void display() {
System.out.println(TestInnerClass.this.x);
}
}
}
所以我的疑问是:
1)。为什么显示方法在类文件中有不同的定义??
2)。为什么 TestInnerClass 类文件中的实例变量以 TestInnerClass.this.x 的形式访问。但是相同的代码在 TestInnerClass$A 的类文件中与 this.this$0.x??
不同3) 为什么 JVM 将合成方法创建为 this$0,但是 instance 变量是公共的??
【问题讨论】:
-
代码正在运行。我有疑问!!
-
好吧,我很惊讶地看到
new A()可以作为实例的方法调用,如A obj = test.new A();所示。我认为这不是有效的 Java 语法。你每天都会学到新东西。
标签: java inner-classes .class-file java-synthetic-methods