内部类访问外部类的属性的原理
来源:互联网 发布:淘宝联盟 退运费 福袋 编辑:程序博客网 时间:2024/04/26 15:45
先看一个内部类访问外部类属性的例子,代码如下:
public class InnerClassTest {public static void main(String[] args) {// TODO Auto-generated method stubTalkingClock tk = new TalkingClock(true);tk.start();}}class TalkingClock{private boolean beep;public TalkingClock(boolean beep){this.beep = beep;}public void start(){TimePrinter listener = new TimePrinter();listener.stop();}public void show(){System.out.print(" world");}public class TimePrinter {public void stop(){if(beep){System.out.print("Hello");show();}}}}
在内部类TimerPrinter的stop方法中通过外部类的Talkingclock的属性beep值来判断并打印出结果
<span style="font-size:18px;">public class TalkingClock$TimePrinter{final TalkingClock this$0;public void stop(){if (TalkingClock.access$0(TalkingClock.this)){System.out.print("Hello");this$0.show();}}public TalkingClock$TimePrinter(){this$0 = TalkingClock.this;super();}}</span>
我们可以看到,编译器为了引用外部类,生成了一个附加的实例this$0,并生成了默认的构造函数初始化this$0,其中
TalkingClock.this是外部类的引用,但是access$0这个静态方法是哪来的呢,我们看一下Talking.class
<pre name="code" class="java"><span style="font-size:18px;">class TalkingClock{private boolean beep;public TalkingClock(boolean);static boolean access$0(TalkingClock);public void start();}</span>
编译器为我们生成了静态方法access$0它的返回值就是beep的值,这样子就解释了为什么在内部类中的beep变成了TalkingClock.access$0(TalkingClock.this)
0 0
- 内部类访问外部类的属性的原理
- 内部类可以访问外部类的属性
- java 内部类如何访问外部类的同名属性
- 内部类访问外部类的实例
- 外部类类名.this.varName 访问外部类实例属性 ; 通过 this.varName 访问外内部类实例的属性
- 内部类对外部内成员属性以及方法的访问
- 外部类能访问内部类的成员
- 内部类访问外部类变量的问题
- 外部类可以访问内部类的私有成员
- 内部类访问外部类变量的问题
- 内部类和外部类的访问细节
- App8_14_内部类与外部类的访问规则
- 为什么内部类可以访问外部类的成员
- Java内部类为什么可以访问外部类的成员
- 外部类可以自由访问内部类的private方法
- 为什么内部类可以访问外部类的变量
- 内部类是如何访问外部类私有对象的
- 探究外部类访问内部类的可行性
- WDF DMA 一些概念(一)
- 相对路径与绝对路径以及斜杠与反斜杠的区别
- jsp中实现带滚动条的table表格
- CSS基本语法和选择器
- hive
- 内部类访问外部类的属性的原理
- 获得当前选择的控制器
- 求mat的连通域,并只显示最大轮廓的连通域
- Android 定义全局LOG打印日志,并显示调用者相关信息
- uva191 Intersection(线段之间相交)
- 直接量
- 监听通知,在程序退出前要移除
- 字符串排序 nyoj 1149
- BZOJ4386: [POI2015]Wycieczki