面对对象(接口)
?一.? 接口(interface),是一種引用數(shù)據(jù)類型。
? interface 差不多= = abstract class
  1)接口是has a (繼承是is a):“像”我中的一種,是繼承體系之外的,用于功能擴(kuò)展!想擴(kuò)展就實(shí)現(xiàn),不想就不用實(shí)現(xiàn)。
  2)接口中只能聲明抽象方法和常量且聲明格式都是固定的,定義的所有變量都是static final類型的,只不過可以省略。
注意:接口中聲明常量和抽象方法的格式是固定的
?3)接口中的方法都是公共抽象方法
1 public interface MyInterface { 2 public abstract void showInfo(); 3 void showInfo3(); 4 5 // 推薦寫法 6 public void showInfo2(); 7 }?
二.接口的多態(tài)現(xiàn)象
1)接口不能有構(gòu)造器,因?yàn)椴荒軐?shí)例化何以初始化,接口只能被“實(shí)現(xiàn)”。
2)具體類實(shí)現(xiàn)了一個(gè)接口,則必須實(shí)現(xiàn)全部的抽象方法,若沒有全部實(shí)現(xiàn),則該類為抽象類。所以說,接口約定了具體類的方法,約定了類的外部行為。
3)具體類可以同時(shí)實(shí)現(xiàn)多個(gè)接口,就是多繼承現(xiàn)象。
4)多重繼承:實(shí)現(xiàn)類Student具備了駕駛能力,實(shí)現(xiàn)類Teacher也具備了駕駛能力,原因是都實(shí)現(xiàn)了Drive,兩個(gè)實(shí)現(xiàn)類的能力得到了增強(qiáng)。
5)接口用implements 表實(shí)現(xiàn),實(shí)際是繼承關(guān)系,可有多個(gè)接口(實(shí)現(xiàn)),繼承用extends 只能有一個(gè)繼承關(guān)系。
6)一個(gè)類既可以繼承的同時(shí),又“實(shí)現(xiàn)”接口:class A extends B implements C , D;
7)類與類之間是繼承關(guān)系,類與接口之間是實(shí)現(xiàn)關(guān)系,接口與接口之間是繼承關(guān)系,且只有接口之間可以多繼承,即:interface A{},interface B{},interface C extends A , B 但接口多繼承時(shí)要注意,要避免A、B接口中有方法名相同、參數(shù)列表相同,但返回值類 型不相同的情況,因?yàn)楸痪唧w類實(shí)現(xiàn)時(shí),不確定調(diào)用哪個(gè)方法。
三.?抽象類和接口的異同比較
?1.abstract class和interface有什么區(qū)別?
  1)從編程的角度:abstract class在java語言中表示的是一種繼承關(guān)系,一個(gè)類只能使用一次繼承關(guān)系。而一個(gè)類可以實(shí)現(xiàn)多個(gè)interface。
  2)從問題域角度:abstract class在Java語言中體現(xiàn)了一種繼承關(guān)系,要想使得繼承關(guān)系合理,父類和派生類之間必須存在"is a"關(guān)系,即父類和派生類在概念本質(zhì)上應(yīng)該是相同的。對(duì)于interface 來說則不然,并不要求interface的實(shí)現(xiàn)者和interface定義在概念本質(zhì)上是一致的,僅僅是實(shí)現(xiàn)了interface定義的約定(協(xié)議)而已。
2.抽象類和接口的異同
1)抽象類和接口都是引用數(shù)據(jù)類型,他們都不能創(chuàng)建對(duì)象,都可以定義抽象方法,都可以實(shí)現(xiàn)多態(tài);但是抽象類可以定義非抽象方法,而接口中定義的都是抽象方法。
2)抽象類和接口都具有傳遞性。抽象類是單根性(單繼承),而接口是多繼承;重要的是:抽象類和子類解決的是模塊內(nèi)的問題(代碼重用,重寫,多態(tài))而接口解決的是模塊間的問題。
四.內(nèi)部類
?在類內(nèi)部定義的類為成員內(nèi)部類,在方法里定義的類為局部內(nèi)部類,被static修飾的為靜態(tài)內(nèi)部類。一個(gè)類中可有多個(gè)內(nèi)部類。
1)內(nèi)部類主要用于,封裝一個(gè)類的聲明在類的內(nèi)部,減少類的暴露。
2)內(nèi)部類的實(shí)例化:實(shí)例化時(shí)不需要出寫對(duì)象,非要寫的話為:new 外部類名.內(nèi)部類名();而不是外部類名.new 內(nèi)部類名()。
?
當(dāng)內(nèi)部類定義在外部類的成員位置上,而且非私有,則在外部其他類中可以直接建立內(nèi)部類對(duì)象。格式:外部類名.內(nèi)部類名變量名= 外部類對(duì)象.內(nèi)部類對(duì)象;
Outer.Inner in = new Outer().new Inner();
?
1 public class Test01 { 2 public static void main(String[] args) { 3 4 // 【1】創(chuàng)建外部類對(duì)象 5 Outer outer = new Outer(); 6 // 【2】創(chuàng)建內(nèi)部類對(duì)象 7 Inner inner = outer.new Inner(); 8 inner.showInfo(); 9 } 10 }3)內(nèi)部類中可以訪問外部類的私有變量
1 public class Outer { 2 3 private String name = "Outer"; 4 5 class Inner{ 6 7 public void showInfo() { 8 System.out.println(name); 9 } 10 11 } 12 }特殊情況:重名,外部類和內(nèi)部類的變量同名
1 public class Outer { 2 3 private String name = "Outer"; 4 5 class Inner{ 6 7 private String name = "Inner"; 8 9 public void showInfo() { 10 // String name = "show info"; 11 12 // 訪問外部類的私有成員 13 System.out.println(this.name); 14 15 // 訪問外部類的私有成員 16 System.out.println(Outer.this.name); 17 18 } 19 } 20 }?
注意事項(xiàng):
  當(dāng)內(nèi)部類中定義了靜態(tài)成員,該內(nèi)部類必須是static的。
  當(dāng)外部類中的靜態(tài)方法訪問內(nèi)部類時(shí),內(nèi)部類也必須是static的。
4)內(nèi)部類想調(diào)用外部類的成員,需要使用:外部類名.this.成員,即Outter.this表示外部類的對(duì)象。如果寫this.成員= =成員,調(diào)用的還是內(nèi)部類的成員(屬性或方法)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/abcdjava/p/10770425.html
總結(jié)
 
                            
                        - 上一篇: 文华财经函数大全
- 下一篇: 荣耀Magic5 Pro发布:鹰眼抓拍
