首页编程java编程java匿名内部类是什么 java内部类的匿名内部类

java匿名内部类是什么 java内部类的匿名内部类

编程之家 2023-10-14 96次浏览

大家好,如果您还对java匿名内部类是什么不太了解,没有关系,今天就由本站为大家分享java匿名内部类是什么的知识,包括java内部类的匿名内部类的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

java匿名内部类是什么 java内部类的匿名内部类

java内部类的匿名内部类

顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。

当程序中使用匿名内部类时,在定义匿名内部类的地方往往直接创建该类的一个对象。匿名内部类的声明格式如下:

new ParentName(){

java匿名内部类是什么 java内部类的匿名内部类

...//内部类的定义

}

匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:

java匿名内部类是什么 java内部类的匿名内部类

·只用到类的一个实例。

·类在定义后马上用到。

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

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

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

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

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

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

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

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

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

A、继承式的匿名内部类

public class Car{

public void drive(){

System.out.println(Driving a car!);

}

public static void main(String[] args){

Car car= new Car(){

public void drive(){

System.out.println(Driving another car!);

}

};

car.drive();

}

}

结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。

B、接口式的匿名内部类。

interface Vehicle{

public void drive();

}

class Test{

public static void main(String[] args){

Vehicle v= new Vehicle(){

public void drive(){

System.out.println(Driving a car!);

}

};

v.drive();

}

}

上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。

C、参数式的匿名内部类。

class Bar{

void doStuff(Foo f){

f.foo();

}

}

interface Foo{

void foo();

}

class Test{

static void go(){

Bar b= new Bar();

b.doStuff(new Foo(){

public void foo(){

System.out.println(foofy);

}

});

}

}

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

一、内部类:

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

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

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

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

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

importjava.awt.*;

importjava.awt.event.*;

importjava.util.*;

importjavax.swing.*;

importjavax.swing.Timer;

/**

*Thisprogramdemonstratesanonymousinnerclasses.

*@version1.102004-02-07

*@authorCayHorstmann

*/

publicclassInnerClassTest

{

publicstaticvoidmain(String[]args)

{

TalkingClockclock=newTalkingClock(1000,true);

clock.start();

//keepprogramrunninguntiluserselects"Ok"

JOptionPane.showMessageDialog(null,"Quitprogram?");

System.exit(0);

}

}

/**

*Aclockthatprintsthetimeinregularintervals.

*/

classTalkingClock

{

privateintinterval;

privatebooleanbeep;

/**

*Startstheclock.

*@paramintervaltheintervalbetweenmessages(inmilliseconds)

*@parambeeptrueiftheclockshouldbeep

*/

publicTalkingClock(intinterval,booleanbeep)

{

this.interval=interval;

this.beep=beep;

}

/**

*Startstheclock.

*/

publicvoidstart()

{

ActionListenerlistener=newTimePrinter();

Timert=newTimer(interval,listener);

t.start();

}

publicclassTimePrinterimplementsActionListener

{

publicvoidactionPerformed(ActionEventevent)

{

Datenow=newDate();

System.out.println("Atthetone,thetimeis"+now);

if(beep)Toolkit.getDefaultToolkit().beep();

}

}

}

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

二、局部内部类:

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

publicvoidstart(intinterval,finalbooleanbeep)

{

classTimePrinterimplementsActionListener

{

publicvoidactionPerformed(ActionEventevent)

{

Datenow=newDate();

System.out.println("Atthetone,thetimeis"+now);

if(beep)Toolkit.getDefaultToolkit().beep();

}

}

ActionListenerlistener=newTimePrinter();

Timert=newTimer(interval,listener);

t.start();

}

局部内部类不能用public或private访问说明符来声明,它的作用域被限定在声明这个局部内部类的块中。局部内部类可以对外部世界完全地隐藏起来。

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

三、匿名内部类

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

publicvoidstart(intinterval,finalbooleanbeep)

{

ActionListenerlistener=newActionListener()

{

publicvoidactionPerformed(ActionEventevent)

{

Datenow=newDate();

System.out.println("Atthetone,thetimeis"+now);

if(beep)Toolkit.getDefaultToolkit().beep();

}

};

Timert=newTimer(interval,listener);

t.start();

}

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

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

java匿名内部类具体概念是什么,在什么地方用到

java匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。因他是局部内部类,那么局部内部类的所有限制都对其生效。匿名内部类是唯一一种无构造方法类。大部分匿名内部类是用于接口回调用的。匿名内部类在编译的时候由系统自动起名Out$1.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类中不能定义构造方法。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。

示例如下:

publicclassOuter{

privatestaticinti=1;

privateintj=10;

publicstaticvoidouter_f1(){

}

publicvoidouter_f2(){

}

//静态内部类可以用public,protected,private修饰

//静态内部类中可以定义静态或者非静态的成员

staticclassInner{

staticintinner_i=100;

intinner_j=200;

staticvoidinner_f1(){

System.out.println("Outer.i"+i);//静态内部类只能访问外部类的静态成员

outer_f1();//包括静态变量和静态方法

}

voidinner_f2(){

//System.out.println("Outer.i"+j);//静态内部类不能访问外部类的非静态成员

//outer_f2();//包括非静态变量和非静态方法

}

}

publicvoidouter_f3(){

//外部类访问内部类的静态成员:内部类.静态成员

System.out.println(Inner.inner_i);

Inner.inner_f1();

//外部类访问内部类的非静态成员:实例化内部类即可

Innerinner=newInner();

inner.inner_f2();

}

publicstaticvoidmain(String[]args){

newOuter().outer_f3();

}

}

好了,关于java匿名内部类是什么和java内部类的匿名内部类的问题到这里结束啦,希望可以解决您的问题哈!

java ee api是什么?javaee是什么意思 java程序员用什么浏览器 作为一个java程序员经常上的网站