zoukankan      html  css  js  c++  java
  • 关于内部类的知识

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

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

    使用内部类的原因:

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

  • 相关阅读:
    vbox下安装centos (全部都是基于64位)
    用php获取js变量的值
    IOS开发帐号与发布问题综合
    深入理解那该死的BOM
    xcode的svn和git使用方法
    编程中神秘的引号(重要)
    photoshop cs6 Mac版本
    开源免费天气预报接口API以及全国所有地区代码!
    [C语言] 数据结构-预备知识指针
    [PHP] apache在worker模式配置fastcgi使用php-fpm
  • 原文地址:https://www.cnblogs.com/caoxixi/p/9854528.html
Copyright © 2011-2022 走看看