什么是内部类
在Java中,允许一个类定义另一个类,前者称为外部类,后者称为内部类。
Inner Class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
Inner Class的名字不能与包含它的外部类名称相同;
内部类分类:
成员内部类:非静态成员内部类、静态成员内部类;
局部内部类:匿名内部类
成员内部类
成员内部类与外部类的不同点:
可以采用private或protected修饰符修饰;
可以在内部类中调用外部类的成员;
可以使用static关键字修饰,但此时就不能再使用外层类的非静态成员。
成员内部类的特点:
可以在内部定义属性、方法、构造器等成员;
可以直接使用外部类的所有成员,包括私有的数据;
外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式;
可以使用abstract关键字修饰,因此可以被其它的内部类继承;
可以使用final关键字修饰;
编译以后生成的字节码文件格式:OuterClass$InnerClass.class。
注意事项:
外部类或静态成员内部类中可以使用static关键字,而非静态成员内部类中不能使用static关键字;
外部类的静态成员部分使用内部类成员时,可以考虑使用静态内部类。
示例1:
class Outer { private int s; public class Inner { public void inner_method() { s= 100; System.out.println("在内部类Inner中s="+ s); } } public void outer_method() { Inner i= newInner(); i.inner_method(); } } public class InnerTest { public static void main(String args[]) { Outer o= new Outer(); o.outer_method(); } } |
示例2:
public class Outer { private int s= 111; public class Inner { private int s= 222; public void inner_method(int s) { System.out.println(s); ????// 输出局部变量s System.out.println(this.s); ?// 输出内部类对象的属性s System.out.println(Outer.this.s); ??// 输出外部类对象属性s } } public static void main(String args[]) { Outer a= new Outer(); Outer.Inner b= a.new Inner(); b.mb(333); } } |
局部内部类
局部内部类的特点:
局部内部类仍然是一个独立的类,在编译之后局部内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号,以及数字编号;
局部内部类只能在声明它的方法或代码块中使用,而且是先声明后使用,除此之外的任何地方都不能使用该类;
局部内部类可以使用外部类的成员,包括私有的;
局部内部类可以使用外部方法的局部变量,但是必须是final的,由局部内部类和局部变量的生命周期不同所致;
局部内部类和局部变量地位类似,不能使用访问修饰符修饰;
局部内部类不能使用static修饰,因此也不能包含静态成员。
匿名内部类及其特点:
匿名内部类不能定义任何静态成员、方法和类;
匿名内部类必须继承父类(一般为抽象类)或实现接口;
匿名内部类一定是在new的后面,用其隐含实现一个接口或类;
匿名内部类只能创建一个实例。
new 父类构造器(实参列表)| 实现接口 () { //匿名内部类的类体部分 } |
示例:
interface A { public abstract void fun(); } public class Outer { public static void main(String[] args) { new Outer().call_Inner_method(new A(){ @override public void fun() { System.out.println(“implement for fun"); } }); } public void call_Inner_method(A a) { a.fun(); } } ? |