1.内部类的四种类型
内部类的类型分为三种:
1.在外部类(out)的方法体外部定义的内部类(inner)。
2.在外部类(out)的方法体内部定义的内部类(inner)。
3.在外部类(out)的方法体内部定义的隐匿内部类(static Nested Class)
4.在外部类(out)的方法体内部定义的静态内部类(static inner Class)
1.1 定义在方法体外部的内部类
// An inner class
public class Outer{
int index = 0;
public void doSomeThings(){
//do sometings
}
public class Inner{
//方法体的外部定义的内部类
}
}
方法体外部的内部类可以有四种访问权限:public protect friendly private 决定了内部类对于其他类是否可见,内部类可以访问外部类的普通成员属性,内部类也可以在其他地方创建实例对象,但是需要先创造外部类的实例对象然后再创造内部类的实例对象。
// An highlighted block
Outer out = new Outer;
Outer.Inner inner = out.new Inner();
1.2 定义在方法体内部的内部类
// An inner class
public class Outer{
int index = 0;
public void doSomeThings(){
//do sometings
int num1 = 1;
class Inner(){ //定义在方法体内的内部类
public method(){
}
}
}
}
定义在方法体内部的内部类,不能够有访问类型的修饰符,在jdk1.7之前,方法体内的内部类只能够访问方法中的final变量,在1.8中去除了这个限制。
1.3 定义在方法体内部的隐匿内部类
// An static Nested inner class
public class Outer{
int index = 0;
public void doSomeThings(){
//do sometings
int num1 = 1;
Inner inner = new Inner(){//匿名内部类
......
}
}
}
匿名内部类需要实现某个接口或者继承某个类/抽象类,匿名类没有类名,所以没有构造器,语法为:
new SuperType(construction parameters)
{
inner class methods and data
}
外部在引用匿名类的时候,不需要再创建外部类的实例对象,可以直接创造static nested class,语法为:
Outer.Inner inner = new Outer.Inner();
1.4 定义在方法内部的静态内部类
当内部类不需要被外部所引用的时候,可以在类的前面加上static。