解決了代碼的重用問(wèn)題褥民。
一勃痴、繼承
繼承是利用現(xiàn)有的類(lèi)創(chuàng)建新類(lèi)的過(guò)程谒所,現(xiàn)有的類(lèi)稱(chēng)作基類(lèi)(base class,父類(lèi))沛申,創(chuàng)建的新類(lèi)稱(chēng)作派生類(lèi)(derived class劣领,子類(lèi))。
最高層是最普遍的铁材、最一般的情況尖淘,往下每一層都比上一層更具體奕锌,并包含有高層的特征,通過(guò)這樣的層次結(jié)構(gòu)使下層的類(lèi)能自動(dòng)享用上層類(lèi)的特點(diǎn)和性質(zhì)村生;
繼承其實(shí)就是自動(dòng)地共享基類(lèi)中成員屬性和成員方法的機(jī)制惊暴。
[訪問(wèn)修飾符] class 派生類(lèi)名 extends 基類(lèi)名 {
成員列表
}
class Student extends Person {
}
二、繼承中的構(gòu)造方法
父類(lèi)中的構(gòu)造方法不能被子類(lèi)繼承梆造,即便它是public的缴守;
父類(lèi)的構(gòu)造方法負(fù)責(zé)初始化屬于它的成員變量葬毫,而子類(lèi)的構(gòu)造方法則只需考慮屬于自己的成員變量镇辉,不必去關(guān)注父類(lèi)的情況。
構(gòu)造方法的執(zhí)行順序
當(dāng)實(shí)例化子類(lèi)的對(duì)象時(shí)贴捡,必須先執(zhí)行父類(lèi)的構(gòu)造方法忽肛,然后再執(zhí)行子類(lèi)的構(gòu)造方法;
如果父類(lèi)還有更上級(jí)的父類(lèi)烂斋,就會(huì)先調(diào)用最高父類(lèi)的構(gòu)造方法屹逛,再逐個(gè)依次地將所有繼承關(guān)系的父類(lèi)構(gòu)造方法全部執(zhí)行;
package test;
class ParentClass { //定義父類(lèi)
public ParentClass() { //構(gòu)造方法
System.out.println("這是父類(lèi)的構(gòu)造方法汛骂。");
}
}
class ChildClass extends ParentClass { //子類(lèi)繼承于父類(lèi)
public ChildClass() { //構(gòu)造方法
System.out.println("這是子類(lèi)的構(gòu)造方法罕模。");
}
}
public class ConstructorTest {
public static void main(String[] args) {
ChildClass cc = new ChildClass(); //實(shí)例化子類(lèi)對(duì)象
}
}
如果父類(lèi)的構(gòu)造方法執(zhí)行失敗,那么子類(lèi)的對(duì)象也將無(wú)法實(shí)例化帘瞭。
解釋?zhuān)?/strong>
在實(shí)例化Circle類(lèi)對(duì)象時(shí)淑掌,虛擬機(jī)一定會(huì)先調(diào)用其父類(lèi)(Point類(lèi))的構(gòu)造方法;
Point類(lèi)的構(gòu)造方法需要兩個(gè)參數(shù)來(lái)初始化其成員蝶念,但此時(shí)并沒(méi)有獲得這兩個(gè)參數(shù)抛腕,造成Point類(lèi)的構(gòu)造方法無(wú)法執(zhí)行;
父類(lèi)的構(gòu)造方法執(zhí)行失敗從而導(dǎo)致子類(lèi)(Circle類(lèi))的對(duì)象也無(wú)法創(chuàng)建媒殉;
問(wèn)題的關(guān)鍵是:在實(shí)例化子類(lèi)對(duì)象時(shí)担敌,如何將參數(shù)傳遞給父類(lèi)的構(gòu)造方法?這將使用到super關(guān)鍵字廷蓉。
三全封、super關(guān)鍵字
1、用途1:在子類(lèi)的構(gòu)造方法中桃犬,super關(guān)鍵字可以顯式地調(diào)用父類(lèi)的構(gòu)造方法售貌,用于將參數(shù)傳遞給它。
super(實(shí)際參數(shù));
// 該語(yǔ)句必須是子類(lèi)構(gòu)造方法的第一條語(yǔ)句
2疫萤、用途2:如果父類(lèi)和子類(lèi)中有同名成員颂跨,在子類(lèi)中默認(rèn)訪問(wèn)是屬于自己的那一個(gè)成員;super關(guān)鍵字可以明確地指定要訪問(wèn)父類(lèi)中的成員扯饶。
super.成員名;
// 前提條件是:父類(lèi)中的該成員不是private的恒削。
繼承是單方向的池颈,即派生類(lèi)可以繼承和訪問(wèn)基類(lèi)中的成員,但基類(lèi)則無(wú)法訪問(wèn)派生類(lèi)中的成員钓丰;
在Java中只允許單一繼承方式躯砰,即一個(gè)派生類(lèi)只能繼承于一個(gè)基類(lèi),而不能象C++中派生類(lèi)繼承于多個(gè)基類(lèi)的多重繼承方式携丁。
四琢歇、訪問(wèn)控制權(quán)限
1、信息隱藏
信息隱藏是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特點(diǎn)之一梦鉴,它可以:
- 防止類(lèi)的使用者意外損壞數(shù)據(jù)李茫;
- 對(duì)任何實(shí)現(xiàn)細(xì)節(jié)所作的修改不會(huì)影響到使用該類(lèi)的其它代碼;
- 使類(lèi)更易于使用肥橙。
在Java中實(shí)現(xiàn)信息隱藏的是訪問(wèn)控制權(quán)限機(jī)制魄宏。
2、類(lèi)的訪問(wèn)控制權(quán)限
只有public和缺省兩種:
- 被public修飾的類(lèi)可以從任何地方訪問(wèn)存筏,不受限制宠互;
- 不加訪問(wèn)修飾符,缺省修飾的類(lèi)只能從本包中訪問(wèn)椭坚,不同包則無(wú)法訪問(wèn)到予跌。
但要注意的是:
- 在一個(gè)源文件中只能有一個(gè)被public修飾的類(lèi),并且文件名必須與public的類(lèi)同名善茎;
- 如果要定義多個(gè)public的類(lèi)券册,則必須分別寫(xiě)在不同的源文件中,一個(gè)源文件只寫(xiě)一個(gè)類(lèi)是良好的編程習(xí)慣巾表。
3汁掠、類(lèi)成員的訪問(wèn)控制權(quán)限
7、訪問(wèn)權(quán)限
為了避免從類(lèi)外部直接訪問(wèn)類(lèi)成員而造成的數(shù)據(jù)損壞集币,Java對(duì)類(lèi)成員的訪問(wèn)制定了約束考阱;加上訪問(wèn)修飾符有時(shí)候可能會(huì)給操作數(shù)據(jù)帶來(lái)不便,但可以在很大程度上保證數(shù)據(jù)的安全鞠苟。
關(guān)鍵字public和private是訪問(wèn)修飾符乞榨,用來(lái)說(shuō)明某個(gè)成員是否可以從類(lèi)外部進(jìn)行訪問(wèn)。
public修飾的成員可以在任何地方進(jìn)行訪問(wèn)当娱,不受任何約束吃既;
private修飾的成員只能夠被本類(lèi)中的其它成員訪問(wèn),而不能從類(lèi)的外部進(jìn)行訪問(wèn)跨细。
一般地鹦倚,我們會(huì)將成員屬性聲明為private,而將成員方法聲明為public冀惭,但這樣做并不是絕對(duì)的震叙。
有時(shí)候掀鹅,類(lèi)外部可能要操作到某些私有數(shù)據(jù)成員,那么就可以增加一個(gè)公有的方法媒楼,再由這個(gè)方法來(lái)操作私有數(shù)據(jù)乐尊,避免因類(lèi)外部的誤操作而造成的數(shù)據(jù)損壞。
因?yàn)閙ain方法要由類(lèi)外部的虛擬機(jī)來(lái)調(diào)用划址,所以main方法必須聲明成public扔嵌。