子類 extends 父類? ?所屬關(guān)系 is a?
提高代碼復(fù)用性;讓類與類之間產(chǎn)生關(guān)系集畅,多態(tài)特性近弟; 一般只支持單繼承,Java支持多層繼承挺智;
具體調(diào)用時(shí)要?jiǎng)?chuàng)建最子類的對(duì)象祷愉,因?yàn)楦割惪赡懿荒軇?chuàng)建對(duì)象,子類對(duì)象可以使用更多的功能赦颇。查閱父類功能二鳄,創(chuàng)建子類對(duì)象使用功能
super超,指超類媒怯,相對(duì)于this订讼,對(duì)父類的引用。
原理:方法區(qū)里子類內(nèi)存除了this 引用扇苞,還有super引用欺殿。
父類子類同名函數(shù):也叫重寫寄纵,子類對(duì)象調(diào)用函數(shù)時(shí),會(huì)運(yùn)行子類函數(shù)的內(nèi)容脖苏,父類函數(shù)被覆蓋擂啥,但是還在方法區(qū)。重寫是面向?qū)ο蟮?/b>
原則:不要修改以前繼承的源碼帆阳,可以新建類繼承并升級(jí)代碼
**注意:子類覆蓋父類哺壶,必須保證子類權(quán)限大于等于父類權(quán)限,否則編譯失斞寻山宾;靜態(tài)不能覆蓋非靜態(tài)(存在加載先后問(wèn)題,因?yàn)殪o態(tài)在棧內(nèi)存加載前就被加載了)鳍徽。如果父類是private,就不能說(shuō)是重寫了资锰,因?yàn)樽宇惗紵o(wú)法知道父類的函數(shù)。
重載不同重寫阶祭,重寫父子類方法要一模一樣(多態(tài)中參數(shù)類型有關(guān)系)绷杜。不允許繼承中有同名但不同的方法。
子父類中的構(gòu)造函數(shù):子類對(duì)象初始化時(shí)濒募,父類的構(gòu)造函數(shù)也會(huì)運(yùn)行鞭盟,會(huì)訪問(wèn)父類空參數(shù)的構(gòu)造函數(shù)。
子類構(gòu)造函數(shù)(所有構(gòu)造函數(shù))有一條隱式的在第一行的語(yǔ)句:super();調(diào)用父類(無(wú)參數(shù)的)構(gòu)造函數(shù)瑰剃。所以第一行必須是super或者this齿诉。
如果父類中定義了特定的構(gòu)造函數(shù)(不是空參數(shù)),那么子類的構(gòu)造函數(shù)中必須要顯式地添加父類的構(gòu)造函數(shù)晌姚。
父類調(diào)用完的內(nèi)容粤剧,子類可以直接用,不用重寫例如:super(name)
*為什么子類一定要訪問(wèn)父類的構(gòu)造函數(shù)挥唠?
子類可以直接獲取父類數(shù)據(jù)抵恋,并且需要知道父類對(duì)數(shù)據(jù)進(jìn)行初始化的動(dòng)作(在構(gòu)造函數(shù)中),所以子類要先訪問(wèn)一下父類的構(gòu)造函數(shù)宝磨。
結(jié)論(子類的實(shí)例化過(guò)程):
1.子類中所有的構(gòu)造函數(shù)默認(rèn)都會(huì)訪問(wèn)父類中空參數(shù)的構(gòu)造函數(shù)(super();)
2.如果父類中沒(méi)有空參數(shù)的構(gòu)造函數(shù)時(shí)弧关,子類必須手動(dòng)通過(guò)super語(yǔ)句訪問(wèn)指定的父類構(gòu)造函數(shù)
3.也可以通過(guò)手動(dòng)指定this語(yǔ)句訪問(wèn)本誒構(gòu)造函數(shù)(因此子類中至少會(huì)有一個(gè)構(gòu)造函數(shù)訪問(wèn)父類中的構(gòu)造函數(shù))
this、super兩者語(yǔ)句都必須在第一行
final 可以修飾類懊烤、函數(shù)梯醒、變量。
1.被final修飾的類不可以被繼承腌紧,弊端:打破了封裝性茸习。
2.被final修飾的方法不可以被復(fù)寫。
3.被final修飾的變量只能賦值一次壁肋,既可以修飾成員變量号胚,也可以修飾局部變量(常量)籽慢。
為了避免某些調(diào)用底層的方法被繼承,被子類復(fù)寫功能猫胁。
后面會(huì)講:內(nèi)部類定義在類中的局部位置時(shí)箱亿,只能訪問(wèn)該局部final修飾的成員變量。
目前類修飾的關(guān)鍵字有 public弃秆、final
抽象類
當(dāng)多個(gè)類中出現(xiàn)相同功能届惋,但功能主體不同。這時(shí)可以向上抽取菠赚,只抽取功能定義脑豹,不抽取功能主體:abstract void study();(這個(gè)方法沒(méi)有方法體)這個(gè)類必須存放在抽象類中:abstract class ***,不可以在這個(gè)類上建立對(duì)象。
特點(diǎn):
1.抽象方法一定在抽象類中衡查;
2.抽象方法和類都必須被abstract修飾
3.抽象類 不可以用new創(chuàng)建對(duì)象瘩欺,因?yàn)檎{(diào)用的方法沒(méi)有方法體,如果是void study (){}就可以(類和方法無(wú)abstract修飾)
4.抽象類的方法要使用拌牲,必須要由子類復(fù)寫其功能并建立對(duì)象調(diào)用俱饿。**如果子類繼承了父類但只是重寫了父類的部分抽象方法,那么子類還是一個(gè)抽象類塌忽,子類需要加上abstract修飾符拍埠。
抽象父類強(qiáng)制子類復(fù)寫抽象方法。
抽象類中可以沒(méi)有抽象方法砚婆,但這樣僅僅是不讓這個(gè)類建立對(duì)象械拍。
抽象類和一般類的不同:
1.描述事物相同,只不過(guò)事物中出現(xiàn)抽象方法装盯,無(wú)法定義主題,需要在子類主體重明確出現(xiàn)甲馋。功能不確定的放到子類去做埂奈;
2.抽象類不可以實(shí)例化;*********6铩U嘶恰!
獲取時(shí)間:System.currentTimeMillis();API中查找痊远。
把程序代碼單獨(dú)放在一個(gè)方法中進(jìn)行封裝(或者在不確定的時(shí)候抽象)垮抗,建立子類對(duì)象,但是在子類中對(duì)不同的程序代碼進(jìn)行復(fù)寫.直接調(diào)用子類方法即可碧聪。
為了不讓獲取時(shí)間的方法被復(fù)寫冒版,所以對(duì)方法用final復(fù)寫逆趋。
模板方法:有一部分是確定的舒岸,一部分的不確定的。不確定的部分暴露出去(不一定抽象),由子類去完成岩梳。
接口interface:抽象類中都是抽象方法。該類可以通過(guò)接口的形式表示,不可創(chuàng)建對(duì)象闯袒。擴(kuò)展功能波材。
class 是定義類? interface是定義接口
格式:interface 接口名{}
常見(jiàn)定義:常量,抽象方法挺狰。
接口中的成員都有固定修飾符:
常量:public static final(會(huì)在interface中自動(dòng)加上)
方法:public abstract
class 類名 implements 接口(子類要將接口的全部抽象方法都實(shí)現(xiàn)才能實(shí)例化明郭,否則這個(gè)類就是abstract。并且權(quán)限都要是public)
接口可以被類多實(shí)現(xiàn)丰泊,也是對(duì)多繼承不支持的轉(zhuǎn)換形式达址。Java支持多實(shí)現(xiàn)。因?yàn)榻涌谥械姆椒从蟹椒w趁耗。
一個(gè)類繼承了父類之后還能多實(shí)現(xiàn)接口沉唠。
接口與接口之間的關(guān)系:繼承 extends。接口之間支持多繼承苛败,但是不能有返回不同類型的同名方法满葛。
結(jié)論:將共性定義在類中,擴(kuò)展功能(體系外)定義在接口中