前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java内部类的作用(三)----定义使用回调函数的时候比较便捷---匿名内部类(anonymous)

java内部类的作用(三)----定义使用回调函数的时候比较便捷---匿名内部类(anonymous)

作者头像
wust小吴
发布2019-07-05 11:33:15
1.4K0
发布2019-07-05 11:33:15
举报
文章被收录于专栏:风吹杨柳

首先我们需要了解什么叫匿名内部类:定义(JAVA核心技术上是这样说的)

匿名内部类(anonymous inner calss):将局部内部类的使用再深入一步。假如只创建这个类的一个对象,就不必命名了。这种类被称为匿名内部类。

话很少,说的也很浅显,可能读完了还不知道什么叫匿名内部类?是的,确实有这种感觉,

重点就两个:

1.只创建这个类的一个对象;->这个是从局部内部类中延伸来的,整个代码中只有一次创建,没有说明什么

2.不必命名:->匿名内部类是没有名字的。【重点就是这里了,没有名字】

一个类没有名字?那是怎么样去创建这个类呢?

我们知道创建类是需要用到一个构造器的,构造器的名字与类名是同名的。

现在匿名内部类没有名字,肯定用不了构造器的。也就是说匿名内部类一定没有构造器的。

这里就告诉我们,是不是所有的类都有构造器呢,不一定,匿名内部类不能有构造器!

1.利用接口

换句话说,我们构造匿名内部类是没有参数的,或者把参数直接传递给超类的构造器的,想想,这在什么中用到呢?

接口!!!(构造的时候没有参数)

实现接口的时候我们是不能有任何构造参数的。接口里面的是只声明不实现。

对的,我们要想用到匿名内部类,必须要实现一个接口!!!

new InterfaceType(){

methods and data

}

我们来看看代码是怎么实现的:

代码语言:javascript
复制
package org.innerclass.operate;

public class AnonymousClassTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AnonymousClassTest test =new AnonymousClassTest();
		test.start();
	}
	
	public void start(){
		A a = new A(){

			@Override
			public void print() {
				// TODO Auto-generated method stub
				System.out.println("我是利用接口来实现匿名内部类的!");
			}
			
		};
		a.print();
	}
	
	//定义一个接口
	public interface A{
		public void print();
	}

}

如果你写过Android应用程序的时候,我们都经常用到这个匿名内部类:

当我们写一个按钮点击事件的时候,我们通常这样做:

代码语言:javascript
复制
list.setOnClickListener(new OnClickListener() {  
      
    @Override  
    public void onClick(View arg0) {  
        // TODO Auto-generated method stub  
          
    }  
});

当然如果我们视图上有多个按钮的话,为了方便代码的管理,我们的参数都是this,然后让activity去实现OnClickListener  如下:

public class MainApp extends Activity implements OnClickListener

下面我就不再赘述了。

2.利用一个类

如果要使用的这个内部类有参数怎么办呢?难道匿名内部必须不能传递参数吗?不是的,我们可以把参数传递给超类的。

new SuperType(construction parameters){

inner calss methods and data

}

接下来我们看看代码是怎么弄的:

首先定义一个类:

代码语言:javascript
复制
package org.innerclass.operate;

public class Duck {
	private String name;

	public Duck(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
	
	public void speak(){
		
	}
}

匿名内部类使用一个类来实现:

代码语言:javascript
复制
package org.innerclass.operate;

public class AnonymousClassTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AnonymousClassTest test =new AnonymousClassTest();
		test.end();
	}
	
	public void end(){
		Duck superduck = new Duck("Donald Duck"){
			public void speak(){
				System.out.println("我是一只会说话的鸭子,你知道我叫什么吗?");
				System.out.println("我是唐老鸭,你是不是在1秒内想到 我呢?");
			}
		};
		superduck.speak();
	}

}

结果:

代码语言:javascript
复制
我是一只会说话的鸭子,你知道我叫什么吗?
我是唐老鸭,你是不是在1秒内想到 我呢?

就这样匿名内部类就是这些了,希望对你有帮助!

转载请注明!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年11月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档