網頁

2010年9月5日 星期日

【JAVA】繼承(Inheritance) - extends


所謂繼承,是指類別物件的資源可以延伸和重複使用,在程式中可以利用 extends 來實作繼承關係。
在JAVA中只允許單一繼承(Single Inheritance),也就是說子類別同時只能繼承一個父類別。

範例 :
class Son extends Father{ }















繼承的UML結構圖
程式範例 :

class Father{
 public int money=100;
 public void getMoney(){
  System.out.println("我有:"+money);
 }
}

public class Son extends Father{

    public static void main(String[] args) {
     Son son = new Son();
     son.getMoney();
     System.out.println("son.money="+son.money);
    }
}

執行結果 :
我有:100 
son.money=100

繼承關係下的建構子:
類別 Father 和 Son 在編譯的時候會產生預設建構子,所以必須看成 :
class Father{
    Father(){  }
}

class Son{
    Son(){ }
}

但是Son 類別繼承Father 類別,所以在預設javac會在Son(){ }建構子中的第一行加入無帶入參數的 super(),也就是呼叫富類別Father 的預設建構子,所以Son 類別應該看成 :
public class Son extends Father{

    Son(){
        super(); //呼叫父類別中的建構子
    }
}

super() 是什麼?
假設父類別是帶有參數的建構子,而又忘了在子類別建構子最前面加入 super()
程式範例 :
class Father{
 String my_son_Name;
 Father(String name){//此父類別建構子需要傳入 字串參數
  my_son_Name = name;
 }

 public void getName(){
  System.out.println("我兒子叫做:"+my_son_Name);
 }
}

public class Son extends Father{
 Son(){
  
 }

    public static void main(String[] args) {
     Son son = new Son();
     son.getName();
    }
}

如上述,如果沒有在子類別建構子中加入super() ,會出現以下錯誤 :
E:\JAVA 自我練習\Son.java:21: cannot find symbol
symbol  : constructor Father()
location: class Father
 Son(){
      ^
1 error

Process completed.


成上述條件,想要修這這樣的問題,只需要在子類別的建構子中加入super("字串") 即可 :
class Father{
 String my_son_Name;
 Father(String name){
  my_son_Name = name;
 }

 public void getName(){
  System.out.println("我兒子叫做:"+my_son_Name);
 }
}

public class Son extends Father{
 Son(){
  super("Andy");
 }

    public static void main(String[] args) {
     Son son = new Son();
     son.getName();
    }
}

執行結果 :
我的兒子叫做:Andy
this() 是什麼?
this 可以參考到目前使用該物件的屬性、方法、以及建構子,不過 this 只能用用在方法或建構子中。

※this( ) 和 super( ) 必須存在於建構子的第1行,且不能同時存在。
※this( ) 和 super( ) 也不能存在於static成員的程式中實作。


沒有留言:

張貼留言