本文實(shí)例講述了Java面向?qū)ο?/a>編程之類的繼承。分享給大家供大家參考,具體如下:
繼承:特殊類擁有一般類的全部屬性與行為。
繼承好處:
1.提高了代碼的復(fù)用性
2.讓類與類之前產(chǎn)生了關(guān)系,有了這個(gè)關(guān)系才有多態(tài)的特性。繼承是類和類之前的關(guān)系。
注意事項(xiàng):
1.java只支持單繼承,不支持多繼承。因?yàn)槎嗬^承有安全隱患:當(dāng)多個(gè)父類定義相同的函數(shù),但是功能不同時(shí),子類不知道運(yùn)行哪一個(gè)。
2.子類繼承父類時(shí),繼承了父類的所有方法和屬性,可直接使用。
3,java支持多層繼承,即:孫-子-父的關(guān)系
語(yǔ)法:
1
2
3
|
[類修飾符] class 子類名 extends 父類名{ 語(yǔ)句; } |
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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!" ); } } |
如何使用一個(gè)繼承體系中的功能(查閱api文檔):
查閱父類的功能,創(chuàng)建子類對(duì)象使用功能
在繼承過(guò)程中經(jīng)常遇到這三種場(chǎng)景:
1)同名變量
1.如果子類出現(xiàn)非私有的同名成員變量時(shí),子類訪問(wèn)本類的變量,用this;子類訪問(wèn)父類中的同名變量,用super。
2.this代表本類對(duì)象的引用
3.super代表父類對(duì)象的引用(用法和this相同)
2)同名函數(shù)
1.如果子類出現(xiàn)和父類一模一樣的函數(shù)時(shí)(函數(shù)名和參數(shù)都相同),當(dāng)子類對(duì)象調(diào)用該函數(shù),會(huì)運(yùn)行子類函數(shù)內(nèi)容。,父類的函數(shù)會(huì)被覆蓋(也叫重寫(xiě))。
2.重寫(xiě)定義:當(dāng)子類繼承父類,沿襲了父類的功能,到子類中。但子類雖具備該功能,但功能的內(nèi)容和父類不一致,這時(shí),沒(méi)有必須要定義新功能,而是使用覆蓋特性,保留父類的功能定義,并重寫(xiě)功能內(nèi)容。
3.重寫(xiě)(覆蓋)注意事項(xiàng):
<1>子類覆蓋父類,必須保證子類的權(quán)限大于等于父類的權(quán)限,才能繼承,否則編譯失敗。(public>不寫(xiě)修辭關(guān)鍵詞>private)
<2>靜態(tài)只能覆蓋靜態(tài)
<3>重載:只看同名函數(shù)的參數(shù)列表 重寫(xiě):子父類方法要一模一樣(函數(shù)名和參數(shù)列表)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Fu { //public void show() 當(dāng)父類為show()時(shí),會(huì)和子類函數(shù)一模一樣,父類的show函數(shù)會(huì)被重寫(xiě) public void show(String name) //父類的show函數(shù)和子類不一樣(參數(shù)列表不一樣),因此父類的show函數(shù)不會(huì)被重寫(xiě) { 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" ); //會(huì)調(diào)用父類的show函數(shù) } } |
3)構(gòu)造函數(shù)
1.在對(duì)子類對(duì)象進(jìn)行初始化時(shí),父類的構(gòu)造函數(shù)也會(huì)運(yùn)行,因?yàn)樽宇惖臉?gòu)造函數(shù)的第一行默認(rèn)有一條隱式語(yǔ)句super()
2.super()會(huì)訪問(wèn)父類中空參數(shù)的構(gòu)造函數(shù),而且子類中所有的構(gòu)造函數(shù)第一行默認(rèn)都是super()
3.子類一定要訪問(wèn)父類構(gòu)造函數(shù)原因
<1>因?yàn)楦割愔械臄?shù)據(jù)子類可以直接獲取,所以子類在創(chuàng)建是,先看看父類如何對(duì)這些數(shù)據(jù)進(jìn)行初始化的,所以子類在對(duì)象初始化時(shí),默認(rèn)先訪問(wèn)父類的構(gòu)造函數(shù)。
<2>若要訪問(wèn)父類制定的構(gòu)造函數(shù)或者父類沒(méi)有空參數(shù)的構(gòu)造函數(shù)時(shí),可以通過(guò)手動(dòng)定義super語(yǔ)句的方式來(lái)制定。
<3>當(dāng)然子類的構(gòu)造函數(shù)第一行也可以手動(dòng)指定this語(yǔ)句來(lái)訪問(wèn)本類的構(gòu)造函數(shù),但子類中至少有一個(gè)構(gòu)造函數(shù)會(huì)訪問(wèn)父類的構(gòu)造函數(shù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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");} 默認(rèn)先會(huì)調(diào)用父類的無(wú)參構(gòu)造函數(shù) Zi() { super ( "zhangsan" , 20 ); //手動(dòng)用super語(yǔ)句指定父類的構(gòu)造函數(shù),來(lái)獲取父類非私有的信息 System.out.println(name+ "::" +age); } } class Test { public static void main(String[] args) { Zi z1= new Zi(); } } |
構(gòu)造函數(shù)異常例子:
寫(xiě)出程序結(jié)果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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(d.i); } } //編譯失敗,因?yàn)楦割愔腥鄙倏諈?shù)的構(gòu)造函數(shù)。 //或者子類應(yīng)該通過(guò)super語(yǔ)句指定要調(diào)用的父類中的構(gòu)造函數(shù)。 |
重寫(xiě)和重載例子:
1
2
3
4
|
class Demo { int show( int a, int b){ return 0 ;} } |
下面那些函數(shù)可以存在于Demo的子類中。
A.public int show(int a,int b){return 0;}//可以,覆蓋。
B.private int show(int a,int b){return 0;}//不可以,權(quán)限不夠。
C.private int show(int a,long b){return 0;}//可以,和父類不是一個(gè)函數(shù)。沒(méi)有覆蓋,相當(dāng)于重載。
D.public short show(int a,int b){return 0;}//不可以,因?yàn)樵摵瘮?shù)不可以和給定函數(shù)出現(xiàn)在同一類中,或者子父類中。
E.static int show(int a,int b){return 0;}//不可以,靜態(tài)只能覆蓋靜態(tài)。<br><br>因此子類允許重寫(xiě)和重載。
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
原文鏈接:http://www.cnblogs.com/paulwinflo/p/7992942.html