看了下内部类,大致对当前学习的做一个小结
内部类,是定义在另外一个类中的类。
使用内部类的原因:
1.内部类方法可以访问该类定义所在的作用域的数据,包括私有的数据域
2.内部类可以同时对一个包中的其他类隐藏起来
3.当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类会更加的便捷
使用内部类访问对象的状态
代码如下:
1 package com.caoduanxi.Core; 2 3 import java.awt.Toolkit; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.util.Date; 7 8 import javax.swing.JOptionPane; 9 import javax.swing.Timer; 10 11 /** 12 * 测试内部类 13 * 14 */ 15 public class book246 { 16 public static void main(String[] args) { 17 TalkingClock clock = new TalkingClock(1000, true); 18 clock.start(); 19 JOptionPane.showMessageDialog(null, "Quit program?"); 20 System.exit(0); 21 } 22 } 23 24 class TalkingClock{ 25 private int interval; 26 private boolean beep; 27 28 public TalkingClock(int interval, boolean beep) { 29 super(); 30 this.interval = interval; 31 this.beep = beep; 32 } 33 34 public void start() { 35 ActionListener listener = new TimePrinter(); 36 Timer t = new Timer(interval, listener); 37 t.start(); 38 } 39 //内部类 40 //内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域 beep 41 //内部类不能有static方法 42 public class TimePrinter implements ActionListener{ 43 @Override 44 public void actionPerformed(ActionEvent e) { 45 System.out.println("At the tone, the time is "+ new Date()); 46 if (beep) { 47 Toolkit.getDefaultToolkit().beep(); 48 } 49 } 50 } 51 }
局部内部类,将上述代码稍作改动即可
1 package com.caoduanxi.Core; 2 3 import java.awt.Toolkit; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.util.Date; 7 8 import javax.swing.JOptionPane; 9 import javax.swing.Timer; 10 11 12 public class book250 { 13 public static void main(String[] args) { 14 TalkClock clock = new TalkClock(1000, true); 15 clock.start(); 16 JOptionPane.showMessageDialog(null, "Quit program?"); 17 System.exit(0); 18 } 19 } 20 21 class TalkClock{ 22 private int interval; 23 private boolean beep; 24 25 public TalkClock(int interval, boolean beep) { 26 super(); 27 this.interval = interval; 28 this.beep = beep; 29 } 30 31 //局部内部类不能赢public或者private访问说明符进行声明 32 //作用域被限定在声明的这个局部类的块中 33 //局部类的优势:对外界世界可以完全的隐藏起来 34 public void start() { 35 class TimePrinter implements ActionListener{ 36 @Override 37 public void actionPerformed(ActionEvent e) { 38 System.out.println("At the tone, the time is "+ new Date()); 39 if (beep) { 40 Toolkit.getDefaultToolkit().beep(); 41 } 42 } 43 } 44 ActionListener listener = new TimePrinter(); 45 Timer t = new Timer(interval, listener); 46 t.start(); 47 } 48 }
关于匿名内部类,匿名内部类是局部内部类深入一步的产物
一般的话如果只创建这个类的一个对象的话,就不需要命名了,此时就是使用我们的匿名内部类
1 package com.caoduanxi.Core; 2 3 import java.awt.Toolkit; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.util.Date; 7 8 import javax.swing.JOptionPane; 9 import javax.swing.Timer; 10 11 12 public class book251 { 13 public static void main(String[] args) { 14 TalkClock2 clock = new TalkClock2(); 15 clock.start(1000, true); 16 17 JOptionPane.showMessageDialog(null, "Quit program?"); 18 System.exit(0); 19 } 20 } 21 22 class TalkClock2{ 23 //匿名内部类 24 public void start(int interval, boolean beep) { 25 ActionListener listener = new ActionListener() { 26 public void actionPerformed(ActionEvent e) { 27 System.out.println("At the tone, the time is "+ new Date()); 28 if (beep) { 29 Toolkit.getDefaultToolkit().beep(); 30 } 31 } 32 }; 33 Timer t = new Timer(interval, listener); 34 t.start(); 35 } 36 }
注意由于构造器的名字与类名相同,而你匿名类没有类名,故匿名类没有构造器
相应的处理做法是将构造器传递给超类构造器
静态内部类
如果使用static来修饰一个内部类,这个内部类就属于外部类本身,而不属于外部类的某个对象,因此使用static修饰的内部类被称为类内部类,有的地方也称为静态内部类