1. 程式人生 > >JavaSE--抽象類、內部類、接口

JavaSE--抽象類、內部類、接口

-- ann 固定 com init 外部 普通 new t eve

一、抽象類

  當事物不能具體描述時可將事物抽象化,只對其應有的行為進行簡單的描述而不進行深度具體的描述,這樣就產生了抽象類,使用abstract關鍵字對類進行修飾內部方法也是用abstract進行描述。

1.特點

  抽象方法只能定義在抽象類中且不能有方法體,抽象類不能被實例化不能使用new關鍵字創建對象,它的子類覆蓋所有的抽象方法後子類才能實例化,如果子類繼承了抽象類卻沒有覆蓋抽象方法那麽子類也是抽象類,抽象類中可以存在非抽象方法即已經實現的方法可供子類覆蓋或使用。

2.誤區

  抽象類中存在構造函數,僅為子類的對象來進行實例化;抽象類一定是父類需要子類繼承抽象類並覆蓋抽象方法;抽象類可以不定義抽象方法,僅僅是讓該類不能實例化;abstract與final、private、static不能共存;

抽象類可以不包含抽象方法,包含抽象方法的類一定是抽象類,抽象類中的屬性定義與一般類相同。

、接口(interface)

  接口主要就是方法定義和常量值的集合,接口是一種特殊的抽象類,這種抽象類裏面的方法全部都是抽象方法。對於一個接口來說他沒有構造器,所以他的變量只能定義成靜態常量,這樣就不要使用構造器對變量進行初始化了。

1.特點

  • 接口不可以被實例化,子類需要覆蓋所有的抽象方法才能實例化,否則該子類還是個抽象類,接口是用來被實現的。
  • 類不能多繼承的原因是當兩個父類中出現相同的方法聲明與實現時子類調用該方法會產生不確定性,這是由方法主體導致的,而接口可以多繼承的原因是因為接口中的方法只有聲明沒有被實現沒有方法主體,當兩個父接口被實現時子類覆蓋父接口同名方法時會默認認為那是一種行為方法的定義所以只會實現一次同名方法。繼承的本質是獲取體系的基本功能,想要擴展功能就需要通過實現不同的接口來實現。
  • 接口與接口之間具備繼承關系不具備實現關系,並且接口可以多繼承(因為只有方法聲明沒有方法主體所以不會發生沖突),接口是沒有構造方法的(原因在於它的成員屬性都是常量)。
  • 接口是暴露出來的規則,需要使用者去實現這一規範。

2.接口與類區別

  • 接口中常見成員有兩種:全局常量、抽象方法;而且都有固定修飾符共性:成員都是使用public修飾的,編譯時默認檢查自動提供public;
  • 成員定義方法:public static final int MAX = 5;
  • 方法定義:public abstract void fun();

、內部類

  在類的內部定義一個或多個該類所屬的類叫做內部類,內部類相當於外部類的成員,可以隨意訪問外部類中的成員,但外部類要訪問內部類時需要創建內部類的實例來訪問,在main方法中內部類是需要前綴的即外部類名+“.”+內部類名即為內部類的引用類型(Text.Inner ti = new Text().new Inner();)內部類的重要作用在於為多重繼承提供支持。

  當一個類中有一個內部類時編譯完成時會產生兩個class文件其中包含內部類的class文件命名規則為:外部類名@內部類名,使用外部類名@1內部類稱為局部內部類,因為該類處於局部方法當中,因為內部類會被原則上的與外部類分離所用創建外部類對象時內部類是不會加載的;

  內部類不允許訪問所在局部的局部變量因為聲明周期不一樣,局部內部類只能訪問被final修飾的局部變量;內部類需要訪問與外部類同名的成員變量時需要使用類名加this確定具體對象(Inner.this;Outer.this)。

1.匿名內部類

  匿名內部類是一個簡化的內部類,其中內部類需要繼承或實現外部類或者接口,格式:new 父類名或者接口名(){子類內容}.子類成員;匿名內部類常出現的場所是方法體或屬性初始化處。

2.非靜態內部類

  非靜態內部類沒有無參構造器,它的默認構造器需要一個外部類實例參數,這也符合非靜態內部類的規則:非靜態內部類必須寄生在外部類的實例中,沒有外部類對象就不存在非靜態內部類對象。當在外部類內部顯示的使用new Inner();來創建內部類時虛擬機底層也會將當前this作為實參傳入構造器!顯示的在內部類中聲明無參構造器在編譯時也將生成對應的有參構造器並隱式的調用它,顯示定義一個帶String參數的有參構造器編譯時還將自動攜帶一個外部類參數!由此可見非靜態內部類對外部類的依賴有多高!

  非靜態內部類處於一個非靜態的上下文環境,因此非靜態內部類不允許擁有靜態成員,只允許定義靜態成員常量(static final)。

3.靜態內部類

  靜態內部類,定義在類中,任何方法外,用static定義;靜態內部類只能訪問外部類的靜態成員。生成一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:Outer.Inner in=new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成為了一個頂級類,當然它還可以定義成私有靜態內部類。

4.靜態內部類與非靜態內部類的區別

  • 普通內部類可以訪問其外部類的各種類型成員,但是靜態內部類只能訪問靜態成員
  • 普通內部類裏面不能定義各種靜態的成員(包括靜態變量、靜態方法、靜態代碼塊和靜態內部類),而靜態內部類中則可以;

①靜態變量和靜態方法會出現這個語法錯誤(static methods can only be declared in a static or top level type)意思就是static方法只能在靜態或者頂級類型(頂級類型應該就是外部類中)中聲明,當然static變量和static內部類也是一樣的道理。原因在靜態變量和靜態方法都只需要通過類名就能訪問,不必通過任何實例化對象;而普通內部類的初始化要利用外部類的實例化對象,這明顯違背了static的設計初衷。

②靜態代碼塊會出現這個語法錯誤(Cannot define static initializer in inner type Outer.Inner)意思是不能在內部類中定義靜態的初始化程序。原因跟以上的差不多,static聲明的成員只能為類所共有,而不能僅屬於一個實例化對象,通俗點來說就是不管有多少層的引用,都只能是類來引用而不能是對象。

JavaSE--抽象類、內部類、接口