天天看點

接口和包--Java學習筆記

interface定義:沒有字段的抽象類

如上代碼,方法沒有具體化,在需要調用的類裡面通過覆寫來實作具體功能,多個類之間重新覆寫的功能互相不影響。繼承接口時,一定要覆寫接口裡的所有方法

普通類繼承中,隻能繼承一個類,而接口可實作多繼承

一個interface可以繼承自另一個interface

abstract 定義執行個體字段 定義抽象方法 定義非抽象方法 but,隻能extends一個class interface 可以implements多個interface 定義default方法 but,不能定義執行個體字段

當接口新增一個方法時,會涉及到修改全部子類,如果新增的是default方法,子類就不必全部修改,隻需要在需要覆寫的地方去覆寫新增方法

default和抽象類的普通方法是不太一樣的,interface沒有字段,default無法通路字段,而抽象類的普通方法可以通路執行個體字段。不過在interface中,default可以修飾具體方法

靜态方法屬于class不屬于執行個體,可以直接通過類名來調用

盡管interface是純抽象類,但它可以有靜态字段,靜态字段必須是final類型

實際上,因為interface的字段隻能是​<code>​public static final​</code>​類型,是以我們可以把int前面的修飾符去掉

例如,在同一檔案夾下,a寫了一個person類,b也寫了一個person類,c想用a和b的person類,這時候引入包(package)的概念

aa.java
bb.java

包可以是多層結構,用​<code>​.​</code>​隔開,例如​<code>​java.util​</code>​

:::tip

包沒有父子關系,​<code>​java.util​</code>​和​<code>​java.util.zip​</code>​是不同的包,兩者沒有繼承關系

:::

例如,如果想要定義包hello,則需要建立一個檔案夾并命名為hello,檔案夾下存放有hello包的Java檔案

​<code>​hello\person.java​</code>​
​<code>​hello\main.java​</code>​

在一個class中,我們會引用其他的class,例如,Jay的​<code>​person.jay​</code>​類,如果要引用jjlin的​<code>​hello.jjlin​</code>​類,需要引入這個包

​<code>​hello\jjlin.java​</code>​
​<code>​person\jay.java​</code>​

除了引入包下的具體類,也可以使用*,把包下的所有class都導入進來(不辨認子包的class)

此方法可以導入一個類的靜态字段和靜态方法,此文法比較少用

Java編譯器最終編譯出的​<code>​.class​</code>​檔案隻是用完整類名,是以,在代碼中,當編譯器遇到一個class名稱時:

如果是完整類名,就直接根據完整類名來查找這個class

如果是簡單類名,依次按照下面的順序依次查找

查找目前package是否存在這個class

查找import包是否含有這個class

查找​<code>​java.lang​</code>​包是否含有這個class

如果按照上面規則還無法确定類名,則編譯報錯

下面是一個例子

是以在編寫class時,編譯器會自動幫我們做兩個import動作

預設自動import目前package的其他class

預設​<code>​import java.lang.*​</code>​

自動導入的是​<code>​java.lang​</code>​的包,但類似​<code>​java.lang.reflect​</code>​這些包還需要手動導入

為避免名字沖突,我們需要确定唯一的包名,推薦使用倒置的域名來確定唯一性

​<code>​org.apache​</code>​,本質上是​<code>​/org/apache/​</code>​路徑下的class,下同

​<code>​org.apache.commons.log​</code>​

​<code>​com.jayden.sample​</code>​

子包就可以根據功能自行命名

注意不要和​<code>​java.lang​</code>​的包的類重名

​<code>​String​</code>​

​<code>​System​</code>​

​<code>​Runtime​</code>​

...

也不要和jdk常用的類重名

​<code>​java.util.List​</code>​

​<code>​java.text.Format​</code>​

​<code>​java.math.BigInteger​</code>​

​​參考連結-廖雪峰-Java-面向對象程式設計-接口​​

​​參考連結-廖雪峰-Java-面向對象程式設計-包​​