Java - 内部类
内部类分为四类:
1. 普通内部类
在类里创建一个普通类
public class InnerClassTest{ public class InnerClassA{ } }
在这里InnerClassA作为InnerClassTest的普通内部类,相当于外部类的一个成员字段。这种情况下,创建内部类对象时要先创建外部类对象,比如创建InnerClassA的对象:
InnerClassTest innerClassTest = new InnerClassTest();
InnerClassA innerClassA = innerClassTest.new InnerClassA();
此时内部类对象可以访问外部类对象,外部类对象也可以通过内部类的引用来访问内部类的对象。
2. 静态内部类
在类里创建一个静态类
public class InnerClassTest{ public class StaticInnerClassA{ } }
因为一个类的静态成员独立于这个类的任何一个对象存在,在具有访问权限的情况下,我们都可以通过类名.静态成员名来访问。同理,静态内部类也是作为外部类的静态成员,创建一个类的静态对象类不需要依赖于外部类对象。比如常见InnerClassTest对象:
InnerClassTest.StaticInnerClassA staticInnerClassA = new InnerClassTest.StaticInnerClassA();
此时静态内部类是无法访问外部类的非静态成员,因为外部类的非静态成员是属于外部类对象的,而静态类独立于对象,所以静态内部类不能访问外部类的非静态成员。 外部类可以访问静态内部类的对象。
3. 匿名内部类
在方法参数中新建一个接口或者类对象,并实现这个接口声明或者类中已有的方法。
public class InnerClassTest{ interface OnClickListener{ void onClick(Object obj); } private void anonymousClassTest{ OnClickListener onclickListener = new OnClickListener(){ @override public void onClick(Object obj){ //to do } } onclickListener.onClick(new Object(){ @override public String toString(){ return "object"; } }); } }
此时匿名内部类中可以使用外部类的属性,但是外部类无法访问匿名内部类的属性,因为外部类无法找到匿名内部类的类名。
4. 局部内部类
声明在一个方法体浊者一段代码块中
public class InnerClassTest{ private void partInnerClassTest{ class A{ } A a = new A(); if(true){ class B{ } B b = new B(); } // B b = new B(); can't use } }
局部内部类只在当前块里起作用,出了代码块,该局部内部类就失效了。同理,局部内部类可以访问外部类对象,但外部类无法访问局部内部类对象。
=========================================================
内部类嵌套:内部类定义内部类
1. 普通内部类:可以嵌套普通内部类、匿名内部类、局部内部类,不可以嵌套静态内部类。
2. 静态内部类:可以嵌套普通内部类、静态内部类、匿名内部类、局部内部类。
3. 匿名内部类:定义方式同普通内部类。
4. 局部内部类: 定义方式同匿名内部类。