Java中内部类分为四种,分别是静态内部类、成员内部类、局部内部类和匿名内部类。下面分别介绍这四种内部类以及相互之间的联系和区别。
(1)静态内部类(static inner class)
①定义方式:
public class OuterClass{//外部类
public static class StaticInnerClass{ } //这个为静态内部类
}
②实例化方式:
OuterClass.StaticInnerClass innerClass = new OuterClass.StaticInnerClass();
③注意事项:
由于此内部类为静态内部类,所以它只能访问外部类中的静态成员变量和静态成员方法,不能访问非静态的成员变量和方法。理解这一点可以类比静态方法。
(2)成员内部类(member inner class)
①定义方式:
public class OuterClass{//外部类
public class MemberInnerClass{ } //这个为成员内部类
}
②实例化方式:
OuterClass.MembetInnerClass innerClass = new OuterClass().new MemberInnerClass();
③注意事项:
由于此内部类为成员内部类,所以它能访问外部类中的所有成员变量和成员方法,包括静态和非静态。理解这一点可以类比普通方法。
***************************************************************************************************************************************************************************************
【对比】静态内部类和成员内部类的实例化方式:
由于静态内部类的对象是属于外部类,而不是属于外部类的对象,所以其实例化时直接通过外部类的类名加内部类的类名来完成。而成员内部类的对象属于外部类的对象,所以其实例化需要通过外部类的对象加内部类的类名来完成。
****************************************************************************************************************************************************************************************
(3)局部内部类(local inner class)
①定义方式:
public class OuterClass{//外部类
public void test(){//外部类中的方法
class LocalInnerClass{ } //局部内部类
//此处实例化局部内部类的方法
}
}
②实例化方式:
由于局部内部类在OuterClass类以外无法访问(理解这一点可以类比方法的局部变量),所以对局部内部类的访问只能在定义该类的方法中完成。
③注意事项:
局部内部类只能访问外部类的final类型的变量。
(4)匿名内部类(anonymous inner class)
①定义方式:
public class OuterClass{
public Strring get(Date date){
return data.toLocaleString();
}
public static void main(String[] args){
OuterClass outerClass = new OuterClass();
String str = outerClass.get(new Date()){
@Override
public String toLocaleString(){
return "hello world";
}//匿名内部类结束
};
}
}
②实例化方式:
由于匿名内部类没有类名,也就没有构造方法,所以无法进行实例化。
③注意事项:
<1>匿名内部类没有类名,没有访问修饰符,没有extends和implements等关键字,也没有构造方法。
<2 >匿名内部类隐式的继承了一个类或者实现了一个接口,上面例子中就是继承了Date类。(继承的类或者实现的接口就是new后面的那个类或者接口)
以上是本人关于内部类的理解,如有不当之处,敬请指正。