1、内部类:
有什么用?
1、可以访问该类定义所在作用域中的数据,包括私有数据。
2、当想定义一个回调函数而不想编写大量代码时,使用匿名内部类比较便捷。
3、内部类可以对同一个包中的其他类隐藏起来。
什么时候用?
1、想省代码
2、想访问本类数据
3、想隐藏数据(要写的类,仅被一个类使用一次)
简单内部类举例
:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; /**
* Created by xkfx on 2017/2/12.
*/
public class InnerClassTest{
public static void main(String[] args){
TalkingClock clock = new TalkingClock(1000 , true); //参数改成100系统不响铃
clock.start(); JOptionPane.showMessageDialog(null , "Quit?"); //没有这两行代码,程序无法运行???
System.exit(0);
}
} class TalkingClock{
private int interval;
private boolean beep; public TalkingClock(int interval, boolean beep){
this.interval = interval;
this.beep = beep;
} /**
* Starts the clock
*/
public void start(){
ActionListener listener = new TimePrinter();
Timer t = new Timer(interval , listener);
t.start();
} private class TimePrinter implements ActionListener{ //设置成private就实现了封装 //这里有一个不可见的隐式引用 outer = 外围类对象
//下面的beep等价于 outer.beep
//TimePrinter有一个隐式的构造器 public TimePrinter(TalkingClock clock){ outer = clock; } @Override
public void actionPerformed(ActionEvent e) {
System.out.println("...");
if(beep) Toolkit.getDefaultToolkit().beep(); //内部类可以访问外围类对象的数据域
}
}
}
内部类的语法规则
:
局部内部类
:在一个方法中定义类
匿名内部类
:例如
public void start(int interval, boolean beep)
{
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){
System.out.println("...");
if(beep){
Toolkit.getDefaultToolkit().beep();
}
}
};
Timer t = new Timer(interval, listener);
t.start();
}
如何将静态内部类镶嵌在辅助类中
:
2、代理
有什么用?
可以在运行时创建一个实现了一组给定接口的新类。
只有在编译时无法确定需要实现哪个接口时才有必要使用。
什么时候用?