您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java的態(tài)和抽象類是什么”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java的態(tài)和抽象類是什么”這篇文章吧。
我們知道Java的三大特性:封裝、繼承、多態(tài)。前兩個(gè)之前在Java入門(六)已經(jīng)講到,現(xiàn)在來講多態(tài)這個(gè)特性。
什么是多態(tài)?
多態(tài)顧名思義即為多種形態(tài)的意思
Java中多態(tài)的含義:
1.發(fā)送消息給某個(gè)對象,讓這個(gè)對象自行決定采用哪種行為響應(yīng)這個(gè)消息
2.子類對象的引用賦值給父類引用變量來實(shí)現(xiàn)動(dòng)態(tài)的方法調(diào)用
Java中形成多態(tài)的前提:
1.繼承
2.父類方法的重寫
3.向上轉(zhuǎn)型
我對多態(tài)的解釋:
比如我們,是人,也是學(xué)生,也是年輕人,我可以用人的身份去做事情,也可以用學(xué)生的身份去買學(xué)生票,也可以用年輕人的身份做公益,這樣我們可以通過不同的形態(tài)去做不同的事情。這樣是不是更好理解一點(diǎn)?
注意:
多態(tài)前提條件:必須有子父類關(guān)系。
在使用多態(tài)后的父類引用變量調(diào)用方法時(shí),會調(diào)用子類重寫后的方法。
多態(tài)的定義與使用格式:
父類類型 變量名=new 子類類型();
多態(tài)中成員的特點(diǎn):
多態(tài)成員變量:編譯運(yùn)行看左邊
多態(tài)成員方法:編譯看左邊,運(yùn)行看右邊
多態(tài)的轉(zhuǎn)型:
多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型和向下轉(zhuǎn)型兩種
向上轉(zhuǎn)型:多態(tài)本身就是向上轉(zhuǎn)型過的過程
使用格式:父類類型 變量名=new 子類類型();
適用場景:當(dāng)不需要面對子類類型時(shí),通過提高擴(kuò)展性,或者使用父類的功能就能完成相應(yīng)的操作。
向下轉(zhuǎn)型:一個(gè)已經(jīng)向上轉(zhuǎn)型的子類對象可以使用強(qiáng)制類型轉(zhuǎn)換的格式,將父類引用類型轉(zhuǎn)為子類引用各類型
使用格式:子類類型 變量名=(子類類型) 父類類型的變量;
適用場景:當(dāng)要使用子類特有功能時(shí)。
代碼解釋:
public class Person { //人類,作為父類使用 public void speak(){ System.out.println("我們都是一個(gè)人"); } } public class Student extends Person{ //繼承父類,相當(dāng)于我們是學(xué)生,有人的方法 @Override public void speak(){ System.out.println("我是人類中的學(xué)生"); } } public class Child extends Person{ //繼承父類,相當(dāng)于我們是孩子,有孩子的行為 @Override public void speak(){ System.out.println("我是人類中的孩子"); } } //測試類 public class TestMain { public static void main(String[] args) { //父類類型 變量名=new 子類類型(); Person p = new Student(); //子類對象的引用賦值給父類 p.speak(); //多態(tài) 相當(dāng)于這里使用的是Student的方法。輸出我是人類中的學(xué)生 //我作為人,我用學(xué)生的身份,說出:我是人類中的學(xué)生 Person p = new Child(); p.speak(); //輸出:我是人類中的孩子 //我作為人,用孩子的身份,說出我是人類中的孩子 } } //這段代碼,我們用到了 繼承,重寫,向上轉(zhuǎn)型,因?yàn)槎鄳B(tài)本來就是向上轉(zhuǎn)型的過程
多態(tài)的作用:介紹完多態(tài),講講多態(tài)有什么用呢?為什么多態(tài)可以作為Java的三大特性??隙ㄊ怯性虻模?/p>
提高代碼的可重用性
降低模塊之間的耦合度
這里給大家介紹一下什么是多態(tài)機(jī)制?Java語言是如何實(shí)現(xiàn)多態(tài)的?(可能有點(diǎn)難以理解,本人對于該內(nèi)容也沒用理解充分,但這也是面試會考的題)
所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒 底會指向哪個(gè)類的實(shí)例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的 方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實(shí)現(xiàn)上,從而 導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí) 所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。 多態(tài)分為編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。其中編輯時(shí)多態(tài)是靜態(tài)的,主要是指方法的 重載,它是根據(jù)參數(shù)列表的不同來區(qū)分不同的函數(shù),通過編輯之后會變成兩個(gè)不 同的函數(shù),在運(yùn)行時(shí)談不上多態(tài)。而運(yùn)行時(shí)多態(tài)是動(dòng)態(tài)的,它是通過動(dòng)態(tài)綁定來 實(shí)現(xiàn)的,也就是我們所說的多態(tài)性。
對于多態(tài)的理解,還可以參考一段代碼:
class People{ //父類 public void eat(){ System.out.println("我們會吃飯"); } } class Student extends People{ //繼承父類 @Override public void eat(){ System.out.println("我會吃肉"); } public void study(){ System.out.println("我們要好好學(xué)習(xí)"); } } class Teacher extends People{ //繼承父類 @Override public void eat(){ System.out.println("老師會吃蔬菜"); } public void teach(){ System.out.println("老師要認(rèn)真上課"); } } //測試類: public class TestMain { public static void main(String[] args) { People p=new Stu(); //子類對象的引用賦值給父類 p.eat(); //輸出: 我會吃肉 } }
什么是抽象類?
普通類是一個(gè)完善的功能類,可以直接產(chǎn)生實(shí)例化對象,并且在普通類中可以包含有構(gòu)造方法、普通方法、static方法、常量和變量等內(nèi)容。而抽象類是指在普通類的結(jié)構(gòu)里面增加抽象方法的組成部分。
抽象方法:
在所有的普通方法上面都會有一個(gè)“{}”,這個(gè)表示方法體,有方法體的方法一定可以被對象直接使用。而抽象方法,是指沒有方法體的方法,同時(shí)抽象方法還必須使用關(guān)鍵字abstract做修飾。也就是說,抽象類里面的抽象方法,可以不寫,在被繼承后,再重寫。
抽象類聲明關(guān)鍵字: abstracat
定義一個(gè)抽象類:
public abstract class studnet{//定義一個(gè)抽象類 public void study(){ //普通方法 System.out.println("我會學(xué)習(xí)"); } public abstract void eat(); //抽象方法,沒有方法體,有abstract關(guān)鍵字做修飾 } //注意: 有抽象方法,這個(gè)類必須是抽象的?。?!
舉例解釋:形狀類Shape需要提供用于計(jì)算面積和周長的方法,但是形狀本身沒有被確定,那么計(jì)算周長和面積的方法就無法確定,此時(shí)我們就需要使用抽象類和抽象方法。
由于Shape類計(jì)算周長和面積的方法無法確定,那么就可以將這樣的方法聲明為抽象的,以便在具體的子類中進(jìn)行實(shí)現(xiàn)。
//定義一個(gè)shape類,但是沒有具體的形狀,所以我們定義成抽象類 public abstract class Shape { private int a; public abstract void area(){} //求面積的方法 public abstract void perimeter(); //求周長的方法 public Shape() { //無參構(gòu)造 } public Shape(int a) { this.a = a; } }
//計(jì)算圓形面積的子類 public abstract class shape { //有抽象方法的類,則一定是抽象類,需要關(guān)鍵字abstract修飾 private int a; public abstract void area(); //求面積的方法,沒有方法體的方法,需要關(guān)鍵字abstract修飾 public abstract void perimeter(); //求周長的方法 } //創(chuàng)建計(jì)算圓面積和周長的子類,并繼承抽象類shape,并重寫shape內(nèi)的方法 public class Circle extends shape{ public static double pi = 3.14; private double r; //半徑 @Override public void area() { System.out.println("圓的面積:"+Circle.pi*this.r*this.r); } @Override public void perimeter() { System.out.println("圓的周長為:"+2*Circle.pi*this.r); } public Circle() { } public Circle(double r) { // this.r = r; } } //測試類: public class TestMain { public static void main(String[] args) { Circle c = new Circle(5); //傳入半徑為:5 c.area(); c.perimeter(); } } //輸出結(jié)果: 圓的面積:78.5 // 圓的周長為:31.400000000000002
抽象方法和抽象類的注意事項(xiàng):
抽象類中是可以有構(gòu)造函數(shù)的,并且構(gòu)造函數(shù)的寫法和其它類沒有區(qū)別,只不過它真正跑起來是因?yàn)樽宇悩?gòu)造函數(shù)的super調(diào)用,畢竟我們沒辦法new一個(gè)抽象類對象出來,只能把抽象類的構(gòu)造函數(shù)交給子類的構(gòu)造函數(shù)去使用。
抽象類中不一定包含抽象方法,但是有抽象方法的類一定是抽象類。
抽象類的子類,必須重寫父類中所有的抽象方法,如果有一個(gè)抽象方法沒有重寫,都會出現(xiàn)編譯錯(cuò)誤不給過,這時(shí)也可以把子類也聲明為抽象類,報(bào)錯(cuò)就會消失。
簡潔總結(jié):
抽象方法:沒有方法體的方法,需要關(guān)鍵字abstract修飾
有抽象方法的類,則一定是抽象類,需要關(guān)鍵字abstract修飾
抽象方法不能使用private和static修飾
抽象類,不一定有抽象方法的類
抽象類,不一定有抽象方法的類
抽象類可以有構(gòu)造函數(shù)
普通類和抽象類有哪些區(qū)別?
普通類不能包含抽象方法,抽象類可以包含抽象方法
抽象類不能直接實(shí)例化,普通類可以直接實(shí)例化。
以上是“Java的態(tài)和抽象類是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。