物件導向基本

1.Package(套件)的建立
2.package 的使用
3.import 的使用,想使用不同套件的類別,就必須先 import 進來
4.編譯指令 -d , -cp 的意思
5.編譯 jar 檔的指令
6.存取修飾詞的存取限制 public(沒有限制) , protected(子類別和相同套件) , default(相同套件) , private(不可存取)
7.封裝,對於類別中的屬性使用 private 限制權限,再提供 public 方法檢查並存取其屬性
8.抽象(abstract)類別,不可實體化,多了抽象方法,繼承其子類別必須實作(覆寫)抽象方法,抽象方法不可與 private , final 修飾
9.介面,不可實體化,方法省略 public 和 abstract , 屬性省略 public 和 final , 類別實作(implements)介面, 沒有建構子
10.類別和介面的關係,類別單一繼承類別,類別實作多個介面,介面繼承多個介面
11.轉型,小括號內考慮是否有 is-a 的關係(要看實體),轉型後的方法使用要注意宣告是否有定義,執行是看實體
12.instanceof,為 is-a的關係, 物件 instanceof 類別 -> 物件 is-a 類別
13.多型,繼承關係中,物件可被宣告為多種資料類型,注意:宣告要大於實體

範例,有2個 java 檔,Test_Object_1.java 和 Test_Object_2.java,分別屬於不同套件,也有實作各種介面和類別

Test_Object_1.java
   1:  package package1;
   2:   
   3:  import package1.package2.*;
   4:   
   5:  public class Test_Object_1 {
   6:   
   7:      public static void main(String[] args) {
   8:          // TODO Auto-generated method stub
   9:   
  10:  //        Test_Object_2 to2 = new Test_Object_2(); 不可建立抽象類別的實體物件
  11:          
  12:          OverTO2 to1 = new OverTO2();//多型, 宣告類別(OverTO2)要大於等於實體類別(OverTO2)
  13:          
  14:          Test_Object_2 to2 = new OverTO3();//多型, 宣告類別(Test_Object_2)要大於等於實體類別(OverTO3)
  15:          
  16:          OverTO2 to3 = new OverTO3();//多型, 宣告類別(OverTO2)要大於等於實體類別(OverTO3)
  17:          
  18:          //OverTO3 to4 = new OverTO2();錯誤, 宣告類別(OverTO3)要大於等於實體類別(OverTO2)
  19:          
  20:          //轉型, to1的實體類別為new OverTO2(), 欲轉型為Test_Object_2 是可行的,因為 OverTO2 is-a Test_Object_2
  21:          ((Test_Object_2)to1).getif2Num();
  22:          
  23:          //轉型, to3的實體類別為new OverTO3(), 欲轉型為Test_Object_2也 是可行的,因為 OverTO3 is-a Test_Object_2
  24:          ((Test_Object_2)to3).show();
  25:          
  26:          //執行錯誤,因為to1的實體類別為new OverTO2(), 欲轉型為OverTO3 是不行的,因為 OverTO2 is not a OverTO3
  27:          //((OverTO3)to1).show();
  28:          
  29:          //轉型前也可以用 instanceof 檢查, A instanceof B 回傳 true 代表  A is-a B
  30:          System.out.println(to3 instanceof OverTO2);//true
  31:          System.out.println(to1 instanceof OverTO3);//false
  32:          
  33:      }
  34:   
  35:  }
  36:   
  37:  class OverTO2 extends Test_Object_2//類別單一繼承類別 ,繼承抽象類別Test_Object_2
  38:  {
  39:   
  40:      public void show()//覆寫 Test_Object_2 的 show 方法
  41:      {
  42:          
  43:      }
  44:      
  45:      public int getifNum1()//覆寫interface1 的 getifNum1 方法
  46:      {
  47:          return if1Num1;
  48:      }
  49:      
  50:      public int getifNum2()//覆寫interface1 的getifNum2方法
  51:      {
  52:          return if1Num2;
  53:      }
  54:      
  55:      public int getif2Num()//覆寫interface2的getif2Num方法
  56:      {
  57:          return if2Num;
  58:      }
  59:      
  60:      public int getif3Num()//覆寫interface2的getif2Num方法
  61:      {
  62:          return if3Num;
  63:      }
  64:  }
  65:   
  66:  class OverTO3 extends OverTO2
  67:  {
  68:      
  69:  }


Test_Object_2.java
   1:  package package1.package2;
   2:   
   3:  public abstract class Test_Object_2 implements interface1,interface2 //類別多重實作介面
   4:  {
   5:      private int pNum1;//private 屬性,無法直接存取
   6:      
   7:      public int getpNum1()//一般方法,取得pNum1
   8:      {
   9:          return pNum1;
  10:      }
  11:      
  12:      abstract public void show();//抽象方法,繼承 Test_Object_2 的類別必須改寫此方法
  13:      
  14:      //final abstract show(); abstract 不可與 final 連用
  15:      //private abstract show(); abstract 不可與 private 連用 
  16:  }
  17:   
  18:   
  19:  interface interface1 extends interface2,interface3 //介面多重繼承介面
  20:  {
  21:      int if1Num1 =0;//屬性 省略 public final
  22:      public final int if1Num2 =0;//不省略也行
  23:      
  24:      int getifNum1();//方法省略 public abstract,以及內容
  25:      public abstract int getifNum2();//不省略也行
  26:  }
  27:   
  28:  interface interface2
  29:  {
  30:      int if2Num = 1;
  31:      int getif2Num();
  32:  }
  33:   
  34:  interface interface3 extends interface2
  35:  {
  36:      int if3Num =2;
  37:      int getif3Num();
  38:  }