内部类定义:是定义在另一个类中的类。 内部类的作用: - 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。
- 内部类可以对同一个包中的其他类隐藏起来。
- 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
内部类点滴: - 只有内部类可以是私有类,而常规类只能具有包可见性或者公有可见性。
- 内部类对象拥有一个对外围类对象的隐式引用,这个引用是通过内部类构造器传递过来的,编译器会对这个构造器进行修改,以便添加一个外围类的引用参数。(注:这是一个编译器行为)
- 内部类的特殊语法规则。OutClass.this引用外部类对象,OuterObject.new InnerClass(args)创建内部类
- 内部类的内部
- 局部内部类。不能用public或者private访问控制符进行声明,引用的局部变量是final的。(想想为什么是final的?因为内部类会备份一份final的局部变量,是为了直到他执行的时候变量的值没有发生变化)
- 静态内部类。使用内部类是为了把一个类隐藏在另一个类的内部,并不需要内部类的引用外围类对象。为此,可以将内部类声明为static,以便取消引用,当然只有内部类可以声明为static,静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他的所有内部类完全一样。
public class CheckBox {
private boolean checked;
//这个内部类是包可见性,只有包含它的外围类和它所在的包中的其他类能访问到它,当然子类也可以访问的到
class OnClickListener{
//虽然是public,由于类本身是包访问权限,所以受限于包权限
public void itemClick(){
System.out.println("我被点击了");
}
}
//不写操作修饰符,默认的是default,包访问权限
boolean isChecked(){
return checked;
}
//这个内部类是完全公开的,可以被外部其他包的类访问
public class onDoubleClickListener{
//可以被访问的到
public void itemClick(){
System.out.println("我被双击了");
}
}
//只可以被外围类访问的到
private class onMouseOverListener{
//受限于类本上是private,所以只有外围类能访问的到
public void itemOver(){
System.out.println("鼠标飘过去了");
}
}
}
|
|