顯示具有 介面 標籤的文章。 顯示所有文章
顯示具有 介面 標籤的文章。 顯示所有文章

2009年12月19日 星期六

JAVA筆記-用匿名內部類別來實作介面

內部類別沒有實際練習過,雖然看懂了用法,
但還是感到含糊,不知道要在怎樣的情況下運用
適合用在程式只會用到一次就不需再使用類別的情況
##ReadMore##
interface Pet {
  void skill();
  void move();
}
public class AnonymousClass {
  public static void main(String[] args) {
    Pet p = new Pet()
    {
      public void skill(){
        System.out.println("我會握手 !");
      }
      public void move(){
        System.out.println("我會跑步 !");
      };
    };
    p.skill();
    p.move();
  }
}

2009年12月11日 星期五

JAVA筆記-介面與抽象類別的差異

介面與抽象類別內的皆可宣告抽象方法,
且不可直接建立實體,必須由其他類別來實作出來,
所以也容易混淆

目的上 =>
interface是制定訊息接收者的規格,模擬類別的多重繼承
abstract class則是制定部分物件的規格,並且制定訊息接收者的規格,為多型作準備。

使用上 =>
interface用來被實作,abstract class則是用來被繼承

概念上 =>
abstract class:
可以想像手機物件基本上該有哪些功能,然後將那些功能名稱定義好,
一定也有一些功能是所有手機都一樣的!也可以先都寫好。     
定義好之後,開發手機軟體的廠商就可以依據這些已定義好的method來撰寫
interface:
顧名思義就是不同系統、或是不同世界的中介橋樑,   
只注重介面格式,而不理會實作內容。   
如:人跟電腦的溝通介面是什麼?螢幕、鍵盤、滑鼠等...     
人跟手機的溝通介面是什麼?螢幕、鍵盤等...   
所以一個物件可以有很多個介面,像手機的鍵盤面板,   
今天高興換紅色,明天工作開心換藍色,
因為介面是一樣的,所以可以隨便更換面板。

差異上 =>
1.
interface的方法全都是抽象方法
abstract則有一般方法和抽象方法
抽象方法指的是沒有「實作」出來的方法
2.
interface與abstract類別都不能直接用來建立物件實體,
必須由一個標準類別來繼承它,實作其抽象方法,
然後再以此建立物件實體。
3.
interface可多重繼承interface
abstract只能單一繼承
3.
interface沒有建構子
abstract有建構子
4.
interface沒有內建的super與this變數
abstract有內建的super與this變數
5.
interface的成員變數全都是static final型式
abstract類別的成員變數比照一般類別
6.
interface內的方法只可封裝public、default
abstract內的方法只可封裝public、default、protected
7.
需要使用迂迴的方式去找出實體類別間的對應關係,
所以與抽象類別的速度相比之下較為緩慢

介面與類別一起使用的參考想法 =>
先為了某些機制建立一個介面,然後再設計一個抽象類別實作這個介面

2009年12月9日 星期三

JAVA筆記-interface介面,解決多重繼承問題

為一種標準、規範,只是做規格、功用的定義宣告
由於extends不能單一繼承一般類別,為了達到多重繼承的目的,
在介面類別中可以多重繼承介面類別,來模擬一般類別的多重繼承
多重繼承寫法:extends 介面類別1, 介面類別2 ,介面類別3 ...
必須全部都是介面類別
介面宣告寫法:[存取權限] interface 介面名稱 [extends ...]

使用介面的類別用implements來實作,不可用new建立實體
且全部方法都會編譯成抽象方法
實作介面寫法:[存取權限] class 類別名稱 implements [extends ...]


public interface Pet {
  String attr = "cute"; //必須給予初值
  void skill(); //不能實作函式
  void move(); //不能實作函式
}

javac會自動編譯成下方程式碼
public interface Pet {
  public static final String attr = "cute";
  public abstract void skill();
  public abstract void move();
}

所以存取權限必須只能用default和public,否則會錯誤


下方程式碼寫了一個Dog來實做Pet
public class Dog implements Pet{
  public void skill(){
    System.out.println("玩球");
  }
  public void move(){
    System.out.println("跑跑跳跳");
  }
  public static void main(String[] args) {
    Dog dog = new Dog();
    dog.skill();
    dog.move();
  }
}
/