Java 繼承 – (Java教程) – Inheritance 繼承就是把多個Class, 來歸類為一個抽象的Class.
而用繼承有何好處呢?
- 代碼重用, 這不多說了.
- 為後屬類們可以有相同的method, property, 可以在日後中用List, Array等把它們串連起來, 再用foreach迴圈等令它們可以一起運作相同的code.
- 後屬類可以用override把method重寫, 令到coding 可以用同一個for loop 內引用同一套流程 (如control flow等), 但內裏又可以有不同的程式內容, 去實作程序流程.
- 建立一個既定的框架, 方便協作, 明確責任. 程序員只需在自己的框架內工作, 不會因自己的改動而影响其他程序的部份.
用法例子
- 在狗類, 馬類, 羊類, 鐵類, 屋類中的例子中, 我們可以把狗類, 馬類, 羊類歸類為一個新的抽象類, 即動物類.
- 在那個抽象的class(如動物類)中, 我們可以把在他的後屬類(狗類, 馬類, 羊類)的method, property等的相同code抽出來, 放在抽象類中, 以供後屬類重用.
- 也可反過來, 先設立抽象Class, 再以此為基礎來發展出新的後屬類, 但能否做到如此就看對這個類有多少認識了.
以下會舉一個簡單的生活例子 (Inherit 繼承) 以顯示出Inheritance 的基本用法, 以下供各位參考:
Abstract Class Master: |
abstract class Master{ public String name; public int sleepy = 0; public int boring = 0; public int hungry = 0; public abstract void Play(); public abstract void Sleep(); public abstract void Eat(); public abstract void UpdateState(); public abstract Boolean isSleepy(); public abstract Boolean isBoring(); public abstract Boolean isDestory(); public abstract Boolean isHungry(); } |
Inherit Class Cat: |
class Cat extends Master { public Cat(String name){ this.name = name; } public Boolean isSleepy() { return sleepy > 80; } public Boolean isBoring() { return boring > 70; } public Boolean isDestory() { return boring > 95; } public Boolean isHungry() { return hungry > 75; } public void Play(){ System.out.println(“Cat ” + this.name + ” Play”); boring = 0; } public void Sleep(){ System.out.println(“Cat ” + this.name + ” Sleep”); sleepy = 0; } public void Eat(){ System.out.println(“Cat ” + this.name + ” Eat”); hungry = 0; } public void DestoryYourHome(){ System.out.println(“Cat ” + this.name + ” Destory Your Home Now.”); hungry = 0; }; public void UpdateState(){ this.sleepy++; this.boring++; this.hungry++; }; } |
Inherit Class Dog: |
class Dog extends Master { public Dog(String name){ this.name = name; } public Boolean isSleepy() { return sleepy > 50; } public Boolean isBoring() { return boring > 40; } public Boolean isDestory() { return boring > 80; } public Boolean isHungry() { return hungry > 60; } public void Play(){ System.out.println(“Cat ” + this.name + ” Play”); boring = 0; } public void Sleep(){ System.out.println(“Cat ” + this.name + ” Sleep”); sleepy = 0; } public void Eat(){ System.out.println(“Cat ” + this.name + ” Eat”); hungry = 0; } public void DestoryYourHome(){ System.out.println(“Dog ” + this.name + ” Destory Your Home Now.”); hungry = 0; }; public void UpdateState(){ this.sleepy++; this.boring++; this.hungry++; }; } |
Running Class: |
class Environment{ public bool HaveFood = true; public bool HaveSlavery = true; //Running Point public void Run(){ ArrayList<Master> animals = new ArrayList<Master>(); animals.add(new Cat(“Petty”)); animals.add(new Dog(“Jerry”)); animals.add(new Cat(“Potty”)); while(true) { for(Master animal : animals){ animals.UpdateState(); if (animal.isSleepy()){ animal.Sleep(); } else if (HaveFood && animal.isHungry()){ animal.Eat(); } else if (HaveSlavery && animal.isBoring()){ animal.Play(); } else if (!HaveSlavery && animal.isDestory()){ animal.DestoryYourHome(); } } Thread.Sleep(1000); //Every Second } } } |
注意事項 |
Environment.Run 是入口首先把幾個Cat, Dog的Instance放入ArrayList<Master>內 用while及Thread.Sleep 行每秒行一次在foreach的方法內, 會把每一位Master(主子—Cat, dog)的行為行一次 首先UpdateState (在Master class 內的共用方法)然後看看isSleepy, 如果是true 的話就Sleep(); 然後看看HaveFood及isHungry, 如果是true 的話就Eat(); 然後看看HaveSalavry及isBoring, 如果是奴才在家(HaveSalavry== true) 的話就同主子 Play(); 然後看看HaveSalavry及isBoring, 如果是奴才不在家(HaveSalavry == false)的話, DestoryYourHome(); 在Cat同Dog的 isSleepy, isBoring, isDestory, isHungry 內, 大家的Logic也可不一樣。 |
相關頁面:
Java 類別 – Class, Method, Inheritance, Interface的基礎用法
Java 介面 – Interface 的基本用法 – 結合 for loop, if, Array, Collection作例子
參考網頁: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html