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-面向對象程式設計-包