Android里面的匿名类与匿名内部类使用
2013-11-29 16:42
267 查看
A.关于回调函数
匿名内部类其中用到了回调函数,什么是回调函数呢?
所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web
Service以及Java的RMI都用到回调机制,可以访问远程服务器程序
B. 关于匿名内部类
要去理解什么是内部类,内部类的作用,java的多态,什么是回调函数。网上有很多详细的解释,为了简单起见,只是做了简单说明。匿名内部类是当做函数的参数传递给方法的,在这个方法中,会用接口类型接受传入的匿名类,然后调用其方法,这是多态。原理其实是实现了回调。因为他会调用你匿名内部类中的方法。
在android开发中经常碰到匿名类(和匿名内部类)的使用,那么匿名类和一般情况下使用的类有什么不同,
从实现的功能来讲是一样的,但是使用匿名更加简洁方便,形式上有点像new一个接口或类的感觉,但是我们必须
记住接口是不可以new出来的(实例化),我们要在内部重写需要的接口的方法,这样就new出了一个实现接口
方法的对象,但是这个对象的类名不可见,所以叫做匿名类。下面是功能相同的两段代码,分别用上述两种写法
实现:
匿名类
形式如下:new <类或接口> <类的主体>
自定义继承接口的类:
匿名类不等同于匿名内部类
匿名类不等同于匿名内部类,后者也经常使用,匿名内部类是内部类的一种,使用的时候更加简洁,但是不是任何情况下都需要使用。
在thinking in java 3th 是这么阐述的:
简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较
合适的:
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
//在方法中返回一个匿名内部类
public class Parcel6
{
public Contents cont()
{
return new Contents()
{
private int i = 11;
public int value()
{
return i;
}
}; // 在这里需要一个分号
}
public static void main(String[] args)
{
Parcel6 p = new Parcel6();
Contents c = p.cont();
}
匿名内部类其中用到了回调函数,什么是回调函数呢?
所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web
Service以及Java的RMI都用到回调机制,可以访问远程服务器程序
B. 关于匿名内部类
要去理解什么是内部类,内部类的作用,java的多态,什么是回调函数。网上有很多详细的解释,为了简单起见,只是做了简单说明。匿名内部类是当做函数的参数传递给方法的,在这个方法中,会用接口类型接受传入的匿名类,然后调用其方法,这是多态。原理其实是实现了回调。因为他会调用你匿名内部类中的方法。
在android开发中经常碰到匿名类(和匿名内部类)的使用,那么匿名类和一般情况下使用的类有什么不同,
从实现的功能来讲是一样的,但是使用匿名更加简洁方便,形式上有点像new一个接口或类的感觉,但是我们必须
记住接口是不可以new出来的(实例化),我们要在内部重写需要的接口的方法,这样就new出了一个实现接口
方法的对象,但是这个对象的类名不可见,所以叫做匿名类。下面是功能相同的两段代码,分别用上述两种写法
实现:
匿名类
形式如下:new <类或接口> <类的主体>
1 button.setOnClickListener(listener ); 2 3 private View.OnClickListener listener = new View.OnClickListener() 4 { 5 @Override 6 public void onClick(View v) 7 { 8 String phonenum = phoneEditText.getText().toString(); 9 Intent intent = new Intent("android.intent.action.CALL", Uri.parse("tel:" + phonenum)); 10 startActivity(intent); 11 } 12 };// 在这里需要一个分号
自定义继承接口的类:
button.setOnClickListener(new ButtonListener());
private final class ButtonListener implements View.OnClickListener
{ public void onClick(View v)
{ EditText mobileText = (EditText)findViewById(R.id.mobile); String mobile = mobileText.getText().toString(); Intent intent = new Intent(); intent.setAction("android.intent.action.CALL"); intent.setData(Uri.parse("tel:"+ mobile)); startActivity(intent); } }
匿名类不等同于匿名内部类
匿名类不等同于匿名内部类,后者也经常使用,匿名内部类是内部类的一种,使用的时候更加简洁,但是不是任何情况下都需要使用。
在thinking in java 3th 是这么阐述的:
简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较
合适的:
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
//在方法中返回一个匿名内部类
public class Parcel6
{
public Contents cont()
{
return new Contents()
{
private int i = 11;
public int value()
{
return i;
}
}; // 在这里需要一个分号
}
public static void main(String[] args)
{
Parcel6 p = new Parcel6();
Contents c = p.cont();
}
相关文章推荐
- Android里面的匿名类与匿名内部类使用
- Android里面的匿名类与匿名内部类使用
- Android里面的匿名类与匿名内部类使用
- Android里面的匿名类与匿名内部类使用
- Android里面的匿名类与匿名内部类使用
- Android里面的匿名类与匿名内部类使用
- Android里面的匿名类与匿名内部类使用
- android 使用 websocket 进行长链接的一个简单的 demo,可以用来收发消息或别的操作,里面用到了 autobahn 的 jar 包
- Android笔记:在APP里面使用自定义字体
- Android 里面使用Matrix进行简单地变换
- Android使用文件管理器打开指定文件夹,浏览里面的内容
- Android在ActivityGroup里面使用startActivityForResult
- android 源代码修改了之后编译生成本地的sdk,以方便在eclipse里面直接使用,调用所改动的API接口函数
- android里面怎么使用mina框架与mina服务器连接之传对象
- Android使用phonegap从相册里面获取照片(代码分享)
- android 中 webview 怎么用 localStorage? 我在 android里面 使用html5的 localStorage 为什么存不进去也读不出来呀? 网上搜了好多都没效果
- Android使用SimpleAdapter更新ListView里面的Drawable元素
- android 里面 如何使用gson 快速获取类的所有字段名称,包括父类的
- 在android里面使用自定义字体
- Android Studio——private Handler mHandler = new Handler() {...}此处使用的什么语法,继承?重写?匿名类?