内部类
内部类是定义在另一个中的类,内部类的作用:
1.内部类可以访问该类定义所在的作用域中的数据,包括私有数据
2.内部类可以对同一个包中的其他类隐藏起来
3.当想定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
使用内部类访问对象的状态
一个方法可以引用调用这个方法的对象数据域。内部类既可以访问自身内部的数据域,也可以访问创建它的外围类对象的数据域。为了运行这个程序,内部类的对象总有一个隐式引用,它指向了创建它的外部类对象。
内部类的特殊语法
正规语法OuterClass.this
表示外围类引用。
例如:
public void actionPerformed(ActionEvent vvent)
{
if(Talking.this.been)
{
....
}
}
可以利用outerObject.new.InnerClass(construction parameters)
例如
ActionListener listener=this.new.TimerPrinter;
这里将外围类引用设置为创建内部类对象方法中this引用。
可以通过显示的命名将外围类引用是设置为其他的对象,如果TimerRrinter是一个共有内部类,对于任意的语句都可以构造一个TimerPrinter:
TalkingClock jabberer = new TalkingClock();
TalkingClock.TimerRrinter listener=jabberer.new TimerRrinter();
在外围类的作用域之外,可以OuterClass.InnerClass
。
内部类声明的所有静态域都必须是final。我们希望一个静态域只有一个实例,否则,每个外部对象会分别有一个单独的内部类实例。如果这个类不是final,就不是唯一的。内部类不允许有static方法。
局部内部类
局部类不能使用public和private访问说明符修饰,它的作用域被限定声明在这个局部类的块中。局部类的优势,对外部世界可以完全隐藏起来。并且在内部只有使用它的方法知道这个类的存在
由外部方法访问变量
局部类还有一个优点,不仅能够访问包含他他们的外部类,还可以访问局部变量,不过那些局部变狼必须声明为final,这说明一旦生命无法改变。
匿名内部类
将局部内部类的使用再深入一步,假设之创建这个类的一个对象,就不要命名了。这种类被称为匿名内部类。他的含义是创建一个实现接口的类的新对象,需要实现的方法定义在{}中。通常的语法格式:
new SuperType(construction parameters)
{
inner class methods and datas
}
由于构造器名字必须与类名相同,而匿名类没有类名,所以匿名类不能有构造器。取而代之的是,将构造器参数传递给超类构造器。尤其是在内部类实现接口的时候,不能有任何参数,不仅如此,还提供一组括号
new InterfaceType
{
methods and data
}
如果构造参数的闭小括号后面跟着一个开大括号,正在定义的就是匿名内部类
静态内部类
有时候只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外围类的对象,为此,可以将内部类声明为static,以便取消产生的引用