java内部类
使用内部类的原因
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
- 内部类可以对同一个包中的其他类隐藏起来
- 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷
内部类的对象有一个隐式引用,在内部类中不可见,它引用了实例化该内部类对象的外围类对象。通过这个指针,可以访问外围类对象的全部状态。
局部内部类
当内部类只在外围类的某个方法中使用时,可以定义局部内部类,不能用`public、private`访问说明符声明,作用域为此方法块(本方法内),对外部世界完全隐藏。
public void start(){
class TimePrinter implements ActionListener{
public void actionPerformed(ActionEvent event){
System.out.println("At the time is " + new Date());
if(beep) Toolkit.getDefaultTookit().beep();
}
}
ActionListener listener = new TimePrinter();
Timer t = new Timer(interval, listener);
t.start();
}
局部内部类可以访问本方法内的局部变量(事实上为final
),而普通内部类则不可以访问局部变量
匿名内部类
由于构造器名称与类名要一致,而匿名内部类没有类名,所以他也没有构造器,取而代之的是,将构造器参数传递给超类构造器。
public void start(intinterval, boolean beep){
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){
System.out.println("At the tone, the time is " + new Date());
if(beep) Toolkit.getDefaultToolkit().beep();
}
};
Timer t = new Timer(interval, listener);
t.start();
}
- 双括号初始化
ArrayList<String> friends = new ArrayList<>();
friends.add("Harry");
friends.add("Tony");
invite(friends);//构造friends数组列表,并将其传递给invite()方法
如果不再需要这个数组列表,将其作为一个匿名类
invate(new ArrayList<String>() { //外围大括号表示建立一个匿名类
{//内部大括号代表一个对象构造块
add("Harry");
add("Tony");
}
}
静态内部类
如果只是为了将一个类隐藏在另一个类内部,不需要内部类引用外围类对象,可以使用static
,以便取消产生的引用。
- 与常规内部类不同,静态内部类可以有静态域和方法
- 声明在接口中的内部类自动成为
static
,public
类 new outterClass.staticInnerClass()