java内部类,匿名内部类这些是什么?求详细用法,还有语法。

 我来答
DK小黑
推荐于2017-11-26 · TA获得超过339个赞
知道小有建树答主
回答量:96
采纳率:100%
帮助的人:84.2万
展开全部

一、内部类:

内部类是定义在另一个类中的类,使用它的原因主要有3个:

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

  • 内部类可以对同一个包中的其他类隐藏以来;

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

【举例:《Java核心技术(卷I)》,6.4节——内部类,程序清单6-6】

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

/**
 * This program demonstrates anonymous inner classes.
 * @version 1.10 2004-02-07
 * @author Cay Horstmann
 */
public class InnerClassTest
{
    public static void main(String[] args)
    {
        TalkingClock clock = new TalkingClock(1000, true);
        clock.start();

        // keep program running until user selects "Ok"
        JOptionPane.showMessageDialog(null, "Quit program?");
        System.exit(0);
    }
}

/**
 * A clock that prints the time in regular intervals.
 */
class TalkingClock
{
    private int interval;
    private boolean beep;
    
    /**
     * Starts the clock.
     * @param interval the interval between messages (in milliseconds)
     * @param beep true if the clock should 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();
    }
    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();
        }
    }
}

上述代码中,TimePrinter就是在TalkingClock类的内部定义的一个内部类,因此它可以访问外围类的数据域,包括interval和beep这种私有域。



二、局部内部类:

讨论匿名内部类之前,先看看局部内部类,它是在一个方法中定义的类。代码示例如下,这里将上例中的TimePrinter类放到了start()方法中进行定义:

public void start(int interval, final boolean beep)
{
    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或private访问说明符来声明,它的作用域被限定在声明这个局部内部类的块中。局部内部类可以对外部世界完全地隐藏起来。

局部内部类不仅能访问其外围类,还可以访问局部变量,不过这些局部变量必须被声明为final,如上述代码中start()方法的参数beep所示。



三、匿名内部类

将上面的局部内部类的代码修改一下,就可以定义一个匿名内部类,这种类没有类名。

public void start(int interval, final boolean beep)
    {
        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();
    }

请参照局部内部类的代码,比较不同之处。TimePrinter这个类名被省略了,定义listener这个局部内部类时,在其后的new ActionListener()后面跟了一个大括号括起的语句块,也就是此匿名内部类的定义语句。匿名内部类除了具有内部类的优点外,还可以减少代码量。



【内容有些多,但愿能帮到你^_^】

匿名用户
2014-04-16
展开全部
public class InnerClassTest{

public static void main(String argv[]){
new Thread(){ ///匿名内部类

public void run(){
while(true){
System.out.println(new java.util.Date());
try{Thread.sleep(1000);}catch(Exception e){}

}

}

}.start();

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式