2015年11月29日 星期日

extends, implements, interface


在java中如果用戶編寫類的時候沒有提供構造函數 (建構式),那麼編譯器會自動提供一個默認構造函數
它會把所有的實例字段設置为默認值:所有的數字變量初始化为0;所有的布爾變量設置为false;所有對象變量設置为null;
ex :
public class myClass {
    // 建構式
    public myClass(){ 
   
    }
}




 - extends 繼承:
java中的繼承,和C++中是有差別的.比如JAVA不支持多重繼承。但是JAVA可以通過implements來實現額外的接口.

ex :DogDeriveClass就全盤繼承了AnimalBaseClass中的所有方法;
public
{
    // 建構式
    public myClass(){ 
   
    }
};

如果還需要其它功能,那麼則可以通過implements關鍵字來實現需要用到的接口.
ex :
public class DogDeriveClass extends AnimalBaseClass Implements Shout, Run
{
    // 建構式
    public myClass(){ 
   
    }
};




 - implements 實現:
Implements關鍵字在class聲明中使用,以指示所聲明的類提供了在implements關鍵字後面的名稱所指定的接口中所聲明的所有方法的實現。
接口中的方法不能是static,因为static不能被派生類重寫(Override)

ex

public class UserSurfaceView extends SurfaceView implements Android.view.SurfaceHolder.Callback  
{
     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int with, int heigh)
     {
     //TODO Auto-generated method stub
     }
    @Override
     public void surfaceCreated(SurfaceHolder holder)
     {
     //TODO Auto-generated method stub
     }
     @Override
     public void surfaceDestroyed(SurfaceHolder holder)
     {
     //TODO Auto-generated method stub
     }
};



 - interface 接口:
介面有點像是完全沒有任何方法被實作的抽象類別,但實際上兩者在語義與應用上是有差別的。
1. 「繼承某抽象類別的類別必定是該類別的一個子類」透過繼承父類別型態進行多型操作。
2. 「實作某介面的類別並不被歸屬於哪一類」:一個物件上可以實作多個介面。


介面的宣告是使用"interface"關鍵字,宣告方式如下:
interface 介面名稱 {
    傳回型態 方法(參數列);
    傳回型態 方法(參數列);

    // ....
}

ex
public interface Android.view.SurfaceHolder.Callback 
{
         void surfaceChanged(SurfaceHolder holder, int format, int with, int heigh);
        void surfaceCreated(SurfaceHolder holder);
        void  surfaceDestroyed(SurfaceHolder holder);
};
由於接口中的方法聲明默認就是public的,因此不需要特意加上public修飾符.

ex :  自定義一個 Class 繼承 Dialog 的自創對話框介面,透過 Interface Function 自訂義此 Class之button 的 myOnClickListener。
使用此 myOnClickListener 來執行 外部所對應的動作:

 MyDialog 部分:

public class MyDialog extends Dialog {
    public MyDialog(Context context, myOnClickListener myclick) {
        super(context);
        this.myListener = myclick;
    }
    public myOnClickListener myListener;
         
        // This is my interface //
    public interface myOnClickListener {
        void onButtonClick();
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.alert);
        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new android.view.View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // 外部所宣告 interface function : myOnClickListener
                // 將會插入在此處,並執行其內容。 
                myListener.onButtonClick(); // I am giving the click to the
                                            // interface function which we need
                                            // to implements where we call this
                                            // class
            }
        });
    }
}

 - main Activity

import com.coderzheaven.interfacedemo.MyDialog.myOnClickListener;
...


public class MainActivity extends Activity {
    public myOnClickListener myListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // create new onclicklistener interface //
        myListener = new myOnClickListener() {
            @Override
            public void onButtonClick() {
                System.out.println("I am clicking the button in the dialog");
                Toast.makeText(getApplicationContext(),
                        "I am clicking the button in the dialog",
                        Toast.LENGTH_LONG).show();
            }
        };
        MyDialog mydialog = new MyDialog(this, myListener);
        mydialog.show();
    }
}


參考資料:

沒有留言:

張貼留言