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

内部类可以对同一个包中的其他类隐藏以来;当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。【举例:《Java核心技术(卷I)》,6.4节——内部类,程序清单6-6】import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing....
java内部类,匿名内部类这些是什么?求详细用法,还有语法。
一、内部类:
内部类是定义在另一个类中的类,使用它的原因主要有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();

}
}2014-04-16
mengvlog 阅读 8 次 更新于 2025-06-20 00:33:35 我来答关注问题0
  • 内部类可以对同一个包中的其他类隐藏以来;当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。【举例:《Java核心技术(卷I)》,6.4节——内部类,程序清单6-6】import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing.Tim...

  •  文暄生活科普 内部类和匿名内部类的用法

    Java内部类分四种,成员内部类、局部内部类、内部类和匿名内部类:1、内部类用法特点, 静态内部类定义在类中,任何方法外,用static定义,注意静态内部类中可以定义静态或者非静态的成员。2、匿名内部类,匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。匿名内部类的用法特点:1、一个类用...

  •  翡希信息咨询 内部类和匿名内部类的用法

    使用static关键字定义在类中,任何方法外部。可以访问外部类的静态成员,但不能直接访问非静态成员。静态内部类实例不依赖于外部类实例,可以直接创建。静态内部类中既可以定义静态成员,也可以定义非静态成员。匿名内部类用法特点:定义:匿名内部类是一种特殊的局部内部类,没有类名。主要用途:继承其他类...

  •  zhaozhekang110 哪位朋友能帮我详解一下Java的内部类和匿名内部类?

    一、定义:在一个类内部定义的类。二、类型:成员内部类、局部内部类(也叫方法内部类)、匿名内部类、静态嵌套类。三、用法 a)四种内部类的共性 i.内部类仍然是一个独立的类,在编译后内部类会被编译成独立的.class文件,只是在前面加上外部类的类名和$符号。ii.内部类不能用普通的方式访问。内...

  • 1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。几种内部类的共性:A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部