從教程(十)開始,已經從學習單個類的基本語法,轉到了學習多個類之間 的關系。教程(十)中,學習了類與類長間的兩種關系,關聯和依賴。為了維護 1對多的關系,在教程(十一)中,學習了數組。除了關聯和依賴,類與類還有 一種非常重要且常見的關系,就是繼承。本文將介紹繼承的概念、作用、使用場 景等。
假設有這樣一個簡單需求(其實談不上是需求,僅僅為了初學者容易理解而 編造):某培訓中心要開發一個內部員工管理系統。該培訓中心目前有兩個部門 ,技術資源部和業務部。技術資源部的員工負責講課,稱為講師。業務部員工負 責聯系洽談業務,稱為銷售。在管理系統中,需要管理的是所有員工的姓名、薪 水,以及講師的技術方向,銷售的任務量。…..
對上述簡單描述,讓我們分析一下,該培訓中心的系統中,主要管理的對象 是什麼?不難看出,主要是兩種員工,即講師和銷售。講師和銷售有不同之處, 如講師有授課方向屬性,銷售有任務量屬性,二者還有很多相同之處,比如都需 要管理其名字,薪水。也就是說,如果我們創建兩個類,Trainer類,Sales類, 那麼這兩個類中一定有相同的部分。面向對象編程的一大目標就是重復使用,我 們如何能讓多個類中相同的部分能重復使用哪?就可以借助繼承這一特性來完成 。可以說,繼承的主要目的是為了重復使用。我們可以把多個類中相同的部分抽 取出來,放到一個類中,這個類叫父類,或者超級類,其他的類可以繼承這個類 ,從而重用該類中的屬性和方法,這些類叫子類,或者衍生類。在Java語言中, 繼承使用extends關鍵字完成。
接下來,我們使用代碼,把培訓中心的員工類進行展現。
package com.csst.inherit; public class Employee { private String name; private double salary; public Employee() { } public Employee(String name, double salary) { super(); this.name = name; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } } package com.csst.inherit; public class Trainer extends Employee { private String course; public Trainer() { } public Trainer(String name, double salary, String course) { super(name, salary); this.course = course; } public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } } package com.csst.inherit; public class Sales extends Employee { private double task; public Sales() { super(); } public Sales(String name, double salary, double task) { super(name, salary); this.task = task; } public double getTask() { return task; } public void setTask(double task) { this.task = task; } } package com.csst.inherit; public class TestEmployee { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Sales sale=new Sales("Kate",3000,100000); System.out.println("sale.name : "+sale.getName() +" sale.salary : "+sale.getSalary()+" sale.task: "+sale.getTask()); Trainer trainer=new Trainer ("Rose",3000,"Java"); System.out.println("trainer.name: "+trainer.getName ()+" tainer.salary: "+trainer.getSalary()+" trainer.course: "+trainer.getCourse()); } }
運行結果為:
sale.name : Kate sale.salary : 3000.0 sale.task: 100000.0
trainer.name: Rose tainer.salary: 3000.0 trainer.course: Java
以上代碼中,Employee是父類,Trainer和Sales是子類,通過extends繼承了 Employee。因為繼承了Employee,所以Trainer和Sales可以重復使用Employee中 的方法,如getName,getSalary,當然,需要注意權限問題。
繼承是“is-a”關系,即子類對象都是父類類型的對象。如Trainer的對象可 以說是一個Employee類型對象。在Java語言中,一定要記住的是:Java中是單繼 承,即一個類只能繼承一個父類。
繼承中還有很多其他的細節,如方法覆蓋,構造方法,抽象類,多態參數等 ,在後續教程中,將逐一介紹。