关于内部类的知识

看了下内部类,大致对当前学习的做一个小结

内部类,是定义在另外一个类中的类。

使用内部类的原因:

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修饰的内部类被称为类内部类,有的地方也称为静态内部类

原文地址:https://www.cnblogs.com/caoxixi/p/9854528.html