1. 内部类的概念?
类中类
2. 为什么要用内部类?
内部类的方法可以访问外部类的实例域
内部类对外部类的同一个包中的类实现了隐藏
匿名内部类在“想要定义一个回调函数却又不想编写大量代码”时非常便捷
3. 内部类语法详谈(常规)
1. 内部类与外部类是类之间的关系,不是对象之间的关系
虽然TimePrinter类位于TalkingClock类的内部,但这并不意味着,每个TalkingClock对象都有一个TimePrinter实例域。因为,TimePrinter对象是由start方法构造的,亦即,如果TalkingClock对象不调用start方法,便不拥有一个TimePrinter实例域。
2. 内部类既可以访问自己的数据域,又可以访问创建它的外部类对象的实例域
3. 内部类的隐式引用:指向外部类对象(编译器负责)
if ( beep )——》if ( outer.beep) //outer仅用作示意,编译器内部当然不会是outer
指向外部类的隐式引用在构造器中设置。编译器修改了内部类所有的构造器,添加一个引用外部类的参数。即使并没有定义内部类的构造器,编译器也会为内部类生成一个默认的构造器。如:publicTimePrinter(TalkingClock clock) { outer = clock; }
当在start方法中创建了内部类对象后,编译器就会将this引用传递给当前的构造器
ActionListenerlistener = new TimePrinter(this);
4. 将内部类声明为 private,实现对外隐藏,只有外部类可以构造内部类对象
5. 在外部类的作用域之外引用内部类
outerClass.InnerClass
4. 内部类的特殊语法:如何正确使用外部类引用参数
a) 内部类访问外部类实例域
if( beep )——》if( TalkingClock.this.beep );
b) 内部类构造器
ActionListener listener = this.new TimePrinter();
/* 通过这种方法构造的内部类,它的隐式引用与this指向了同一对象 */
c) 通过显示命名,将外部类引用设置为其他对象
下述代码,在TimePrinter公有的情况下,任意外部类都可以构造一个TimePrinter
TalkingClockjabber = new TalkingClock(1000, true);
TalkingClock.TimePrinter listener = jabber.newTimePrinter();
录自http://blog.csdn.net/Reese1995/article/details/77848502?ref=myread