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、代理
有什么用?
可以在运行时创建一个实现了一组给定接口的新类。
只有在编译时无法确定需要实现哪个接口时才有必要使用。
什么时候用?