参考:http://blog.youkuaiyun.com/qq435757399/article/details/7037007
四种内部类:常规内部类、静态内部类、局部内部类、匿名内部类
1、常规内部类
常规内部类没有用static修饰且定义在外部类类体中,常规内部类可以理解为类中普通的成员变量
(1)常规内部类可以访问外部类的private成员变量和方法
(2)如果要访问内部类,首先要实例化外部类outer,然后调用inner=outer.new Inner()实例化内部类
public Class Outer{
private String x="hello";
Class Inner{
public void innerMethod(){
System.out.println("x="+x);
}
}
}
public static void main(Stirng[] args){
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.innerMethod();
}
输出:
hello
2、静态内部类
使用static修饰的内部类称为静态内部类
(1)静态内部类不能访问外部类的非static成员,也不能用this关键字访问外部类成员
(2)实例化静态内部类可以直接用Outer.Inner inner=new Outer.Inner()进行实例化
public Class Outer{
private static String x="hello";
static Class Inner{
public void innerMethod(){
System.out.println("x="+x);
}
}
}
public static void main(Stirng[] args){
//Outer outer=new Outer();
Outer.Inner inner=new Outer.Inner();
inner.innerMethod();
}
3、局部内部类
在方法体或语句块(包括方法、构造方法、局部快活静态chushihu8a快)内部定义的类称为局部内部类
(1)局部内部类不能加任何访问修饰符(private、protected、public等),也不可以用static修饰,但可以用final和abstract修饰
(2)局部内部类对在方法体中有效,只能在方法体中实例化
(3)方法中的内部类可以访问外部类成员,但是方法中的外部成员必须要有final修饰
(4)static方法中定义的内部类可以访问外部定义的static成员
public class Outer {
private static String x="hello";
public static Object makeInner(int loclaVar){
final int finalLocalVar=loclaVar;
class jubuClass{
public String toString(){
return "finalLocalVar:"+finalLocalVar+" x:"+x;
}
}
return new jubuClass(); //只能在这个方法中实例化这个内部类
}
}
public static void main(String[] args){
` Outer outer=new Outer();
Object obj=outer.makeInner(47);
System.out.println(obj.toString());
}
输出:finalLocalVar:47 x:hello
4、匿名内部类
如果某个类的实例只是用一次,就可以将类的定义和类的创建放在一起,这就是匿名内部类
注:匿名内部类没有名字,必须继承一个父类或者实现一个接口,但是只能实现一个接口,实例化的时候使用的是父类名或者接口名
如:
new ClassOrInterfaceName(){
//类体
}
classOrInterfaceName就是父类名或者接口名
public class Outer {
private static String x="hello";
public static Object makeInner(int loclaVar){
final int finalLocalVar=loclaVar;
return new Object(){
public String objectMethod(){
return "finallocaolvar:"+finalLocalVar;
}
}; //使用匿名内部类
}
}
public static void main(String[] args){
` Outer outer=new Outer();
Object obj=outer.makeInner(47);
System.out.println(obj.toString());
}