「java匿名内部类快捷」java中匿名内部类详解

博主:adminadmin 2022-11-27 20:00:10 39

本篇文章给大家谈谈java匿名内部类快捷,以及java中匿名内部类详解对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java匿名内部类怎样创建,有何作用和优点,创建线程怎样使用匿名内部类

1、匿名内部类就是没有名字的内部类。这是Java为了方便我们编写程序而设计的一个机制。因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适,而且也免去了给它取名字的烦恼。

2、如果满足下面的一些条件,使用匿名内部类是比较合适的:

·只用到类的一个实例。

·类在定义后马上用到。

·类非常小(SUN推荐是在4行代码以下)

·给类命名并不会导致你的代码更容易被理解。

在使用匿名内部类时,要记住以下几个原则:

·匿名内部类不能有构造方法。

·匿名内部类不能定义任何静态成员、方法和类。

·匿名内部类不能是public,protected,private,static。

·只能创建匿名内部类的一个实例。

·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

3、用匿名内部类创建多线程有两种方式,和创建一个线程是一样的。

第①种继承Thread:

new Thread(){

public void run(){

//do something

};

}.start();

第②种实现 Runnable接口:

new Thread(new Runnable() {

public void run() {

//do something

};

}) { }.start();

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()后面跟了一个大括号括起的语句块,也就是此匿名内部类的定义语句。匿名内部类除了具有内部类的优点外,还可以减少代码量。

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

Java中怎样使用匿名内部类

JAVA中匿名内部类使用最常见,用起来最方便的地方是在进行GUI编写时,添加控件响应事件时。在为控件添加事件时使用内部匿名类是大家常用的方法,我这里举一个列子,相信你看过之后既能理解又会用了。 这是为一个按钮添加一个左键单击事件,点单击后打印 hello!! import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;import javax.swing.*;

public class Press { /**

* @param args

*/

JFrame jf = new JFrame("内部匿名类演示"); //创建一个JFrame组件

JButton jb = new JButton("Press me"); //创建按钮

JLabel jt = new JLabel(); //创建一个标签用来输出“hello!!”

public Press(){

jf.add(jb,BorderLayout.SOUTH); //添加按钮

jf.add(jt,BorderLayout.CENTER); //添加标签

jf.setSize(200,200); //设置jf大小

jf.setVisible(true); //设置jf为可见

/*接下来是内部匿名类的应用了,为jb添加一个左键单击响应事件*/

jb.addActionListener(new ActionListener(){ /*这里就是内部匿名类了,没有类名,下面是类的方法体*/ @Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

jt.setText("hello!!");

}});

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Press p =new Press();

}}

你可以试着给jf添加一个事件响应,让它点×可以关掉,这样你就能理解匿名内部类了,再看看书里对“内部类”、“匿名类”的介绍,一个个理解这样“匿名内部类”就没问题了

java匿名内部类

Inner classes(内隐类)

inner class得以让你控制“某个class在另一个class中的可视性”。

位于methods和scopes之内的inner classes(内隐类)

你可以将inner classes置于函数之内或甚至置于任意程序范畴(scope)之内。

以下应用:

1. 定义与函数之内的class。

2. 定义于函数内某一段范畴(scope)内的class。

3. 一个匿名(anonymous)class,实现某个interface。

4. 一个匿名class,扩充某个“拥有non-default构造函数”之class。

5. 一个匿名class,执行数据成员初始化动作。

6. 一个匿名class,以实体(instance)初始化来执行构造动作。注意,匿名的inner classes不得拥有构造函数。

匿名(anonymous)inner class

当base class需要一个带有引数的构造函数时,只要将适当引数传入base class构造函数种。

如果你定义了某个匿名inner class,并且希望用到定义于匿名inner class之外的某个对象,编译器会限制该外部对象必须为final。

同时通过实体初始化(instance initialization)你可以实际完成一个匿名inner class的建构。

与外围(outer)class的连接关系

inner class天生具有对enclosing class之所有成员的访问权力。

static inner class(静态内隐类)

如果你不需要inner class对象和enclosing class对象之间的连接关系,你可以将inner class声明为static。如果你想了解这么声明的确切时机,记住,一般的inner class(也就是non-static inner class)会自动记录一个reference指向enclosing class的某个实例,而后者也就是此inner class对象的制造者。但是一旦你将inner class声明为static,上述说法就不成立。static inner class意味着:

1. 产生对象时,并不需要同时存在一个enclosing class实例。

2. 你无法在static inner class对象中访问enclosing实例成员。

