final
繼承的出現(xiàn)提高了代碼的復(fù)用性留晚,并方便開發(fā)。但隨之也有問題告嘲,有些類在描述完之后错维,不想被繼承,或者有些類中的部分方法功能是固定的橄唬,不想讓子類重寫赋焕。可是當(dāng)子類繼承了這些特殊類之后仰楚,就可以對其中的方法進(jìn)行重寫隆判,那怎么解決呢?
要解決上述的這些問題僧界,需要使用到一個關(guān)鍵字final侨嘀,final的意思為最終,不可變捂襟。final是個修飾符咬腕,它可以用來修飾類,類的成員葬荷,以及局部變量涨共。
- final修飾類不可以被繼承,但是可以繼承其他類宠漩。
class Yy {}
final class Fu extends Yy{} //可以繼承Yy類
class Zi extends Fu{} //不能繼承Fu類
- final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法举反,子類覆蓋后可以加final。
class Fu {
// final修飾的方法扒吁,不可以被覆蓋火鼻,但可以繼承使用
public final void method1(){}
public void method2(){}
}
class Zi extends Fu {
//重寫method2方法
public final void method2(){}
}
final修飾的變量稱為常量,這些變量只能賦值一次雕崩。
final int i = 20;
i = 30; //賦值報錯魁索,final修飾的變量只能賦值一次引用類型的變量值為對象地址值,地址值不能更改晨逝,但是地址內(nèi)的對象屬性值可以修改。
final Person p = new Person();
Person p2 = new Person();
p = p2; //final修飾的變量p懦铺,所記錄的地址值不能改變
p.name = "小明";//可以更改p對象中name屬性值
p不能為別的對象捉貌,而p對象中的name或age屬性值可更改。
- 修飾成員變量,需要在創(chuàng)建對象前賦值趁窃,否則報錯牧挣。(當(dāng)沒有顯式賦值時,多個構(gòu)造方法的均需要為其賦值醒陆。)
class Demo {
//直接賦值
final int m = 100;
//final修飾的成員變量瀑构,需要在創(chuàng)建對象前賦值,否則報錯刨摩。
final int n;
public Demo(){
//可以在創(chuàng)建對象時所調(diào)用的構(gòu)造方法中寺晌,為變量n賦值
n = 2016;
}
}
static
當(dāng)在定義類的時候,類中都會有相應(yīng)的屬性和方法澡刹。而屬性和方法都是通過創(chuàng)建本類對象調(diào)用的呻征。當(dāng)在調(diào)用對象的某個方法時,這個方法沒有訪問到對象的特有數(shù)據(jù)時罢浇,方法創(chuàng)建這個對象有些多余陆赋。可是不創(chuàng)建對象嚷闭,方法又調(diào)用不了攒岛,這時就會想,那么我們能不能不創(chuàng)建對象胞锰,就可以調(diào)用方法呢灾锯?
可以的,我們可以通過static關(guān)鍵字來實(shí)現(xiàn)胜蛉。static它是靜態(tài)修飾符挠进,一般用來修飾類中的成員。
static 特點(diǎn)
- 被static修飾的成員變量屬于類誊册,不屬于這個類的某個對象领突。(也就是說,多個對象在訪問或修改static修飾的成員變量時案怯,其中一個對象將static成員變量值進(jìn)行了修改君旦,其他對象中的static成員變量值跟著改變,即多個對象共享同一個static成員變量)
代碼演示:
class Demo {
public static int num = 100;
}
class Test {
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.num = 200;
System.out.println(d1.num); //結(jié)果為200
System.out.println(d2.num); //結(jié)果為200
}
}
- 被static修飾的成員可以并且建議通過類名直接訪問嘲碱。
訪問靜態(tài)成員的格式:
類名.靜態(tài)成員變量名
類名.靜態(tài)成員方法名(參數(shù))
對象名.靜態(tài)成員變量名 ------不建議使用該方式金砍,會出現(xiàn)警告
對象名.靜態(tài)成員方法名(參數(shù)) ------不建議使用該方式,會出現(xiàn)警告
代碼演示:
class Demo {
//靜態(tài)成員變量
public static int num = 100;
//靜態(tài)方法
public static void method(){
System.out.println("靜態(tài)方法");
}
}
class Test {
public static void main(String[] args) {
System.out.println(Demo.num);
Demo.method();
}
}
static注意事項(xiàng)
- 靜態(tài)內(nèi)容是優(yōu)先于對象存在麦锯,只能訪問靜態(tài)恕稠,不能使用this/super。靜態(tài)修飾的內(nèi)容存于靜態(tài)區(qū)扶欣。
class Demo {
//成員變量
public int num = 100;
//靜態(tài)方法
public static void method(){
//this.num; 不能使用this/super鹅巍。
System.out.println(this.num);
}
}
- 同一個類中千扶,靜態(tài)成員只能訪問靜態(tài)成員
class Demo {
//成員變量
public int num = 100;
//靜態(tài)成員變量
public static int count = 200;
//靜態(tài)方法
public static void method(){
//System.out.println(num); 靜態(tài)方法中,只能訪問靜態(tài)成員變量或靜態(tài)成員方法
System.out.println(count);
}
}
- main方法為靜態(tài)方法僅僅為程序執(zhí)行入口骆捧,它不屬于任何一個對象澎羞,可以定義在任意類中。
定義靜態(tài)常量
開發(fā)中敛苇,我們想在類中定義一個靜態(tài)常量妆绞,通常使用public static final修飾的變量來完成定義。此時變量名用全部大寫枫攀,多個單詞使用下劃線連接括饶。
定義格式:
public static final 數(shù)據(jù)類型 變量名 = 值;
如下演示:
class Company {
public static final String YUTOU = "芋頭";
public static void method(){
System.out.println("一個靜態(tài)方法");
}
}
當(dāng)我們想使用類的靜態(tài)成員時,不需要創(chuàng)建對象脓豪,直接使用類名來訪問即可巷帝。
System.out.println(Company.YUTOU); //打印芋頭
Company.method(); // 調(diào)用一個靜態(tài)方法
- 注意:
接口中的每個成員變量都默認(rèn)使用public static final修飾。
所有接口中的成員變量已是靜態(tài)常量扫夜,由于接口沒有構(gòu)造方法楞泼,所以必須顯示賦值◇源常可以直接用接口名訪問堕阔。
interface Inter {
public static final int COUNT = 100;
}
訪問接口中的靜態(tài)變量
Inter.COUNT