在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();
}