多個類中存在相同屬性和行爲時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行爲,只要繼承那個類便可。java
多個類能夠稱爲子類,單獨這個類稱爲父類、超類或者基類。模塊化
子類能夠直接訪問父類中的非私有的屬性和行爲。函數
經過 extends 關鍵字讓類與類之間產生繼承關係。工具
class SubDemo extends Demo{} //SubDemo是子類,Demo是父類
1.Java只支持單繼承,不支持多繼承。學習
//一個類只能有一個父類,不能夠有多個父類。
class SubDemo extends Demo{} //ok class SubDemo extends Demo1,Demo2...//error
2.Java支持多層(重)繼承(繼承體系)。this
class A{} class B extends A{} class C extends B{}
super是一個關鍵字,表明父類的存儲空間標識。(能夠理解爲父親的引用)spa
super和this的用法類似。模塊化開發
this表明對象的引用(誰調用就表明誰);
super表明當前子類對父類的引用。對象
使用場景繼承
區別
1.成員變量
this.變量 -- 本類的
super.變量 -- 父類的
2.構造方法
this(...) -- 本類的
super(...) -- 父類的
3.成員方法
this.方法名() -- 本類的
super.方法名() -- 父類的
super();和this();都是在構造函數的第一行,不能同時出現。
子類中出現與父類如出一轍的方法時(除了權限修飾符,權限修飾符大於等於不包括private,返回值類型,方法名和參數列表相同),會出現覆蓋操做,也稱爲重寫或者複寫。
父類私有方法,子類看不到,所以父類私有方法的重寫也就無從談起。
覆蓋注意事項:
覆蓋的使用場景:
當子類須要父類的功能,而功能主體子類有本身特有內容時,能夠複寫父類中的方法,這樣,既沿襲了父類的功能,又定義了子類特有的內容。
方法重寫和重載有什麼區別?
方法的重寫用在子類方法與父類方法如出一轍時,除權限修飾符,返回值類型,方法名和參數列表都是相同的。
重載用在同一個類中各方法方法名相同,參數列表不一樣(與返回值類型沒有關係)的狀況。
子父類中構造方法的用法:
靜態代碼塊、構造代碼塊,構造方法的執行順序:
父類靜態代碼塊→子類靜態代碼塊→父類構造代碼塊→父類構造方法→子類構造代碼塊→子類構造方法
final是一個關鍵字,能夠用於修飾類,成員變量,成員方法。
特色:
final修飾的常量定義通常都有書寫規範,被final修飾的常量名稱,全部字母都大寫。
final修飾成員變量,必須初始化,初始化有兩種
final和private的區別:
概念:
對象在不一樣時刻表現出來的不一樣狀態。
多態的前提:
程序中的體現:
父類或者接口的引用指向或者接收本身的子類對象。
好處和做用:
多態的存在提升了程序的擴展性和後期可維護性。
弊端:
父類調用的時候只能調用父類裏的方法,不能調用子類的特有方法,由於你並不清楚未來會有什麼樣的子類繼承你。
多態的成員特色:
必定不可以將父類的對象轉換成子類類型!
父類的引用指向子類對象,該引用能夠被提高,也能夠被強制轉換。
多態自始至終都是子類對象在變化!
//多態向下轉型和向上轉型的例子,多態轉型解決了多態中父類引用不能使用子類特有成員的弊端。
class PolymorphicTest2 { public static void main(String[] args) { Phone p1 = new Nokia(); //向上轉型,類型提高 Nokia no = (Nokia)p1; //向下轉型,強制將父類的引用轉換成子類類型,不能將Nokia類型轉成Moto或Nexus類型 no.print(); //輸出結果爲Phone---null---0,由於繼承了父類的方法 Phone p2 = new Moto(); Moto m = (Moto)p2; m.print(); //輸出結果爲Moto---yellow---1599,方法重寫,子類方法覆蓋父類方法 Phone p3 = new Nexus(); Nexus ne = (Nexus)p3; ne.print(); } } class Phone{ String color; int price; public void print(){ System.out.println("Phone---" + color + "---" + price ); } } class Nokia extends Phone{ String color = "red"; int price = 1009; //public void print(){ // System.out.println("Nokia---" + color + "---" + price); //} } class Moto extends Phone{ String color = "yellow"; int price = 1599; public void print(){ System.out.println("Moto---" + color + "---" + price); } } class Nexus extends Phone{ String color = "black"; int price = 1999; public void print(){ System.out.println("Nexus---" + color + "---" + price); } } }
抽象就是從多個事物中將共性的,本質的內容抽象出來。
抽象類:
Java中能夠定義沒有方法體的方法,該方法的具體實現由子類完成,該方法稱爲抽象方法,包含抽象方法的類就是抽象類。
由來:
多個對象都具有相同的功能,可是功能具體內容有所不一樣,那麼在抽取過程當中,只抽取了功能定義,並未抽取功能主體,那麼只有功能聲明,沒有功能主體的方法稱爲抽象方法。
抽象類特色:
抽象類的成員特色:
abstract class 葵花寶典 { public abstract void 自宮(); } class 嶽不羣 extends 葵花寶典 { public void 自宮(){ System.out.println("剪刀"); } } class 林平之 extends 葵花寶典{ public void 自宮(){ System.out.println("指甲刀"); } } class AbstractTest { public static void main(String[] args) { 嶽不羣 嶽 = new 嶽不羣(); 嶽.自宮(); 林平之 林 = new 林平之(); 林.自宮(); } }
抽象類注意事項:
抽象類不能被實例化,爲何還有構造函數?
只要是class定義的類裏面就確定有構造函數。抽象類中的函數是給子類實例化的。
一個類沒有抽象方法,爲何定義爲抽象類?
不想被繼承,還不想被實例化。
抽象關鍵字abstract不能夠和哪些關鍵字共存?
接口(interface)
接口是抽象方法和常量值的集合。從本質上講,接口是一種特殊的抽象類,這種抽象類只包含常量和方法的定義,而沒有變量和方法的實現。
格式:interface 接口名{}
接口的出現將」多繼承「經過另外一種形式體現出來,即」多實現「。
實現(implements)
格式:class 類名 implements 接口名 {}
特色:
接口的成員特色:
接口中的成員修飾符是固定的!
繼承與實現的區別:
抽象類和接口的區別:
成員變量
成員方法
構造方法
-抽象類有構造方法
-接口沒有構造方法
類與抽象類和接口的關係
接口的思想特色:
//運動員和教練的案例(下圖是思路分析)
/* 籃球運動員和教練 乒乓球運動員和教練 如今籃球運動員和教練要出國訪問,須要學習英語 請根據你所學的知識,分析出來哪些是類,哪些是抽象類,哪些是接口 */ interface SpeakEnglish { public abstract void speak(); } interface GoAboard{ public abstract void aboard(); } abstract class Person { private String name; private int age; public Person(){} public Person(String name,int age){ this.name = name; this.age = age; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } //吃飯 public abstract void eat(); //睡覺 public void sleep(){ System.out.println("Zzz..."); } } //運動員 abstract class Player extends Person { public abstract void study(); } //教練 abstract class Coach extends Person { public abstract void teach(); } //籃球運動員 class BasketballPlayer extends Player implements SpeakEnglish,GoAboard{ public void eat(){ System.out.println(getAge() + "歲的" + getName() + "吃雞腿"); } public void study(){ System.out.println(getAge() + "歲的" + getName() + "學扣籃"); } public void speak(){ System.out.println(getAge() + "歲的" + getName() + " Say Hello World"); } public void aboard(){ System.out.println(getAge() + "歲的" + getName() + " Go Aboard"); } } //乒乓運動員 class PingPangPlayer extends Player{ public void eat(){ System.out.println(getAge() + "歲的" + getName() + "吃雞蛋"); } public void study(){ System.out.println(getAge() + "歲的" + getName() + "學扣球"); } } //籃球教練 class BasketballCoach extends Coach implements SpeakEnglish { public void eat(){ System.out.println(getAge() + "歲的" + getName() + "啃雞爪"); } public void teach(){ System.out.println(getAge() + "歲的" + getName() + "教扣籃"); } public void speak(){ System.out.println(getAge() + "歲的" + getName() + " Say Hello Java"); } public void aboard(){ System.out.println(getAge() + "歲的" + getName() + " Go Aboard"); } } //乒乓球教練 class PingPangCoach extends Coach{ public void eat(){ System.out.println(getAge() + "歲的" + getName() + "吃雞蛋皮"); } public void teach(){ System.out.println(getAge() + "歲的" + getName() + "教扣球"); } } class PlayerAndCoach { public static void main(String[] args) { //籃球運動員 BasketballPlayer bp = new BasketballPlayer(); bp.setName("郭艾倫"); bp.setAge(33); bp.eat(); bp.sleep(); bp.study(); bp.speak(); bp.aboard(); System.out.println("***********************"); //籃球教練 BasketballCoach bc = new BasketballCoach(); bc.setName("波波維奇"); bc.setAge(65); bc.eat(); bc.sleep(); bc.teach(); bc.speak(); bc.aboard(); System.out.println("***********************"); //多態 Person p = new BasketballPlayer(); p.setName("Kobe Bryant"); p.setAge(33); p.eat(); p.sleep(); //p.study(); //p.speak(); BasketballPlayer bp2 = (BasketballPlayer)p; bp2.study(); bp2.speak(); bp2.aboard(); System.out.println("***********************"); } }
將一個類定義在另外一個類裏面,裏面的那個類就稱爲內部類。內部類的出現,再次打破了Java單繼承的侷限性。
訪問特色:
共性:
成員內部類
在外部類中有成員變量和成員方法,成員內部類就是把整個一個類做爲了外部類的成員;
成員內部類是定義在類中方法外的類;
建立對象的格式爲:外部類名.內部類名 對象名 = 外部類對象.內部類對象;
成員內部類之因此能夠直接訪問外部類的成員,那是由於內部類中都持有一個外部類對象的引用:外部類名.this;
成員內部類能夠用的修飾符有final,abstract,public,private,protected,static.
靜態內部類
靜態內部類就是成員內部類加上靜態修飾符static,定義在類中方法外。
在外部類中訪問靜態內部類有兩種場景:
局部內部類
局部內部類是定義在方法中的類。
能夠用於方法內部類的修飾符有final,abstract;
靜態方法中的方法內部類只能訪問外部的靜態成員。
匿名內部類
匿名內部類是內部類的簡化寫法,是創建一個帶內容的外部類或者接口的子類匿名對象。
前提:
內部類能夠繼承或實現一個外部類或者接口。
格式:
new 外部類名或者接口名(){重寫方法};
一般在方法的形式參數是接口或者抽象類,而且該接口中的方法不超過三個時,能夠將匿名內部類做爲參數傳遞。
類 | 成員變量 | 成員方法 | 構造方法 | |
---|---|---|---|---|
private | Y | Y | Y | |
默認 | Y | Y | Y | Y |
protected | Y | Y | Y | |
public | Y | Y | Y | Y |
abstract | Y | Y | ||
static | Y | Y | Y | |
final | Y | Y | Y |
注意,常見規則以下:
本類 | 同包(無關類或子類) | 不一樣包(子類) | 不一樣包(無關類) | |
---|---|---|---|---|
private | Y | |||
默認 | Y | Y | ||
protected | Y | Y | Y | |
public | Y | Y | Y | Y |
推薦: