final關(guān)鍵字
final 關(guān)鍵字聲明類可以把類定義為不能繼承的,即最終類;或者用于修飾方法,該方法不能被子類重寫:
聲明類:
final class 類名 {//類體}
聲明方法:
修飾符(public,private,void,protected等) final 返回值類型 方法名(){//方法體}
注:實(shí)例變量也可以被定義為 final,被定義為 final 的變量不能被修改。被聲明為 final 類的方法自動(dòng)地聲明為 final,但是實(shí)例變量并不是 final
extends關(guān)鍵字
在 Java 中,類的繼承是單一繼承,也就是說,一個(gè)子類只能擁有一個(gè)父類,所以 extends 只能繼承一個(gè)類。
implements關(guān)鍵字
使用 implements 關(guān)鍵字可以變相的使java具有多繼承的特性,使用范圍為類繼承接口的情況,可以同時(shí)繼承多個(gè)接口(接口跟接口之間采用逗號(hào)分隔)。
super 與 this 關(guān)鍵字
super關(guān)鍵字:我們可以通過super關(guān)鍵字來實(shí)現(xiàn)對(duì)父類成員的訪問,用來引用當(dāng)前對(duì)象的父類。
this關(guān)鍵字:指向自己的引用。
構(gòu)造器
子類不能繼承父類的構(gòu)造器(構(gòu)造方法或者構(gòu)造函數(shù)),但是父類的構(gòu)造器帶有參數(shù)的,則必須在子類的構(gòu)造器中顯式地通過super關(guān)鍵字調(diào)用父類的構(gòu)造器并配以適當(dāng)?shù)膮?shù)列表。
如果父類有無參構(gòu)造器,則在子類的構(gòu)造器中用super調(diào)用父類構(gòu)造器不是必須的,如果沒有使用super關(guān)鍵字,系統(tǒng)會(huì)自動(dòng)調(diào)用父類的無參構(gòu)造器。
實(shí)例
class SuperClass {
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n) {
System.out.println("SuperClass(int n)");
this.n = n;
}
}
class SubClass extends SuperClass{
private int n;
SubClass(){
super(300);
System.out.println("SubClass");
}
public SubClass(int n){
System.out.println("SubClass(int n):"+n);
this.n = n;
}
}
public class TestSuperSub{
public static void main (String args[]){
SubClass sc = new SubClass();
SubClass sc2 = new SubClass(200);
}
}
輸出結(jié)果為:
SuperClass(int n)
SubClass
SuperClass()
SubClass(int n):200
多態(tài)的實(shí)現(xiàn)方式
方式一:重寫:
方式二:接口
方式三:抽象類和抽象方法
抽象類總結(jié)規(guī)定
- 抽象類不能被實(shí)例化(初學(xué)者很容易犯的錯(cuò)),如果被實(shí)例化,就會(huì)報(bào)錯(cuò),編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對(duì)象。
- 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
- 抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實(shí)現(xiàn)也就是方法的具體功能。
- 構(gòu)造方法,類方法(用static修飾的方法)不能聲明為抽象方法。
- 抽象類的子類必須給出抽象類中的抽象方法的具體實(shí)現(xiàn),除非該子類也是抽象類。
接口與類的區(qū)別:
接口不能用于實(shí)例化對(duì)象。
接口沒有構(gòu)造方法。
接口中所有的方法必須是抽象方法。
接口不能包含成員變量,除了 static 和 final 變量。
接口不是被類繼承了,而是要被類實(shí)現(xiàn)。
接口支持多重繼承。
接口特性
- 接口是隱式抽象的,當(dāng)聲明一個(gè)接口的時(shí)候,不必使用abstract關(guān)鍵字。
- 接口中每一個(gè)方法也是隱式抽象的,接口中的方法會(huì)被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會(huì)報(bào)錯(cuò))。
- 接口中可以含有變量,但是接口中的變量會(huì)被隱式的指定為 public static final 變量(并且只能是 public,用 private 修飾會(huì)報(bào)編譯錯(cuò)誤。
- 接口中的方法是不能在接口中實(shí)現(xiàn)的,只能由實(shí)現(xiàn)接口的類來實(shí)現(xiàn)接口中的方法。
抽象類和接口的區(qū)別
- 抽象類中的方法可以有方法體,就是能實(shí)現(xiàn)方法的具體功能,但是接口中的方法不行。
- 抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是 public static final 類型的。
- 接口中不能還有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法。
- 一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口。
在實(shí)現(xiàn)接口的時(shí)候,也要注意一些規(guī)則:
- 一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口。
- 一個(gè)類只能繼承一個(gè)類,但是能實(shí)現(xiàn)多個(gè)接口。
- 一個(gè)接口能繼承另一個(gè)接口,這和類之間的繼承比較相似。
接口的多重繼承
- 在Java中,類的多重繼承是不合法,但接口允許多重繼承
- 在接口的多重繼承中extends關(guān)鍵字只需要使用一次,在其后跟著繼承接口。
標(biāo)記接口
- 最常用的繼承接口是沒有包含任何方法的接口。
- 標(biāo)識(shí)接口是沒有任何方法和屬性的接口.它僅僅表明它的類屬于一個(gè)特定的類型,供其他代碼來測(cè)試允許做一些事情。
- 標(biāo)識(shí)接口作用:簡(jiǎn)單形象的說就是給某個(gè)對(duì)象打個(gè)標(biāo)(蓋個(gè)戳),使對(duì)象擁有某個(gè)或某些特權(quán)。