内部类

一、关于内部类的定义

将类定义在另一个类的内部,则成为内部类,内部类生成的class文件为:外部类$内部类;

public class Outer {
    int num = 10;
    class Inner{
        int age = 10;
        public void print(){
            System.out.print("内部类");
        }
    }
    public void show(){
        System.out.print("外部类");
    }
}

根据类定义的位置可以分为成员内部类和局部内部类

二、成员内部类的访问方式

1.内部类可以直接访问外部类的成员属性

2.外部类需要访问内部类的成员属性时需要创建内部类的对象

    1)在外部类的成员函数中创建内部类的对象,通过内部类对象直接访问内部类的成员。

    2)在其他类中直接创建内部类的对象。

        Outer.Inner inner = new Outer().new Inner();

三、成员内部类访问细节

1.成员内部类被私有化

  不能在其他类中直接创建内部类

2.成员内部类中有静态成员时,该内部类必须使用static修饰,当成员内部类被static修饰时,可通过类名直接访问静态成员;

   Outer.Inner.静态成员

四、当外部类,成员内部类,成员内部类的成员方法中存在同名成员变量时,在成员方法中该如何访问这三个量?

     1、访问成员方法中量:变量名

     2、访问成员内部类中:this.变量名

     3、访问外部类中:外部类.this.变量名

public class Outer {
    int num = 10;
    class Inner{
        int num= 20;
        public void print(){
            int num = 30;
            System.out.print("num");//30
            System.out.print("this.num");//20
            System.out.print("Outer.this.num");//10
        }
    }
}

五、局部内部类

        包含在外部类的方法的内部的类,则为局部内部类

六、局部内部类的访问:可以在包含内部类的方法中直接创建对象进行访问;

        注意:局部内部类只能访问所在方法的final属性

七、匿名内部类

       就是没有类名的内部类

       作用:简化书写

       格式:

        new 父类或接口(){

            执行代码;

        }

当只有一个调用一个内部类的方法时:

abstract class Inner{
    abstract void show();
}

public class Outer {
    public void print(){
        new Inner() {
            public void show(){
                System.out.print("内部类");
            }
        }.show();
    }
}

当需要调用内部类的两个或以上方法时,可使该类指向一个变量

interface Inner{
    void show1();
    void show2();
}

public class Outer {
    Inner in = new Inner() {
        public void show1() {
            System.out.print("内部类1");
        }

        public void show2() {
            System.out.print("内部类2"); 
        }
    };
        public void print() {
            in.show1();
            in.show2();
        }
    }
原文地址:https://www.cnblogs.com/mercuryji/p/innerclass.html