java中繼承的特點
繼承是java中很重要的一個應用.那么,為什么要有繼承呢?我們可以看一個實例:貓類和狗類.貓和狗是生活中常見的動物,它們有哪些共性呢?都有顏色(黑白黃花等),都有腿,都要吃飯,都要睡覺等.那么,顏色和腿的數量就是它們的屬性(成員變量),吃飯和睡覺是它們的行為(功能).如果沒有繼承,分別寫貓類和狗類,如下:
public class Cat{ //貓類 String color ;// 成員變量"顏色" int num; // 成員變量"腿的個數" class Cat (){} //無參構造 class Cat(String color,int num) { //有參構造 this.color = color; this.num = num; } public void setColor(String color) { //set方法 this.color = color; } public String getColor() { //get方法 return color; } public void setNum(int num) { this.num= num; } public int getNum() { return num; } }
狗類和貓類除了類名不一樣,其他的都一樣,寫起來很浪費時間,也浪費內存.因此,用繼承可以提高代碼的復用性.這和java的跨平台道理差不多,都是為了節約和方便.
那么,在java中,具體怎么繼承呢?就是讓類於類之間產生關系,產生父子類關系.也就是說兩個類之間一個屬於另一個,就可以繼承.就像貓和狗,毛不屬於狗,狗不屬於貓,它們倆沒法繼承.但是貓屬於動物,狗也屬於動物.動物和貓之間就可以建立繼承關系.同樣,動物與狗之間也可以建立繼承關系.這樣,動物類的一般屬性和行為,貓和狗類就繼承了.
java的繼承中,也有一些自己的特點.第一:這種繼承是單繼承的關系,不支持多繼承.單繼承就是說一個爹可以有多個兒子,但是一個兒子只能有一個爹.多繼承就是說一個徒弟可以有很多師父(孫悟空就有兩個師父,一個是菩提老祖,一個是唐僧.孫悟空繼承了菩提老祖的部分武藝,又跟着唐僧學做人,最后才成佛).兩種繼承各有各的特點,單繼承呈現樹狀結構,比較安全.多繼承呈現網狀結構,隨意性比較大,不太安全.Java就是選擇了單繼承.同時,這種繼承關系是可以延續下去的,就像爺-父-子-孫這種情況,java中也是這樣,叫多層繼承.
第二:父類私有的成員不能繼承,父類的構造方法不能繼承,別的都可以繼承.為什么私有的不能繼承呢?因為我們要充分尊重別人的隱私,哪怕這個人是你的父親或兒子或妻子.父類讓你繼承,你才可以繼承,父類隱藏起來的,不想讓你繼承的,你就不能繼承.當然,也不能搶.另外,父類的構造方法也不能繼承,因為構造方法有兩個作用.一是對本類成員的初始化,構造方法名和本類名相同,如果繼承的話,和子類名都不一樣,容易搞混.二是內含super()默認訪問父類的無參構造方法.所以,子類和父類各有各的構造方法,但是子類又靠自己的構造方法默認訪問父類的構造方法,相當於家譜中的血緣關系,是一條無形的紐帶.自然界的萬物都是有歸屬有繼承的,java中同樣如此,每個類都有繼承的父類,如果沒有,就是默認繼承Object類.
除此之外,子類不僅要繼承父類,還要有所發展,所謂青出於藍而勝於藍.具體到java中的繼承,體現為方法的重寫,也就是在子類中建立一個方法,和父類方法名一樣,但又有自己獨特的內容,這樣一方面通過繼承可以沿襲父類的功能,同時又有自己的新功能.那么在方法重寫中又有那些要求呢?第一:父類的私有方法不能被重寫,因為根本就沒有繼承,也就沒有重寫的基礎.第二:重寫的方法,訪問權限不能更低.好的東西要學會分享,這樣才能壯大.下面我們用貓類和狗類案例結束.
/* 第一步:建立一個父類:動物類 */ class Animal{ //動物類 String color ;// 成員變量"顏色" int num; // 成員變量"腿的個數" public Animal(){} //無參構造 public Animal(String color,int num) { //有參構造 this.color = color; this.num = num; } public void setColor(String color) { //set方法 設置"顏色" this.color = color; } public String getColor() { //get方法 得到"顏色" return color; } public void setNum(int num) { //set方法 設置"腿的條數" this.num= num; } public int getNum() { //get方法 得到"腿的條數" return num; } public void show() { //展現動物類的屬性 System.out.println(getColor()+"..."+getNum()); } public void eat () { System.out.println("吃飯"); } } /* 第二步:建立兩個子類,分別是貓類和狗類 */ class Cat extends Animal{ public Cat (){} //無參構造 public Cat(String color,int num) { //有參構造 this.color = color; this.num = num; } public void catchMouse() { //貓特有行為:抓老鼠 System.out.println("抓老鼠"); } } class Dog extends Animal { public Dog (){} //無參構造 public Dog(String color,int num) { //有參構造 this.color = color; this.num = num; } public void watchHome() { //狗特有行為:看家 System.out.println("看家"); } } /* 第三步:建立測試類進行測試 */ public class TestAnimal{ public static void main(String[] args) { Cat c1 = new Cat("黃色",4); //創建對象 c1.show(); //調用父類 c1.eat(); //調用父類 c1.catchMouse(); //調用子類 System.out.println("++++++++++++++++"); Dog d1 = new Dog("白色",4); //創建對象 d1.show(); //調用父類 d1.eat(); //調用父類 d1.watchHome(); //調用子類 } }