java內部類解析——菜鳥摘記

czdjita發表於2011-09-06

//例程:靜態內部類

 

 

  

 class StaticInner
{
      private static int a=4;
      public static class Inner
      {
              public void test()
              {
                  System.out.println(a);
              }
      }
}
public class StaticInnerClassTest
{
       public static void main(String [] args
       {
               StaticInner.Inner inner=new StaticInner.Inner();     //注意靜態內部類的構造方法
               inner.test();
       }
}

 

 

內部類可以被定義在另一個類中,或定義在一個方法中,甚至是一個表示式的一部分

四種內部類的解析:

 

      第一種:靜態內部類

①編譯成一個完全與外部類相獨立的.class檔案  (OutClass.class與OutClass$StaticInnerClass.class相獨立)

②只能訪問對應的外部類中的靜態變數與靜態方法,包括private static的變數與方法。

例程見上。

 


 

第二種:成員內部類(member inner class)

①能訪問所在相應的外部類的所有成員(靜態、非靜態)

②create an instance within the enclosing class     this.new  InnerClass();

③構造方法:( new OuterClass() ).new InnerClass();

④在內部類中訪問外部類的變數    :OuterClass.this.member

例程:

class MemberInner
{
       private int a=4;
       public class Inner2
        {
              public void doSomething()
              {
                    System.out.println("Hello World ");
              }
        }
}

public class MemberInnerClassTest
{
      public static void main (String[] args)
      {
             MemberInner.Inner2  inner=new  MemberInner(). new Inner2();   //注意其構造方法,並將其與靜態內部類的構造方法相比較,
                                                                    //在這裡,先建立MemberInner類的例項,再建立內部類Inner2的例項
               inner.doSomething();
      }
}

 

 

第三種:區域性內部類    (不常用)

① 在一個方法內定義,或在方法內的語句塊內定義,只在相應範圍內起作用

② 像區域性變數一樣,區域性內部類不能被宣告為public \protected\private\static

③ 若在一個方法內定義,只能訪問所在方法內的區域性常量(final local variables )

例程:

class LocalInner
{
        public void doSomething( )
        {
               class Inner3
               {
                      public void test()
                      {
                           System.out.println(''hello world");
                      }
               }
               new Inner3().test();
        }
}

public class LocalInnerClassTest
{
          public static void main(String[] args)
          {
                LocalInner localInner=new LocalInner();
                localInner.doSomething();
          }
}


 

 

第四種:匿名內部類(android 中常用)(Anonymous Inner Class)

① 區域性內部類,沒有類名字

② no key word class

③ No key words extends and implements

④沒有構造方法(連類名字都沒有)

⑤隱式地繼承了一個父類或實現了一個介面

 

         例程1:隱式繼承一個父類(該例程中有不推薦的方法,僅供參考匿名內部類思路)

import java.util.*;
public class AnonymousInnerClassTest
{
          public String get(Date date)
          {
                 return date.toLocaleString();
          }
          public static void main(String[] args)
          {
                 AnonymousInnerClassTest test =new  AnonymousInnerClassTest();
                 String str=test.get(new Date() 
                   {
                          public String toLocaleString()
                          {
                                return "hello world";
                          }
                   } );
                 System.out.println(str);
          }
}


        註釋:Date是java.util的類,上例中的匿名內部類 new Data() { }  隱式地繼承了java.util.Data類,並重寫了toLocaleString()方法。

 

 

 

 

                例程2:匿名內部類隱式實現一個介面 

 

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity
{
	private Button btn1=null;
	private Button btn2=null;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btn1=(Button)findViewById(R.id.btn1);
		btn2=(Button)findViewById(R.id.btn2);
		btn1.setOnClickListener(listener);
		btn2.setOnClickListener(listener);
		
	}
	
	private OnClickListener listener=new OnClickListener()
	{
		@Override
		public void onClick(View v)
		{
			Button btn=(Button)v;
			switch (btn.getId())
			{
			case R.id.btn1:
				Toast.makeText(MainActivity.this, "你點選了按鈕", Toast.LENGTH_LONG).show();
				break;
			case R.id.btn2:
				System.out.println("你點選了Button2");
				break;
			}
		}
	};
}

註釋:  OnClickListener 是android.view.View包中的介面——

                                   public static interface         View.OnClickListener 

                          其中,該介面有方法:

Public Methods

 

abstract void     onClick(View v)

Called when a view has been clicked.

上面的例程中匿名內部類 new OnClickListener {  }  實現了OnClickListener介面,這一介面的實現是隱式的。

 

 

從上面兩個例子可以看出匿名內部類的特殊之處與作用!



 

                                                                                                                                                                                                      感謝聖思元 張龍老師!  java教程

                                                                                                                                                                                                      感謝若水! android 教程

相關文章