首先推荐一篇内部类讲解详细的博客地址:https://www.cnblogs.com/dolphin0520/p/3811445.html
一.内部类的四种类型
- 成员内部类
- 局部内部类
- 匿名内部类
- 静态内部类
(一)成员内部类是最普通的内部类,直接在一个外部类里面定义一个成员类(即内部类)。
class OutClass
{
class InnerClass
{
private int i;
public InnerClass(int i)
{
i=this.i;
}
public int getI() {
return i;
}
}
public InnerClass Get()
{
return new InnerClass(10);
}
}
成员内部类的初始化方式一般有2种:
- 定义一个外部类的对象,然后用外部类的对象new一个内部类对象。
OutClass out=new OutClass();
OutClass.InnerClass inner=out.new InnerClass(10); - 在外部类里面定义一个方法new一个内部类对象。
OutClass.InnerClass inner=out.Get();
注意点:内部类如果与外部类有相同的方法和字段,则内部类会覆盖外部类的方法和字段,要访问外部类的方法和字段要用:外部类.this.方法和外部类.this.字段来访问。成员内部类可以无条件访问外部类的成语或字段,但外部类访问成员内部类只有通过内部类的对象来访问。成员内部类因为像外部类的一个成员,因此具备四种访问权限,具体访问权限可以理解为一个成员变量。
(二)局部内部类
局部内部类是定义在一个方法内部或者一个作用域里面的类,和成员类相比较的话,可以把成员类比较为一个外部类的成员,局部类则是一个作用域的临时成员,因此不能设置访问权限。
class OutClass
{
int i;
public OutClass Get()
{
class InnerClass extends OutClass
{
int num;
public InnerClass(int num)
{
this.num=num;
}
}
return new InnerClass(10);
}
}
在该测试代码中,返回的内部类上溯造型成一个外部类对象。
(三)匿名内部类
匿名内部类一般继承与抽象类或者接口,重写其中的方法供回调使用,在写事件的监听与维护方面十分方便。
public class Test {
public static void main(String[] args)
{
OutClass out=new OutClass();
IPrint ip=out.Get();
ip.print();
}
}
interface IPrint
{
void print();
}
class OutClass
{
public IPrint Get()
{
return new IPrint() {
@Override
public void print() {
System.out.println("测试");
}
};
}
}
(四)静态内部类
静态内部类可以不依赖于一个外部类对象,可以直接理解为一个外部类的静态成员变量,用外部类.内部类的形式访问。
public class Test {
public static void main(String[] args) {
System.out.println(new OutClass.Inner());
}
}
class OutClass
{
int i;
public static class Inner
{
public static int num=5;
public Inner()
{
System.out.println("------")
}
}
}
总结:除了匿名内部类以外,成员内部类,局部内部类以及静态内部类都可以理解为一个类的类成员,局部变量以及静态成员,作为成员,因此保留着成员的特性,如访问权限等,可以和普通的成员访问一样访问它们,但作为类,它们又拥有类的特性,因此可以把这3种内部类看作为成员与类的结合体,同时拥有着成员与类的特性。