一般而言,你不能将任何程序代码置于interface内,但static inner class却可以使interface的一部分。这是因为class既然被声明为static,也就不会破坏interface的规则—static inner class只不过是被置于interface的命名空间中罢了。

取用(referring)outer class的实例

在你需要产生一个reference指向outer class对象时,命名方式便是在outer class名称之后紧接一个句号,然后再接this。

如果你想直接产生inner class对象,你不能像你所想象地在new表达式中使用outer class的名称,你必须使用outer class的实例来产生inner class对象。如:

Parcell1 p = new Parcell1();

Parcell1.Contents c = p.new Contents();

因此,除非你已经拥有一个outer class对象,否则便无法产生其inner class对象。这是因为inner class对象会被暗中连接到某个outer class对象上,后者即该inner class对象的制造者。不过,如果你制作的是static inner class,那就不需要一个reference指向outer class对象了。

从多层嵌套class向外伸展触角

无论inner class被嵌套置放的层次有多深,其所有outer classes的成员都可以被它访问。

继承inner classes

由于inner class的构造函数必须连接到一个reference指向outer class对象身上,所以当你继承inner class时,事情便稍微复杂些。问题出在“指向outer class对象”的那个神秘的reference必须被初始化,但derived class之内不存有可连接的缺省对象。这个问题的答案是,使用专用语法,明确产生关联性:

class WithInner{

class Inner{}

}

public class IneritInner extends WithInner.Inner{

//!InheritInner(){} //Won’t compile

InheritInner (WithInner wi)

{

wi.super();

}

}

InheritInner继承的是inner class而非outer class。但是当编译至构造函数时,default构造函数有问题;而且你也不能够只是传入一个reference指向outer object,你还必须在构造函数中使用以下语法:

enclosingClassReference.super();

inner classes可被覆写么吗?

我们能否把inner class视为outer class的一个函数一样,覆写inner class呢?

不能的。

Inner classes的标识符

先是outer class名称,其后紧接“$”符号,然后再紧接inner class名称。如果inner class没有名称,编译器会自动产生数字,做为inner class的标识符。如果inner classes被嵌套置于其他inner classes之内,其名称就会直接附加于“$”符号与outer class标识符(可能多个)之后。

为什么需要inner classes?

关于inner classes的存在,最让人信服的理由是:

每个inner class都能够各自继承某一实现类(implementation)。因此,inner class不受限于outer class是否已继承自某一实现类。

如果少了inner class所提供的“继承自多个具象(concrete)或抽象(abstract)类”的能力,设计上和编程上的某些问题会变得十分棘手。所以,从某个角度来看inner class,你可以说它是多重继承问题的完整解决方案。interface能够解决其中一部分问题,但inner classes才能有效而实际地允许“多重实现继承(multiple implementation)”。也就是说,inner classes实际上允许你继承多个non-interface。

通过inner classes,你可以拥有下列几个额外性质:

1. inner class可以拥有多份实体(instances),每个实体都拥有专属的状态信息(state information),而这些信息和outer class对象的信息是相互独立的。

2. 在单一outer class内你可以拥有多个innner classes,每个都实现相同的interface,或以不同方式继承同一个class。

3. 产生inner class对象的时间点,不见得必须和产生outer class对象同时。

4. outer class和inner class之间不存在is-a的关系,inner class是独立个体。

Closures(终结)和Callbacks(回调)

所谓closure是一种可被调用的对象,它会记录一些信息,这些信息来自它的产生地所在的程序范畴(scope)。

让inner class提供closure功能,是完美的解决方案。比起指针来说,不仅更具有弹性,而且安全许多。

callback的价值在于其弹性—你可以在执行时期动态决定究竟要调用哪个函数。

Inner classes和control frameworks

所谓application framework,是一组“被设计用来解决特定某种问题”的classes。如果你想套用某个application framework,你得继承一个或多个classes,并覆写其中某些函数。通过被覆写的函数内的新版程序代码,便可将application framework所提供的通用解法特殊化,针对性地解决你的特定问题。

所谓control framework,其实就是一种特殊形式的application framework,用来解决“事件(events)回应”的需要。一个系统如果主要工作在于回应诸般事件,我们称为“事件驱动系统(event-driven-system)”。

Java Swing程序库便是一个control framework,优雅解决了GUI问题,并大量采用inner classes。

java匿名内部类快捷的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中匿名内部类详解、java匿名内部类快捷的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-27,除非注明,否则均为首码项目网原创文章,转载请注明出处。