gpt4 book ai didi

java - 成员类(内部类)如何访问外部类的实例变量?

转载 作者:行者123 更新时间:2023-11-30 07:03:50 25 4
gpt4 key购买 nike

我在下面编写了运行良好的代码,但我对合成方法有一个疑问。因为这些是为了访问私有(private)数据而生成的。但是我在成员类中使用了外部类的公共(public)实例变量,因此为了访问实例变量,它创建了合成方法(因为它在类文件中!! ).

代码片段如下:

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

类文件生成如下。对于作为 TestInnerClass$A 的内部类 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,但是实例变量是公共(public)的??

最佳答案

不完全确定我理解你的问题,但我会尝试回答它们:

  1. why the display method is having different definition in class files?

你不能像这样比较 java 文件和类文件。某些功能仅存在于一个世界中。内部类就是这样的一个特性。他们没有直接翻译成字节码。一些代码按摩是必要的,这是您在这里发现的。

  1. why in TestInnerClass class file instance variable is accessed as TestInnerClass.this.x. but the same code is different in class file of TestInnerClass$A as this.this$0.x??

因为在编译内部类时,对外部类(TestInnerClass.this)的隐式引用被转换为显式引用。由于此引用不能具有标识符 this,因此它被称为 this$0

  1. why JVM created synthetic method as this$0, however instance variable is public??

这不是一种方法,据我所知,它不是公开的。它是一个存储对封闭类对象的引用的字段。它是访问该对象的 x 所必需的。

关于java - 成员类(内部类)如何访问外部类的实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28090527/

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