一. 内部类的概念
内部类的定义:一个类的定义放在另一个类的内部 内部类作为外部类的一个成员,依附于外部类而存在的
内部类:一个独立的类,生成独立的class文件,文件名格式为:外部类类名·$内部类名
二.内部类的种类
四种类型的内部类:成员内部类,方法内部类,匿名内部类,静态内部类
1.成员内部类 : 在一个包含类中定义的不使用静态修饰符的类型,与成员变量、方法同一个层次,可以访问包含类所有的成员,在包含类中创建成员内部类实例的语法 this.new innerclass(); 在包含类外创建成员内部类实
例的语法。(new Outerclass()).new Innerclass(); 未创建外围对象之前不可能创建内部类的对象。
使用最少的内部类形式,如同局部变量的定义,不允许有访问修饰符。
3.静态内部类:不能与包含类同名, 创建静态内部类实例的语法:
Outer.Inner inner = new Outer.Inner();
若public修辞该内部类,则该内部类可以被其他类继承
4. 匿名内部类:只用到类的一个实例 类在定义后马上用到
*匿名内部类不能有构造方法。
*匿名内部类不能定义任何静态成员、静态方法
*匿名内部类不能是public,protected,private,static
*只能创建匿名内部类的一个实例
*一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个抽象类或一个类
示例:
- //抽象类
- abstract class Person {
- public abstract void showCareer();
- }
- //抽象类的实现-----即正常类
- public class Teacher extends Person{
- @Override
- public void showCareer() {
- System.out.println("Career is Teacher");
- }
- }
- //接口
- public interface Tree {
- void showTreeName();
- }
- public class AnonymousInnerClass {
- public static void main(String[] args) {
- System.out.println("################# 常规");
- normal();
- System.out.println("################# 覆盖父类方法");
- extendsInner();
- System.out.println("################# 抽象类");
- abstractInner();
- System.out.println("################# 接口");
- interfaceInner();
- }
- //覆盖父类方法( 匿名内部类 正常类 的实现 )
- private static void extendsInner() {
- Person person = new Teacher() {
- @Override
- public void showCareer() {
- System.out.println("Career is Worker");
- }
- };
- person.showCareer();
- }
- //匿名内部类 抽象类 实现
- public static void abstractInner() {
- Person person = new Person() {
- @Override
- public void showCareer() {
- System.out.println("Career is lawyer");
- }
- };
- person.showCareer();
- }
- //匿名内部类 接口 实现
- public static void interfaceInner() {
- Tree tree = new Tree() {
- public void showTreeName() {
- System.out.println("This is Apple Tree");
- }
- };
- tree.showTreeName();
- }
- }