包
如果所有類都放一起開發(fā)邮绿,方便易記的類名很快用完渠旁,也很容易出現(xiàn)協(xié)作時(shí)命名沖突的問題。
包是Java提供的一種命名機(jī)制船逮,同時(shí)也是一種可見性控制機(jī)制顾腊。
包定義
Java使用文件系統(tǒng)目錄存儲(chǔ)包,包名必須和目錄路徑一致挖胃,包括大小寫
//定義包名杂靶,寫在Java源文件中的第一條語句
package pkg;
//層次化
package java.awt.img;
包查找與CLASSPATH
Java運(yùn)行時(shí)怎么找到這些包呢?
package MyPack;
3種方式:
1冠骄、Java程序運(yùn)行目錄下有MyPack目錄
2伪煤、CLASSPATH環(huán)境變量下有Mypack目錄
3、運(yùn)行程序時(shí)通過-classpath選項(xiàng)指明包路徑運(yùn)行
訪問保護(hù)
而對【非嵌套類】只有2種訪問級(jí)別
默認(rèn)級(jí)別:只能被同包中的其它類訪問凛辣。
公有級(jí)別:任何其它代碼都可訪問抱既;要求該類是文件中唯一一個(gè)公有類,切文件名要和類名完全一致扁誓。
導(dǎo)入包
import java.util.Data;
import java.io.*;//導(dǎo)入整個(gè)包
Java隱式地為所有代碼都導(dǎo)入了java.lang包防泵,相當(dāng)于每個(gè)源文件開頭都添加了
import java.lang.*;
import語句是可選的,也可以選擇使用完全限定名來使用類
class MyDate extends java.util.Date{
}
接口
使用interfere創(chuàng)建接口蝗敢,可用于指定類必須實(shí)現(xiàn)哪些功能
定義接口
interface Callback{
void callback(int param);
}
1捷泞、如果接口沒有修飾符,采用默認(rèn)訪問級(jí)別寿谴,只有聲明接口的包中的其它成員才能訪問接口锁右。
2、如果接口聲明為public讶泰,那么所有代碼都可以使用接口咏瑟,且接口是當(dāng)前文件中的唯一公有接口,文件名必須和接口同名痪署。
3码泞、JDK 8及以后的版本中,可以為接口創(chuàng)建默認(rèn)實(shí)現(xiàn)狼犯。
4余寥、接口中可以聲明變量,隱式標(biāo)識(shí)為final和static悯森,所有實(shí)現(xiàn)接口的類都不能修改他們宋舷,還必須初始化他們。
5瓢姻、所有方法和變量都隱式聲明為public肥缔。
實(shí)現(xiàn)接口
class Client implements Callback{
public void callback(int p){
System.out.println(p);
}
}
1、實(shí)現(xiàn)接口方法時(shí),必須聲明為public
2续膳、使用接口調(diào)用方法改艇,是在運(yùn)行時(shí)動(dòng)態(tài)查詢到方法并執(zhí)行,和常規(guī)方法調(diào)用相比占用更多資源坟岔,對性能要求苛刻的代碼中謹(jǐn)慎使用谒兄。
class TestIface{
public static void main(String args[]){
//使用接口調(diào)用方法
Callback c = new Client();
//調(diào)用的方法是來自對象,而不是類型變量
c.callback(42);
}
}
部分實(shí)現(xiàn):
如果類實(shí)現(xiàn)一個(gè)接口社付,但是沒有實(shí)現(xiàn)所有接口方法承疲,那么必須講這個(gè)類聲明為abstract
abstract class Incomplete implements Callback{
void show(){
System.out.println("Good");
}
}
接口中的變量
創(chuàng)建一個(gè)包含變量的接口,實(shí)現(xiàn)這個(gè)接口的類相當(dāng)于把這些這些變量當(dāng)作常量導(dǎo)入到類的命名控件下鸥咖。
interface SharedConstants{
int NO = 0;
int YES = 1;
int NULL = 2;
}
這種用法有爭議燕鸽,僅作介紹
接口的繼承
接口可以繼承,實(shí)現(xiàn)一個(gè)子接口啼辣,必須實(shí)現(xiàn)這個(gè)接口的繼承鏈上所有接口的所有方法啊研。
默認(rèn)接口方法default
【JDK8】才出現(xiàn)
默認(rèn)方法也稱擴(kuò)展方法
可以為接口的方法提供默認(rèn)實(shí)現(xiàn)
動(dòng)機(jī):
1、當(dāng)接口需要增加一個(gè)方法鸥拧,那么實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)這個(gè)方法党远,導(dǎo)致增加方法會(huì)破壞原有代碼;
2富弦、提供可選方法沟娱。例如有一個(gè)接口有一個(gè)方法remove,有2個(gè)類都實(shí)現(xiàn)了這個(gè)接口腕柜,其中一個(gè)類希望他是不可刪除的济似,原來方法就需要寫一個(gè)remove的空實(shí)現(xiàn)。現(xiàn)在有了默認(rèn)方法盏缤,可以在接口默認(rèn)空實(shí)現(xiàn)砰蠢,或拋出異常,這樣類就不用去做空實(shí)現(xiàn)了蛾找。
public interface MyIF{
//使用default關(guān)鍵字
default String getString(){
return "Default";
}
}
優(yōu)點(diǎn):
1、優(yōu)雅地隨時(shí)間演進(jìn)接口
2赵誓、提供可選功能打毛,且類不必在不需要該功能時(shí)提供占位符實(shí)現(xiàn)。
不同接口的同名方法
一個(gè)類實(shí)現(xiàn)了2個(gè)接口俩功,2個(gè)接口都有默認(rèn)方法reset幻枉,那么使用方法的順序如下:
1、類有實(shí)現(xiàn)诡蜓,優(yōu)先類的實(shí)現(xiàn)
2熬甫、類沒有重寫實(shí)現(xiàn),則報(bào)錯(cuò)
如果是一個(gè)接口繼承另外一個(gè)接口蔓罚,且有仙童默認(rèn)方法椿肩,則繼承接口的版本更高優(yōu)先級(jí)
//顯式調(diào)用被繼承接口中的默認(rèn)實(shí)現(xiàn)
SuperInterface.super.reset();
9.6 在接口中使用靜態(tài)方法
【JDK 8】才出現(xiàn)
可以在接口中直接定義靜態(tài)方法瞻颂,然后直接調(diào)用
public interface MyIF{
static int getDefaultNumber(){
return 0;
}
}
//調(diào)用
int a = MyIF.getDefaultNumber();
注意:
1、實(shí)現(xiàn)接口的類或子接口不會(huì)集成接口中的靜態(tài)方法郑象。