第一篇:Java關(guān)鍵字final、static使用總結(jié)
Java關(guān)鍵字final、static使用總結(jié)
一、final
根據(jù)程序上下文環(huán)境,Java關(guān)鍵字final有“這是無法改變的”或者“終態(tài)的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出于兩種理解而需要阻止改變:設(shè)計(jì)或效率。
final類不能被繼承,沒有子類,final類中的方法默認(rèn)是final的。
final方法不能被子類的方法覆蓋,但可以被繼承。
final成員變量表示常量,只能被賦值一次,賦值后值不再改變。
final不能用于修飾構(gòu)造方法。
注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認(rèn)是final類型的。
1、final類
final類不能被繼承,因此final類的成員方法沒有機(jī)會(huì)被覆蓋,默認(rèn)都是final的。在設(shè)計(jì)類時(shí)候,如果這個(gè)類不需要有子類,類的實(shí)現(xiàn)細(xì)節(jié)不允許改變,并且確信這個(gè)類不會(huì)載被擴(kuò)展,那么就設(shè)計(jì)為final類。
2、final方法
如果一個(gè)類不允許其子類覆蓋某個(gè)方法,則可以把這個(gè)方法聲明為final方法。
使用final方法的原因有二:
第一、把方法鎖定,防止任何繼承類修改它的意義和實(shí)現(xiàn)。
第二、高效。編譯器在遇到調(diào)用final方法時(shí)候會(huì)轉(zhuǎn)入內(nèi)嵌機(jī)制,大大提高執(zhí)行效率。
3、final變量(常量)
用final修飾的成員變量表示常量,值一旦給定就無法改變!
final修飾的變量有三種:靜態(tài)變量、實(shí)例變量和局部變量,分別表示三種類型的常量。
從下面的例子中可以看出,一旦給final變量初值后,值就不能再改變了。
另外,final變量定義的時(shí)候,可以先聲明,而不給初值,這中變量也稱為final空白,無論什么情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關(guān)鍵字final的使用上提供了更大的靈活性,為此,一個(gè)類中的final數(shù)據(jù)成員就可以實(shí)現(xiàn)依對象而有所不同,卻有保持其恒定不變的特征。
4、final參數(shù)
當(dāng)函數(shù)參數(shù)為final類型時(shí),你可以讀取使用該參數(shù),但是無法改變該參數(shù)的值。
二、static
static表示“全局”或者“靜態(tài)”的意思,用來修飾成員變量和成員方法,也可以形成靜態(tài)static代碼塊,但是Java語言中沒有全局變量的概念。
被static修飾的成員變量和成員方法獨(dú)立于該類的任何對象。也就是說,它不依賴類特定的實(shí)例,被類的所有實(shí)例共享。只要這個(gè)類被加載,Java虛擬機(jī)就能根據(jù)類名在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)定找到他們。因此,static對象可以在它的任何對象創(chuàng)建之前訪問,無需引用任何對象。
用public修飾的static成員變量和成員方法本質(zhì)是全局變量和全局方法,當(dāng)聲明它類的對象時(shí),不生成static變量的副本,而是類的所有實(shí)例共享同一個(gè)static變量。
static變量前可以有private修飾,表示這個(gè)變量可以在類的靜態(tài)代碼塊中,或者類的其他靜態(tài)成員方法中使用(當(dāng)然也可以在非靜態(tài)成員方法中使用--廢話),但是不能在其他類中通過類名來直接引用,這一點(diǎn)很重要。實(shí)際上你需要搞明白,private是訪問權(quán)限限定,static表示不要實(shí)例化就可以使用,這樣就容易理解多了。static前面加上其它訪問權(quán)限關(guān)鍵字的效果也以此類推。
static修飾的成員變量和成員方法習(xí)慣上稱為靜態(tài)變量和靜態(tài)方法,可以直接通過類名來訪問,訪問語法為:
類名.靜態(tài)方法名(參數(shù)列表...)
類名.靜態(tài)變量名
用static修飾的代碼塊表示靜態(tài)代碼塊,當(dāng)Java虛擬機(jī)(JVM)加載類時(shí),就會(huì)執(zhí)行該代碼塊(用處非常大,呵呵)。
1、static變量
按照是否靜態(tài)的對類成員變量進(jìn)行分類可分兩種:一種是被static修飾的變量,叫靜態(tài)變量或類變量;另一種是沒有被static修飾的變量,叫實(shí)例變量。兩者的區(qū)別是:
對于靜態(tài)變量在內(nèi)存中只有一個(gè)拷貝(節(jié)省內(nèi)存),JVM只為靜態(tài)分配一次內(nèi)存,在加載類的過程中完成靜態(tài)變量的內(nèi)存分配,可用類名直接訪問(方便),當(dāng)然也可以通過對象來訪問(但是這是不推薦的)。
對于實(shí)例變量,沒創(chuàng)建一個(gè)實(shí)例,就會(huì)為實(shí)例變量分配一次內(nèi)存,實(shí)例變量可以在內(nèi)存中有多個(gè)拷貝,互不影響(靈活)。
2、靜態(tài)方法
靜態(tài)方法可以直接通過類名調(diào)用,任何的實(shí)例也都可以調(diào)用,因此靜態(tài)方法中不能用this和super關(guān)鍵字,不能直接訪問所屬類的實(shí)例變量和實(shí)例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態(tài)成員變量和成員方法。因?yàn)閷?shí)例成員與特定的對象關(guān)聯(lián)!這個(gè)需要去理解,想明白其中的道理,不是記憶!!
因?yàn)閟tatic方法獨(dú)立于任何實(shí)例,因此static方法必須被實(shí)現(xiàn),而不能是抽象的abstract。
3、static代碼塊
static代碼塊也叫靜態(tài)代碼塊,是在類中獨(dú)立于類成員的static語句塊,可以有多個(gè),位置可以隨便放,它不在任何的方法體內(nèi),JVM加載類時(shí)會(huì)執(zhí)行這些靜態(tài)的代碼塊,如果static代碼塊有多個(gè),JVM將按照它們在類中出現(xiàn)的先后順序依次執(zhí)行它們,每個(gè)代碼塊只會(huì)被執(zhí)行一次。
利用靜態(tài)代碼塊可以對一些static變量進(jìn)行賦值,最后再看一眼這些例子,都一個(gè)static的main方法,這樣JVM在運(yùn)行main方法的時(shí)候可以直接調(diào)用而不用創(chuàng)建實(shí)例。
4、static和final一塊用表示什么
static final用來修飾成員變量和成員方法,可簡單理解為“全局常量”!
對于變量,表示一旦給值就不可修改,并且通過類名可以訪問。
對于方法,表示不可覆蓋,并且可以通過類名直接訪問。
文章轉(zhuǎn)自 :山東北大青鳥 http://www.tmdps.cn
http://www.tmdps.cn
第二篇:java中final和static的總結(jié)
Java關(guān)鍵字final、static使用總結(jié)
Java關(guān)鍵字final、static使用總結(jié)
一、final
根據(jù)程序上下文環(huán)境,Java關(guān)鍵字final有“這是無法改變的”或者“終態(tài)的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出于兩種理解而需要阻止改變:設(shè)計(jì)或效率。
final類不能被繼承,沒有子類,final類中的方法默認(rèn)是final的。final方法不能被子類的方法覆蓋,但可以被繼承。
final成員變量表示常量,只能被賦值一次,賦值后值不再改變。final不能用于修飾構(gòu)造方法。
注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認(rèn)是final類型的。
1、final類
final類不能被繼承,因此final類的成員方法沒有機(jī)會(huì)被覆蓋,默認(rèn)都是final的。在設(shè)計(jì)類時(shí)候,如果這個(gè)類不需要有子類,類的實(shí)現(xiàn)細(xì)節(jié)不允許改變,并且確信這個(gè)類不會(huì)載被擴(kuò)展,那么就設(shè)計(jì)為final類。
2、final方法
如果一個(gè)類不允許其子類覆蓋某個(gè)方法,則可以把這個(gè)方法聲明為final方法。
使用final方法的原因有二:
第一、把方法鎖定,防止任何繼承類修改它的意義和實(shí)現(xiàn)。
第二、高效。編譯器在遇到調(diào)用final方法時(shí)候會(huì)轉(zhuǎn)入內(nèi)嵌機(jī)制,大大提高執(zhí)行效率。
例如:
public class Test1 {
public static void main(String[] args){
// TODO 自動(dòng)生成方法存根
}
public void f1(){
System.out.println(“f1”);}
//無法被子類覆蓋的方法
public final void f2(){ System.out.println(“f2”);}
public void f3(){
System.out.println(“f3”);}
private void f4(){
System.out.println(“f4”);} }
public class Test2 extends Test1 {
public void f1(){
System.out.println(“Test1父類方法f1被覆蓋!”);}
public static void main(String[] args){ Test2 t=new Test2();t.f1();t.f2();//調(diào)用從父類繼承過來的final方法
t.f3();//調(diào)用從父類繼承過來的方法
//t.f4();//調(diào)用失敗,無法從父類繼承獲得
} }
3、final變量(常量)
用final修飾的成員變量表示常量,值一旦給定就無法改變!final修飾的變量有三種:靜態(tài)變量、實(shí)例變量和局部變量,分別表示三種類型的常量。
從下面的例子中可以看出,一旦給final變量初值后,值就不能再改變了。
另外,final變量定義的時(shí)候,可以先聲明,而不給初值,這中變量也稱為final空白,無論什么情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關(guān)鍵字final的使用上提供了更大的靈活性,為此,一個(gè)類中的final數(shù)據(jù)成員就可以實(shí)現(xiàn)依對象而有所不同,卻有保持其恒定不變的特征。
package org.leizhimin;
public class Test3 {
private final String S = “final實(shí)例變量S”;
private final int A = 100;
public final int B = 90;
public static final int C = 80;
private static final int D = 70;
public final int E;//final空白,必須在初始化對象的時(shí)候賦初值
public Test3(int x){ E = x;}
/**
* @param args
*/
public static void main(String[] args){ Test3 t = new Test3(2);
//t.A=101;//出錯(cuò),final變量的值一旦給定就無法改變
//t.B=91;//出錯(cuò),final變量的值一旦給定就無法改變
//t.C=81;//出錯(cuò),final變量的值一旦給定就無法改變
//t.D=71;//出錯(cuò),final變量的值一旦給定就無法改變
System.out.println(t.A);System.out.println(t.B);
System.out.println(t.C);//不推薦用對象方式訪問靜態(tài)字段
System.out.println(t.D);//不推薦用對象方式訪問靜態(tài)字段
System.out.println(Test3.C);System.out.println(Test3.D);
//System.out.println(Test3.E);//出錯(cuò),因?yàn)镋為final空白,依據(jù)不同對象值有所不同.System.out.println(t.E);
Test3 t1 = new Test3(3);
System.out.println(t1.E);//final空白變量E依據(jù)對象的不同而不同
}
private void test(){
System.out.println(new Test3(1).A);System.out.println(Test3.C);System.out.println(Test3.D);}
public void test2(){
final int a;//final空白,在需要的時(shí)候才賦值
final int b = 4;//局部常量--final用于局部變量的情形
final int c;//final空白,一直沒有給賦值.a = 3;
//a=4;出錯(cuò),已經(jīng)給賦過值了.//b=2;出錯(cuò),已經(jīng)給賦過值了.} }
4、final參數(shù)
當(dāng)函數(shù)參數(shù)為final類型時(shí),你可以讀取使用該參數(shù),但是無法改變該參數(shù)的值。
public class Test4 {
public static void main(String[] args){
new Test4().f1(2);}
public void f1(final int i){
//i++;//i是final類型的,值不允許改變的.System.out.print(i);} }
二、static
static表示“全局”或者“靜態(tài)”的意思,用來修飾成員變量和成員方法,也可以形成靜態(tài)static代碼塊,但是Java語言中沒有全局變量的概念。
被static修飾的成員變量和成員方法獨(dú)立于該類的任何對象。也就是說,它不依賴類特定的實(shí)例,被類的所有實(shí)例共享。只要這個(gè)類被加載,Java虛擬機(jī)就能根據(jù)類名在運(yùn)行數(shù)據(jù)區(qū)的方法區(qū)內(nèi)定找到他們。因此,static對象可以在它的任何對象創(chuàng)建之前訪問,無需引用任何對象。
用public修飾的static成員變量和成員方法本質(zhì)是全局變量和全局方法,當(dāng)聲明它類的對象時(shí),不生成static變量的副本,而是類的所有實(shí)例共享同一個(gè)static變量。
static變量前可以有private修飾,表示這個(gè)變量可以在類的靜態(tài)代碼塊中,或者類的其他靜態(tài)成員方法中使用(當(dāng)然也可以在非靜態(tài)成員方法中使用--廢話),但是不能在其他類中通過類名來直接引用,這一點(diǎn)很重要。實(shí)際上你需要搞明白,private是訪問權(quán)限限定,static表示不要實(shí)例化就可以使用,這樣就容易理解多了。static前面加上其它訪問權(quán)限關(guān)鍵字的效果也以此類推。
static修飾的成員變量和成員方法習(xí)慣上稱為靜態(tài)變量和靜態(tài)方法,可以直接通過類名來訪問,訪問語法為: 類名.靜態(tài)方法名(參數(shù)列表...)類名.靜態(tài)變量名
用static修飾的代碼塊表示靜態(tài)代碼塊,當(dāng)Java虛擬機(jī)(JVM)加載類時(shí),就會(huì)執(zhí)行該代碼塊(用處非常大,呵呵)。
1、static變量
按照是否靜態(tài)的對類成員變量進(jìn)行分類可分兩種:一種是被static修飾的變量,叫靜態(tài)變量或類變量;另一種是沒有被static修飾的變量,叫實(shí)例變量。兩者的區(qū)別是:
對于靜態(tài)變量在內(nèi)存中只有一個(gè)拷貝(節(jié)省內(nèi)存),JVM只為靜態(tài)分配一次內(nèi)存,在加載類的過程中完成靜態(tài)變量的內(nèi)存分配,可用類名直接訪問(方便),當(dāng)然也可以通過對象來訪問(但是這是不推薦的)。
對于實(shí)例變量,沒創(chuàng)建一個(gè)實(shí)例,就會(huì)為實(shí)例變量分配一次內(nèi)存,實(shí)例變量可以在內(nèi)存中有多個(gè)拷貝,互不影響(靈活)。
2、靜態(tài)方法
靜態(tài)方法可以直接通過類名調(diào)用,任何的實(shí)例也都可以調(diào)用,因此靜態(tài)方法中不能用this和super關(guān)鍵字,不能直接訪問所屬類的實(shí)例變量和實(shí)例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態(tài)成員變量和成員方法。因?yàn)閷?shí)例成員與特定的對象關(guān)聯(lián)!這個(gè)需要去理解,想明白其
中的道理,不是記憶!!
因?yàn)閟tatic方法獨(dú)立于任何實(shí)例,因此static方法必須被實(shí)現(xiàn),而不能是抽象的abstract。
3、static代碼塊
static代碼塊也叫靜態(tài)代碼塊,是在類中獨(dú)立于類成員的static語句塊,可以有多個(gè),位置可以隨便放,它不在任何的方法體內(nèi),JVM加載類時(shí)會(huì)執(zhí)行這些靜態(tài)的代碼塊,如果static代碼塊有多個(gè),JVM將按照它們在類中出現(xiàn)的先后順序依次執(zhí)行它們,每個(gè)代碼塊只會(huì)被執(zhí)行一次。例如:
public class Test5 {
private static int a;
private int b;
static {
Test5.a = 3;
System.out.println(a);Test5 t = new Test5();t.f();t.b = 1000;
System.out.println(t.b);}
static {
Test5.a = 4;
System.out.println(a);}
public static void main(String[] args){
// TODO 自動(dòng)生成方法存根
}
static {
Test5.a = 5;
System.out.println(a);}
public void f(){
System.out.println(“hhahhahah”);} }
運(yùn)行結(jié)果: 3 hhahhahah 1000 4 5
利用靜態(tài)代碼塊可以對一些static變量進(jìn)行賦值,最后再看一眼這些例子,都一個(gè)static的main方法,這樣JVM在運(yùn)行main方法的時(shí)候可以直接調(diào)用而不用創(chuàng)建實(shí)例。
4、static和final一塊用表示什么
static final用來修飾成員變量和成員方法,可簡單理解為“全局常量”!
對于變量,表示一旦給值就不可修改,并且通過類名可以訪問。
對于方法,表示不可覆蓋,并且可以通過類名直接訪問。
特別要注意一個(gè)問題:
對于被static和final修飾過的實(shí)例常量,實(shí)例本身不能再改變了,但對于一些容器類型(比如,ArrayList、HashMap)的實(shí)例變量,不可以改變?nèi)萜髯兞勘旧恚梢孕薷娜萜髦写娣诺膶ο螅@一點(diǎn)在編程中用到很多。
也許說了這么多,反倒把你搞暈了,還是看個(gè)例子吧:
public class TestStaticFinal {
private static final String strStaticFinalVar = “aaa”;
private static String strStaticVar = null;
private final String strFinalVar = null;
private static final int intStaticFinalVar = 0;
private static final Integer integerStaticFinalVar = new Integer(8);
private static final ArrayList
private void test(){
System.out.println(“-------------值處理前----------rn”);
System.out.println(“strStaticFinalVar=” + strStaticFinalVar + “rn”);
System.out.println(“strStaticVar=” + strStaticVar + “rn”);System.out.println(“strFinalVar=” + strFinalVar + “rn”);
System.out.println(“intStaticFinalVar=” + intStaticFinalVar + “rn”);
System.out.println(“integerStaticFinalVar=” + integerStaticFinalVar + “rn”);
System.out.println(“alStaticFinalVar=” + alStaticFinalVar + “rn”);
//strStaticFinalVar=“哈哈哈哈”;//錯(cuò)誤,final表示終態(tài),不可以改變變量本身.strStaticVar = “哈哈哈哈”;//正確,static表示類變量,值可以改變.//strFinalVar=“呵呵呵呵”;//錯(cuò)誤, final表示終態(tài),在定義的時(shí)候就要初值(哪怕給個(gè)null),一旦給定后就不可再更改。
//intStaticFinalVar=2;//錯(cuò)誤, final表示終態(tài),在定義的時(shí)候就要初值(哪怕給個(gè)null),一旦給定后就不可再更改。
//integerStaticFinalVar=new Integer(8);//錯(cuò)誤, final表示終態(tài),在定義的時(shí)候就要初值(哪怕給個(gè)null),一旦給定后就不可再更改。
alStaticFinalVar.add(“aaa”);//正確,容器變量本身沒有變化,但存放內(nèi)容發(fā)生了變化。這個(gè)規(guī)則是非常常用的,有很多用途。
alStaticFinalVar.add(“bbb”);//正確,容器變量本身沒有變化,但存放內(nèi)容發(fā)生了變化。這個(gè)規(guī)則是非常常用的,有很多用途。
System.out.println(“-------------值處理后----------rn”);
System.out.println(“strStaticFinalVar=” + strStaticFinalVar + “rn”);
System.out.println(“strStaticVar=” + strStaticVar + “rn”);System.out.println(“strFinalVar=” + strFinalVar + “rn”);
System.out.println(“intStaticFinalVar=” + intStaticFinalVar + “rn”);
System.out.println(“integerStaticFinalVar=” + integerStaticFinalVar + “rn”);
System.out.println(“alStaticFinalVar=” + alStaticFinalVar + “rn”);}
public static void main(String args[]){
new TestStaticFinal().test();} }
運(yùn)行結(jié)果如下:
-------------值處理前----------strStaticFinalVar=aaa strStaticVar=null strFinalVar=null intStaticFinalVar=0 integerStaticFinalVar=8 alStaticFinalVar=[]-------------值處理后----------strStaticFinalVar=aaa strStaticVar=哈哈哈哈 strFinalVar=null
intStaticFinalVar=0 integerStaticFinalVar=8 alStaticFinalVar=[aaa, bbb]
Process finished with exit code 0
看了上面這個(gè)例子,就清楚很多了,但必須明白:通過static final修飾的容器類型變量中所“裝”的對象是可改變的。這是和一般基本類型和類類型變量差別很大的地方。
第三篇:java中常用關(guān)鍵字總結(jié)
Java中的關(guān)鍵字總結(jié)
final 關(guān)鍵字
1、用final修飾的類不能被繼承,沒有子類;
2、用final修飾的方法,方法不能被重寫;
3、用final修飾變量,變量的值不能被修改,表示常量,(書寫規(guī)范:全部字母都要大寫;多個(gè)單詞,可以使用下劃線(_)分開;)注意:如果被final修飾的變量是一個(gè)引用類型的數(shù)據(jù),那么通過這個(gè)引用改變堆空間中的數(shù)據(jù),不會(huì)報(bào)錯(cuò);如果被final修飾的變量是一個(gè)引用類型的數(shù)據(jù),那么通過這個(gè)引用改變堆空間中的數(shù)據(jù),不會(huì)報(bào)錯(cuò);
4、final用于成員變量表示該成員變量為常量,不能被修改,必須在變量定義時(shí)賦值。
5、final用于局部變量表示該局部變量為常量,不能被修改,可以在變量定義時(shí)賦值,也可以先定義變量后賦值。什么時(shí)候用final關(guān)鍵字? 有的時(shí)候不想別人重寫我的方法就使用final關(guān)鍵字修飾該方法;
static關(guān)鍵字
1、static用于成員變量表示該變量只有一份,也就是說靜態(tài)成員變量屬于類而不屬于某個(gè)具體的類實(shí)例對象,所有的類實(shí)例對象共享這個(gè)靜態(tài)成員變量; 靜態(tài)函數(shù)是不需要對象的,直接可以使用類名來調(diào)用;
2、非靜態(tài)函數(shù)可以調(diào)用靜態(tài)函數(shù);靜態(tài)函數(shù)不能調(diào)用非靜態(tài)函數(shù)(非靜態(tài)函數(shù)都是通過對象調(diào)用的);靜態(tài)函數(shù)不能使用非靜態(tài)成員變量,但可以使用靜態(tài)成員變量;
3、靜態(tài)函數(shù)調(diào)用時(shí)不需要對象的,所以不能使用和對象有關(guān)的關(guān)鍵字;(this;super;)
4、構(gòu)造函數(shù)不能使用static修飾(構(gòu)造函數(shù)是創(chuàng)建對象,開辟空間,給所有成員變量賦默認(rèn)值之后,有JVM調(diào)用進(jìn)棧,用來給對象的成員變量賦初始值的)static用于類,這里指的是內(nèi)部類,那么在別的地方就可以通過外部類名來引用這個(gè)靜態(tài)的內(nèi)部類。
5、static還可以用于類的代碼塊,叫做靜態(tài)代碼塊,靜態(tài)代碼塊在類加載的時(shí)候就執(zhí)行完畢,而類只加載一次;是在類中獨(dú)立于類成員的static語句塊,可以有多個(gè),位置可以隨便放,它不在任何的方法體內(nèi),JVM加載類時(shí)會(huì)執(zhí)行這些靜態(tài)的代碼塊,如果static代碼塊有多個(gè),JVM將按照它們在類中出現(xiàn)的先后順序依次執(zhí)行它們,每個(gè)代碼塊只會(huì)被執(zhí)行一次。什么時(shí)候用static關(guān)鍵字? 不想建立對象時(shí);對于公用的成員變量必須使用static關(guān)鍵字修飾才能保證共享;
private關(guān)鍵字
1、java中的訪問權(quán)限修飾符(作用是控制被修飾的成員的訪問權(quán)限);被private修飾的成員,只能在本類中使用;所以被私有的成員需要在外界訪問,還需要提供一個(gè)公共的方法;
設(shè)值:set + 變量名(變量名的首字母大寫); 取值:get + 變量名(變量名的首字母大寫);
2、構(gòu)造函數(shù)私有化,就只能在被類中使用,別的地方調(diào)用不了;單例設(shè)計(jì)模式時(shí)會(huì)用到;
在開發(fā)中,一般類的成員變量都要私有化,然后提供get和set方法;
interface關(guān)鍵字
1、interface接口不是一個(gè)類,使用interface聲明;接口沒有構(gòu)造函數(shù);接口是用來描述不屬于繼承體系的擴(kuò)展功能的;還可以定義規(guī)則;接口和類之間是實(shí)現(xiàn)關(guān)系,一個(gè)實(shí)現(xiàn)類可以實(shí)現(xiàn)多個(gè)接口;接口和接口之間是繼承關(guān)系,可以多繼承和多重繼承;
2、接口中可以書寫的內(nèi)容:
成員變量:只能使用一下修飾符:public static final;也就是說,接口中的成員變量,都是常量;
成員函數(shù): 只能使用修飾符:public abstract;也就是說,接口中的方法,都是公共和抽象的;一般函數(shù)前面的修飾符,推薦public不要省略;
什么時(shí)候用interface關(guān)鍵字? 對于繼承體系之外的擴(kuò)展功能需要使用接口來描述;
implements關(guān)鍵字
implements用于實(shí)現(xiàn)接口,需要實(shí)現(xiàn)接口中的所有方法,可以同時(shí)實(shí)現(xiàn)多個(gè)接口。extends關(guān)鍵字
extends用于繼承父類或父接口,繼承父類時(shí)只能是單繼承。
class關(guān)鍵字
class用于聲明類,訪問權(quán)限可以是public或者默認(rèn)權(quán)限,還可以指定為abstract、final,訪問權(quán)限對于頂層類和內(nèi)部類的限制是不同的。
instanceof關(guān)鍵字
1、比較運(yùn)算符,運(yùn)算符左邊是一個(gè)指向一個(gè)對象的引用(左邊就是一個(gè)變量名),右邊是一個(gè)類名,運(yùn)算符表示的意思就是:判斷左邊的對象的類型是不是右邊的類;
2、使用instanceof關(guān)鍵字,可以實(shí)時(shí)判斷一個(gè)對象的類型,就可以避免強(qiáng)制類型轉(zhuǎn)換中容易出現(xiàn)的類型轉(zhuǎn)換異常。
abstract關(guān)鍵字
1、abstract用于類表示這個(gè)類為抽象類,不能實(shí)例化。
2、抽象類,必須由子類去繼承,繼承的子類必須實(shí)現(xiàn)父類中所有的抽象方法,否則子類也是抽象的;
3、抽象函數(shù)必須放在抽象類中;抽象類中除了抽象函數(shù),還可以定義所有一般類中可以定義的成員;
4、抽象類中可以不書寫抽象方法;抽象類中必須有構(gòu)造方法;抽象類一定是父類;
5、抽象類是父類,用來描述所有子類的共性信息的,只是描述的有些功能是不具體的;
6、abstract用于方法表示這個(gè)方法為抽象方法,只需聲明,不用實(shí)現(xiàn),由子類實(shí)現(xiàn),抽象方法不能用private和static關(guān)鍵字。什么時(shí)候用abstract關(guān)鍵字? 當(dāng)事物的功能描述不清,只能表示有這個(gè)功能時(shí),就應(yīng)該使用抽象修飾該功能,這個(gè)功能就是抽象的功能;如果一個(gè)類中有抽象的功能,那么這個(gè)類也是抽象的類;不想實(shí)例化這個(gè)類(包括自己也不行),但是允許別人繼承,也可以使用抽象類。
this關(guān)鍵字
1、表示自身所屬對象的引用;哪個(gè)對象調(diào)用this,this就指向哪個(gè)對象;
2、Java關(guān)鍵字this只能用于方法方法體內(nèi)。當(dāng)一個(gè)對象創(chuàng)建后,Java虛擬機(jī)(JVM)就會(huì)給這個(gè)對象分配一個(gè)引用自身的指針,這個(gè)指針的名字就是this。因此,this只能在類中的非靜態(tài)方法中使用,靜態(tài)方法和靜態(tài)的代碼塊中絕對不能出現(xiàn)this.什么時(shí)候用this關(guān)鍵字?
1、通過this調(diào)用另一個(gè)構(gòu)造方法,用法:this(參數(shù)列表),這個(gè)僅僅在類的構(gòu)造方法中,別的地方不能這么用。如果一個(gè)構(gòu)造函數(shù)中有this()語句,就沒有隱式三步,隱式三步在this語句調(diào)用的那個(gè)構(gòu)造函數(shù)中,且this語句必須在第一行的位置;
2、函數(shù)參數(shù)或者函數(shù)中的局部變量和成員變量同名的情況下,成員變量被私有化,此時(shí)要訪問成員變量則需要用“this.成員變量名”的方式來引用成員變量。(用來區(qū)分成員變量和局部變量)
3、在函數(shù)中,需要引用該函所屬類的當(dāng)前對象時(shí)候,直接用this。
super關(guān)鍵字
1、表示父類;可以在子類中調(diào)用父類的非私有成員和構(gòu)造函數(shù);
2、調(diào)用方法:
調(diào)用父類構(gòu)造函數(shù):super(參數(shù));(父類中沒有無參構(gòu)造函數(shù)在父類中添
加一個(gè)無參構(gòu)造;在子類中手動(dòng)調(diào)用有參構(gòu)造函數(shù))調(diào)用父類成員變量:super.變量名; 調(diào)用父類成員函數(shù):super.函數(shù)名(參數(shù));
3、super關(guān)鍵和this作用類似,是被私有的成員變量或者成員方法變?yōu)榭梢姡蛘哒f用來引用被私有的成員變量和成員方法,不過super是用在子類中,目的是訪問直接父類中被屏蔽的成員.什么時(shí)候用super關(guān)鍵字?
如果父類中沒有無參構(gòu)造函數(shù)是,需要在子類中用super調(diào)用有參構(gòu)造函數(shù);
第四篇:關(guān)于static的總結(jié)
static局部變量:
1、改變了變量的存儲(chǔ)方式(從棧區(qū)變成全局區(qū)),即改變了變量的生命周期。
2、static局部變量只初始化一次,沒有顯示初始化時(shí)默認(rèn)為0,在某個(gè)函數(shù)中,下一次的值依據(jù)上一次的值。
static全局變量
1、全局變量前面加上static,存儲(chǔ)方式?jīng)]有改變。
2、static全局變量改變了作用域,限制了使用范圍,只能在定義了該變量的源文件有效,在同一源程序的不同源文件中不能使用,即本地的全局變量。非靜態(tài)全局變量在同一源程序的不同源文件中都是有效的。
3、static全局變量只初始化一次,沒有顯示初始化時(shí)默認(rèn)為0。
static函數(shù)
1、static函數(shù)限制了使用范圍,只能在當(dāng)前源文件中使用,相當(dāng)于內(nèi)部函數(shù)。c++類中,為了避免不同類中相同名字函數(shù)的重定義錯(cuò)誤,在函數(shù)前面加上static。
2、static函數(shù)在內(nèi)存中只保存一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝
注:引用一個(gè)已經(jīng)定義過的全局變量:
1、引用頭文件
將全局變量寫錯(cuò)了,將會(huì)在編譯的時(shí)候報(bào)錯(cuò)。
在不同的.c文件中以static形式聲明同名的全局變量,在不同的.c文件中聲明同名 全局變量時(shí),只能有一個(gè).c文件中對其賦值,否則鏈接出錯(cuò)。
2、extern關(guān)鍵字
將全局變量寫錯(cuò)了,編譯的時(shí)候不會(huì)報(bào)錯(cuò),鏈接的時(shí)候會(huì)報(bào)錯(cuò)。
第五篇:Java集合框架使用總結(jié)
前言:
本文是對Java集合框架做了一個(gè)概括性的解說,目的是對Java集合框架體系有個(gè)總體認(rèn)識(shí),如果你想學(xué)習(xí)具體的接口和類的使用方法,請參看Java API文檔。
一、概述
數(shù)據(jù)結(jié)構(gòu)對程序設(shè)計(jì)有著深遠(yuǎn)的影響,在面向過程的C語言中,數(shù)據(jù)庫結(jié)構(gòu)用struct來描述,而在面向?qū)ο蟮木幊讨校瑪?shù)據(jù)結(jié)構(gòu)是用類來描述的,并且包含有對該數(shù)據(jù)結(jié)構(gòu)操作的方法。
在Java語言中,Java語言的設(shè)計(jì)者對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范(接口)和實(shí)現(xiàn)(具體實(shí)現(xiàn)接口的類)。所有抽象出來的數(shù)據(jù)結(jié)構(gòu)和操作(算法)統(tǒng)稱為Java集合框架(Java Collection Framework)。
Java程序員在具體應(yīng)用時(shí),不必考慮數(shù)據(jù)結(jié)構(gòu)和算法實(shí)現(xiàn)細(xì)節(jié),只需要用這些類創(chuàng)建出來一些對象,然后直接應(yīng)用就可以了。這樣就大大提高了編程效率。
二、集合框架的層次結(jié)構(gòu)
Collection是集合接口
|————Set子接口:無序,不允許重復(fù)。
|————List子接口:有序,可以有重復(fù)元素
區(qū)別:Collections是集合類
Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會(huì)引起元素位置改變。
List:和數(shù)組類似,List可以動(dòng)態(tài)增長,查找元素效率高,插入刪除元素效率低,因?yàn)闀?huì)引起其他元素位置改變。
Set和List具體子類:
Set
|————HashSet:以哈希表的形式存放元素,插入刪除速度很快。
List
|————ArrayList:動(dòng)態(tài)數(shù)組
|————LinkedList:鏈表、隊(duì)列、堆棧。
Array和java.util.Vector
Vector是一種老的動(dòng)態(tài)數(shù)組,是線程同步的,效率很低,一般不贊成使用。
三、Iterator迭代器(接口)
Iterator是獲取集合中元素的過程,實(shí)際上幫助獲取集合中的元素。
迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器與枚舉有兩點(diǎn)不同:
迭代器允許調(diào)用方利用定義良好的語義在迭代期間從迭代器所指向的集合移除元素。方法名稱得到了改進(jìn)。
Iterator僅有一個(gè)子接口ListIterator,是列表迭代器,允許程序員按任一方向遍歷列表、迭代期間修改列表,并獲得迭代器在列表中的當(dāng)前位置。ListIterator 沒有當(dāng)前元素;它的光標(biāo)位置 始終位于調(diào)用 previous()所返回的元素和調(diào)用 next()所返回的元素之間。在長度為 n 的列表中,有 n+1 個(gè)有效的索引值,從 0 到 n(包含)。
四、集合框架之外的Map接口
Map將鍵映射到值的對象。一個(gè)映射不能包含重復(fù)的鍵;每個(gè)鍵最多只能映射一個(gè)值。Map接口是Dictionary(字典)抽象類的替代品。
Map 接口提供三種collection 視圖,允許以鍵集、值集合或鍵-值映射關(guān)系集的形式查看
某個(gè)映射的內(nèi)容。映射的順序 定義為迭代器在映射的 collection 視圖中返回其元素的順序。某些映射實(shí)現(xiàn)可明確保證其順序,如 TreeMap 類;某些映射實(shí)現(xiàn)則不保證順序,如 HashMap 類。
有兩個(gè)常見的已實(shí)現(xiàn)的子類:
HashMap:基于哈希表的 Map 接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了不同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恒久不變。
TreeMap:它實(shí)現(xiàn)SortedMap 接口的基于紅黑樹的實(shí)現(xiàn)。此類保證了映射按照升序順序排列關(guān)鍵字,根據(jù)使用的構(gòu)造方法不同,可能會(huì)按照鍵的類的自然順序 進(jìn)行排序(參見 Comparable),或者按照創(chuàng)建時(shí)所提供的比較器進(jìn)行排序。
Hashtable:此類實(shí)現(xiàn)一個(gè)哈希表,該哈希表將鍵映射到相應(yīng)的值。任何非 null 對象都可以用作鍵或值。
五、線程安全類
在集合框架中,有些類是線程安全的,這些都是JDK1.1中的出現(xiàn)的。在JDK1.2之后,就出現(xiàn)許許多多非線程安全的類。
下面是這些線程安全的同步的類:
Vector:就比ArrayList多了個(gè)同步化機(jī)制(線程安全)。
Statck:堆棧類,先進(jìn)后出。
Hashtable:就比HashMap多了個(gè)線程安全。
Enumeration:枚舉,相當(dāng)于迭代器。
除了這些之外,其他的都是非線程安全的類和接口。
線程安全的類其方法是同步的,每次只能一個(gè)訪問。是重量級對象,效率較低。對于非線程
安全的類和接口,在多線程中需要程序員自己處理線程安全問題。
六、其他一些接口和類介紹
Dictionary和Hashtable類:
Dictionary提供鍵值映射的功能,是個(gè)抽象類。一般使用它的子類HashTable類。遍歷Hashtable類要用到枚舉。
Properties類
Properties 繼承于 Hashtable,Properties 類表示了一個(gè)持久的屬性集。Properties 可保存在流中或從流中加載。屬性列表中每個(gè)鍵及其對應(yīng)值都是一個(gè)字符串。一般可以通過讀取properties配置文件來填充Properties對象。