Java内部类
2018-01-11 21:41 Gizing 阅读(251) 评论(0) 编辑 收藏 举报以下是个人对Java内部类的一些认识,如有错误地方,欢迎大家指出,感谢!
内部类是定义在一个类中的类
- 内部类可对同一个包中的其他类隐藏起来
- 定义一个回调函数且不想编写大量代码时,匿名内部类比较便捷
- 内部类既可以访问自身的数据域和方法,也可以访问创建它的外部类的所有数据域和方法(闭包)
- 只有内部类可以是私有类(private),而常规类只能是包可见性(默认,什么都没写)或公有可见性(public)
- 只有内部类才能声明为static
内部类好处
内部类完善多重继承,即一个类A虽然可以实现多个接口,但是只能继承一个类或抽象类。但是可以让类A的多个内部类分别继承多个类或抽象类,从而实现多重继承。
成员内部类
- 作为外部类的成员变量,外部类要访问内部类的所有成员变量/方法,需要通过内部类的对象来获取
- 成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己
- 在成员内部类要引用外部类对象时,使用
outer.this
来表示外部类对象
局部内部类
- 类定义在方法中,不能用public或private声明,作用域限定在此方法中,外部类的其他代码也无法访问
- 除了能访问外部类,还能访问此方法的局部变量,不过这些局部变量必须是
final
public void start(int a, final boolean flag) { class Inner { public void action() { System.out.println(flag); } } Inner inner = new Inner(); inner.action(); System.out.println(a); }
匿名内部类
- 只创建这个类的一个对象,不必命名(没有类名)
- 由于构造器的名字和类名相同,而匿名类没有类名,所以匿名类不能有构造器
- 匿名内部类的
this
指的是匿名内部类自身,要获得外部类的引用:outerClass.this
,其中outerClass为外部类的类名
public void start(int interval, final boolean beep)
{
ActionListener listener = new ActionListener() //类定义直接跟在接口后面
{
public void action()
{
//do something
}
};
listener.action();
}
public void execute()
{
// an object of an inner class extending Person class
Person count = new Person("lala"){...}
}
静态内部类
- 只是为了把一个类隐藏在另一个类的内部,不能引用外部类里的对象(只能访问外部类的静态数据域和方法)
- 生成一个静态内部类不需要外部类
Outer.Inner in = new Outer.Inner();
- 作为外部类的成员变量,不能放在方法中