java中总共有四种内部类:静态内部类,成员内部类,局部内部类,匿名内部类
1、静态内部类:定义在类内部的静态类
public class Outer{
public static int num = 1;
private String name = "jack";
public static class Inner{
public void do(){}
}
}
这里的Inner就是一个静态内部类,静态内部类可以访问外部类的所有静态变量,不可以访问非静态变量,上面就可以访问num,不可以访问name,静态内部类对象的实例化方法:new 外部类.静态内部类()
Outer.Inner inner = new Outer.Inner();
inner.do();
2、成员内部类(非静态内部类):在类的内部,成员变量位置上的非静态类
public class Outer{
public static int num = 1;
private String name = "jack";
public class Inner{
public void do(){}
}
成员内部类可以访问外部类的所有变量和方法,这里的num和name都可以访问,成员内部类的对象实例化的方法:式外部类实例.new 内部类()
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.do();
相对于静态内部类来说,有几点不同:
(1)成员内部类需要先实例化外部类之后才可以被实例化,而静态内部类可以直接实例化,不依赖外部类实例
(2)静态内部类不需要持有外部类的引用,而成员内部类需要持有外部类的引用
(3)静态内部类只能访问外部类的静态变量和静态方法,成员内部类可以访问外部类的所有变量和方法
3、局部内部类:定义在方法体内部,不能被public、private、protect修饰,只能访问方法中定义的final类型的局部变量
public class Outer{
public static int num = 1;
public void main(){
public final int a = 2;
class Inner{
public void do(){
System.out.println(a); //a必须是final类型
}
}
}
}
定义在普通成员方法中的局部内部类可以访问外部类的所有变量和方法,定义在静态成员方法中的局部内部类只能访问外部类的静态变量和方法,局部内部类的创建方式是在对应方法内,new 内部类()
public static void main(){
class Inner {
}
Inner inner = new Inner();
}
4、匿名内部类:没有名字的内部类,用的较多
public class Outer{
public static int num = 1;
public void test(){
new Service(){
public void run(){
System.out.println(num);
}
}
}.run()
}
interface Service(){
void run();
}
匿名内部类的使用需要满足几个条件:
(1)必须继承一个抽象类或实现一个接口,且完全重写所有抽象方法,匿名内部类不能是抽象的
(2)匿名内部类不能定义静态变量和方法,也没有构造方法
(3)在Java8之前,访问外部类的局部变量时,需要加final,这和局部内部类是一样的,在现在Java8已结取消了这个限制。
匿名内部类的创建主要是new 类/接口{//重写的方法}
上面主要简单介绍了java中的四种内部类的概念,那么为什么要使用内部类,有什么好处呢?
(1)一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据
(2)内部类不为同一包的其他类所见,具有很好的封装性
(3)内部类有效实现了“多重继承”,优化 java 单继承的缺陷
(4)匿名内部类可以很方便的定义回调