内部类
一、关于内部类的定义
将类定义在另一个类的内部,则成为内部类,内部类生成的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(); } }