java内部类

来源:互联网 发布:大学圈子 知乎 编辑:程序博客网 时间:2024/05/22 03:51

今天刚刚看了内部类,总结下今天的学习内容。

一,内部类:顾名思义可知,内部类是定义在另一个类中的类。

二,使用内部类有一下三个原因:

1,内部类方法可以访问该类定义所在作用域的数据,包括私有数据。

2,内部类可以对同一个包中的其他类隐藏起来

3,当想要定义一个回调函数且不想编写大量代码,使用内部类比较便捷。

三,内部类的隐式引用

书上介绍了这么一个例子,如下:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;


public class InerClassTest{
    
    public static void main(String[] args){
        TalkingClock clock = new TalkingClock(1000,true);
        clock.start();
        
        JOptionPane.showMessageDialog(null,"Quit program?");
        System.exit(0);
    }    
    
}

class TalkingClock{
    
    public TalkingClock(int interval,boolean beep){
            this.interval = interval;
            this.beep = beep;
    }    
    
    public void start(){
        ActionListener listener = new TimePrinter();
        Timer t = new Timer(interval,listener);
        t.start();
        
    }
    
    private int interval;
    private boolean beep;
    //内部类
    public class TimePrinter implements ActionListener{
        
        public void actionPerformed(ActionEvent event){
            Date now = new Date();
            System.out.println("At the tone,the time is"+now)
            if(beep) Toolkit.getDefaultToolKit().beep();
            
        }    
        
    }
    
}

        看上面内部类中红色标注出来的beep,内部类TimePrinter本身没有变量beep,这里引用的是外部类TalkingClock的变量。内部类的对象总有一个隐式引用,他指向了创建他的外部类对象的数据域。如果把内部类对外围类对象的引用称作outer.上面的代码可写成:if(outer.beep).

四,局部内部类

        局部内部类是在方法中声明使用的。如果对一个内部类只使用一次我们可以把它声明为局部内部类。因为局部内部类是在方法内声明的所以在此方法外都不能对他进行访问,包括外部类。局部内部类可以访问包含他的外部类,还可以访问被final声明的局部变量。

       局部内部类不能使用public和private访问说明符进行声明。

下面就是一个局部内部类:

   public void start(){

     //局部内部类

   public class TimePrinter implements ActionListener{
        
             public void actionPerformed(ActionEvent event){
                         Date now = new Date();
                         System.out.println("At the tone,the time is"+now)
                          if(beep) Toolkit.getDefaultToolKit().beep();
            
                   }    
        
     }

            ActionListener listener = new TimePrinter();
            Timer t = new Timer(interval,listener);
            t.start();

     }      

五,匿名内部类

如果在程序中只创建一个类的一个对象,那么我们就可以不用命名,这样的类别称作匿名内部类。

  public void start(){

            //匿名内部类

            ActionListener listener = new ActionListener(){
        
             public void actionPerformed(ActionEvent event){
                         Date now = new Date();
                         System.out.println("At the tone,the time is"+now)
                          if(beep) Toolkit.getDefaultToolKit().beep();
            
                   }    
        
            }; 
    //此处要带分号。
            Timer t = new Timer(interval,listener);
            t.start();

     } 

需要注意的是,匿名内部类没有构造器,如果要传参数要将参数传给其超类,此处是ActionListener(。。。)。

六,静态内部类

如果只想把一个类隐藏在另一个类中,而不引用外部类对象。我们可以将内部类声明为static。

只有内部类可以声明为static。静态内部类除了没有对外部类引用的特权外,与其他内部类完全一样。

class TalkingClock{

         //此类不能引用TalkingClock

         public static class TimePrinter{

        ..........

         }

.............


}



0 0
原创粉丝点击