本文實例講述了Java面向對象編程之類的繼承。分享給大家供大家參考,具體如下:
繼承:特殊類擁有一般類的全部屬性與行為。
繼承好處:
1.提高了代碼的複用性
2.讓類與類之前產生了關係,有了這個關係才有多態的特性。繼承是類和類之前的關係。
注意事項:
1.java只支持單繼承,不支持多繼承。因為多繼承有安全隱患:當多個父類定義相同的函數,但是功能不同時,子類不知道運行哪一個。
2.子類繼承父類時,繼承了父類的所有方法和屬性,可直接使用。
3,java支持多層繼承,即:孫-子-父的關係
文法:
[類修飾符] class 子類名extends 父類名{ 語句;}例如:
class Pserson{ int age; String name; public void speak() { System.out.println("Hello World!"); }}//繼承Person類,繼承了父類所有方法和屬性class Student extends Pserson{ public void study() { System.out.println("Good Study!"); }}//繼承Person類,繼承了父類所有方法和屬性class Worker extends Pserson{ public void work() { System.out.println("Good work!"); }}如何使用一個繼承體系中的功能(查閱api文檔):
查閱父類的功能,創建子類對象使用功能
在繼承過程中經常遇到這三種場景:
1)同名變量
1.如果子類出現非私有的同名成員變量時,子類訪問本類的變量,用this;子類訪問父類中的同名變量,用super。
2.this代表本類對象的引用
3.super代表父類對象的引用(用法和this相同)
2)同名函數
1.如果子類出現和父類一模一樣的函數時(函數名和參數都相同),當子類對象調用該函數,會運行子類函數內容。 ,父類的函數會被覆蓋(也叫重寫)。
2.重寫定義:當子類繼承父類,沿襲了父類的功能,到子類中。但子類雖具備該功能,但功能的內容和父類不一致,這時,沒有必須要定義新功能,而是使用覆蓋特性,保留父類的功能定義,並重寫功能內容。
3.重寫(覆蓋)注意事項:
<1>子類覆蓋父類,必須保證子類的權限大於等於父類的權限,才能繼承,否則編譯失敗。 (public>不寫修辭關鍵詞>private)
<2>靜態只能覆蓋靜態
<3>重載:只看同名函數的參數列表重寫:子父類方法要一模一樣(函數名和參數列表)
class Fu{ //public void show() 當父類為show()時,會和子類函數一模一樣,父類的show函數會被重寫public void show(String name) //父類的show函數和子類不一樣(參數列表不一樣),因此父類的show函數不會被重寫{ System.out.println(name); }}class Zi extends Fu{ public void show() { System.out.println("zi"); }}class Jicheng{ public static void main(String[] args) { Zi z1=new Zi(); z1.show("nihao");//會調用父類的show函數}}3)構造函數
1.在對子類對象進行初始化時,父類的構造函數也會運行,因為子類的構造函數的第一行默認有一條隱式語句super()
2.super()會訪問父類中空參數的構造函數,而且子類中所有的構造函數第一行默認都是super()
3.子類一定要訪問父類構造函數原因
<1>因為父類中的數據子類可以直接獲取,所以子類在創建是,先看看父類如何對這些數據進行初始化的,所以子類在對像初始化時,默認先訪問父類的構造函數。
<2>若要訪問父類製定的構造函數或者父類沒有空參數的構造函數時,可以通過手動定義super語句的方式來製定。
<3>當然子類的構造函數第一行也可以手動指定this語句來訪問本類的構造函數,但子類中至少有一個構造函數會訪問父類的構造函數
class Fu{ String name; int age; Fu(){System.out.println("Hello Fu");} Fu(String name) { System.out.println(name); } Fu(String name,int age) { this.name=name; this.age=age; System.out.println("name: "+name+",age: "+age); }}class Zi extends Fu{ //Zi(){System.out.println("Hello Zi");} 默認先會調用父類的無參構造函數Zi() { super("zhangsan",20);//手動用super語句指定父類的構造函數,來獲取父類非私有的信息System.out.println(name+"::"+age); }}class Test{ public static void main(String[] args) { Zi z1=new Zi(); }}構造函數異常例子:
寫出程序結果
class Super{ int i=0; public Super(String s) { i=1; }}class Demo extends Super{ public Demo(String s) { i=2; } public static void main(String[] args) { Demo d=new Demo("yes"); System.out.println(di); }}//編譯失敗,因為父類中缺少空參數的構造函數。 //或者子類應該通過super語句指定要調用的父類中的構造函數。重寫和重載例子:
class Demo{ int show(int a,int b){return 0;}}下面那些函數可以存在於Demo的子類中。
A.public int show(int a,int b){return 0;}//可以,覆蓋。
B.private int show(int a,int b){return 0;}//不可以,權限不夠。
C.private int show(int a,long b){return 0;}//可以,和父類不是一個函數。沒有覆蓋,相當於重載。
D.public short show(int a,int b){return 0;}//不可以,因為該函數不可以和給定函數出現在同一類中,或者子父類中。
E.static int show(int a,int b){return 0;}//不可以,靜態只能覆蓋靜態。 <br><br>因此子類允許重寫和重載。
更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。