Java重要知識點總結
阿新 • • 發佈:2019-01-03
*編碼規範:常量名通常使用大寫字母,中間使用下劃線連線
*定義的final變數屬於全域性變數時,必須在定義時就設定它的初值,否則將會產生編譯錯誤。區域性變數可以不在定義的時候賦初值(但是在使用前必須賦初值)。
*普通的成員變數(全域性變數),可以為它設定初始值,也可以不設定初始值。如果不設定初始值,則會有預設值
*區域性變數在使用時必須進行賦值操作或被初始化,否則會出現編譯錯誤
*java.lang.StringBuilder
append(String str);insert(int offset,String str)
delete(int start,int end)
*在java中陣列是物件
int array[]
int[] array([]表示要建立的是陣列型別)
int a[][]=new int[3][4];//給陣列開闢記憶體空間,同時全部賦初值為0
*abstract修飾的方法子類繼承必須重寫
final修飾的方法子類繼承不能重寫
*在介面中定義常量時,該常量的修飾符為final和static;定義方法全部預設為public和abstract修飾
*使用return關鍵字後,方法的執行將被終止
*在Java語言中規定使用this關鍵字來代表本類物件的引用,
this引用的就是本類的一個物件,this關鍵字被隱式的用於引用物件的成員變數和方法,this還可以作為方法的返回值,返回的是本類的一個物件
*靜態資料與靜態方法的作用通常是為了提供共享資料或方法,靜態成員同樣遵循著public、private和protected修飾符的約束
*非靜態方法中可以呼叫靜態成員和方法,靜態方法中不可以直接呼叫非靜態方法(但可以通過物件呼叫非靜態方法),因為非靜態不依附於類還沒有被初始化,在靜態方法中也不可以使用this關鍵字
*不能將方法體內的區域性變數宣告為static
*靜態程式碼塊會首先被執行,並且只執行一次,通常用於執行類的初始化
*靜態內部類和非靜態內部類
(1)內部靜態類不需要有指向外部類的引用。但非靜態內部類需要持有對外部類的引用。
(2)非靜態內部類能夠訪問外部類的靜態和非靜態成員。靜態類不能訪問外部類的非靜態成員。他只能訪問外部類的靜態成員。
(3)一個非靜態內部類不能脫離外部類實體被建立,一個非靜態內部類可以訪問外部類的資料和方法,因為他就在外部類裡面。
*Java中宣告一個物件的時候其實是一個引用,引用的內容是相應物件的記憶體地址
*int num=Integer.parseInt("12345");
Integer num=Integer.valueOf("12345");
String numStr=num.toString();
*子類不能通過super呼叫父類修飾為private的方法
*重寫可以修改修飾許可權,但是隻能由小範圍到大範圍修改
*重寫可以修改返回值型別,但必須是父類返回值型別的子類
*在例項化子類物件時會先例項化父類物件,然後再例項化子類物件
*在例項化子類物件時,父類無參構造方法將會自動呼叫,但有參構造方法並不能被自動呼叫,只能依賴於super關鍵字顯示地呼叫父類的構造方法
*把子類物件賦值給父類型別的變數,這種技術被稱為“向上轉型”
*由於向上轉型總是從一個較具體的類到較抽象的類的轉換,所以它總是安全的,如可以說平行四邊形是特殊的四邊形,但不能說四邊形是平行四邊形
*當在程式中使用向下轉型技術時,必須使用顯示型別轉換(強制型別轉換),向編譯器指明將父類物件轉換為哪一種型別的子類物件
*在執行向下轉型之前需要養成一個良好的習慣,就是判斷父類物件是否為子類物件的例項。這個判斷通常使用instanceof操作符來完成。可以使用instanceof操作符判斷是否一個類實現了某個介面,也可以用它來判斷一個例項物件是否屬於一個類。
*在談到引數個數可以確定兩個方法是否具有過載關係時,會想到定義不定長引數方法,在引數列表中使用“...”形式定義不定長引數,其實這個不定長引數a就是一個數組,編譯器會將(int...a)這種形式看作是(int[]a)(這裡不是十分準確,使用(int...a)做引數執行傳入的引數個數可以為0)
*如果宣告一個抽象的方法,就必須將承載這個抽象方法的類定義為抽象類,不可能在非抽象類中獲取抽象方法。換句話說,只要類中有一個抽象方法,此類就被標記為抽象類。但是抽象類中是可以包含非抽象方法的
*抽象類被繼承後必須實現其中所有的抽象方法,也就是保證相同的方法名稱、引數列表和相同的返回值型別創建出非抽象方法,當然也可以是抽象方法
*java中規定類不能同時繼承多個父類,但是可以同時實現多個介面,實現介面需要重寫介面中的所有方法
*介面也可以進行向上轉型操作,也就是說介面也可以定義物件,並且可以使用實現該介面的類定義的物件對介面定義的物件進行例項化。這裡類定義的具體方法將會覆蓋介面中的該方法。
*在java中無論是將一個類向上轉型為父類物件,還是向上轉型為抽象父類物件,或者向上轉型為該類實現介面,都是沒問題的
*當使用import指定了一個包中的所有類時,如果用到這個包中的子類,需要再次對子包做單獨引用
*import還可以匯入靜態成員,例如:improt static java.lang.System.out;
*final關鍵字定義的變數必須在宣告時對其進行賦值操作(宣告為final的成員變數可以在構造方法中進行初始化,一個既是static又是final的欄位只佔據一段不能改變的儲存空間,在裝載時被初始化,而不是每次建立新物件時被初始化
*定義為final的方法不能被重寫,定義為final的類不能被繼承,如果將某個類設定為final形式,則類中的所有方法都被隱式設定為final形式,但是final類中的成員變數可以被定義final或非final形式
*內部類的成員只有在內部類的範圍之內是可知的,不能被外部類使用。在內部類中可以隨意使用外部類的成員方法和成員變數
*對一個內部類進行例項化的操作
OuterClass out=new OuterClass();
OuterClass.innerClass in=out.new innerClass();//需要使用外部類的物件來建立其內部類的物件
*內部類的許可權修飾符的作用和成員變數和方法是一樣的,如果修飾為private就說明只有當前的外部類可以引用該內部類,其他類都不可以使用
*通常會在外部類中定義一個實現某介面的private型別的內部類,然後再在外部類中定義一個返回那個介面物件的成員方法,這樣可以很好的隱藏內部類的實現細節
*成員內部類,就和成員變數和成員方法的定義位置和訪問類似
*區域性內部類(內部類不僅可以在類中進行定義,也可以在類的區域性位置定義,如在類的方法或任意的作用域中均可以定義內部類)
*定義在成員方法中的內部類,在該成員方法的外部不能訪問該內部類,但是該內部類可以訪問當前程式碼塊的常量以及此外部類的所有成員
*匿名內部類
Interface OuterInterface{
public int getValue();
}
class OuterClass{
public OuterInterface doit(){
return new OuterInterface(){
private int i=0;
public int getValue(){
return i;
}
};
}
}
等價於
Interface OuterInterface{
public int getValue();
}
class OuterClass{
private class InterClass implements OuterInterface{
private int i=0;
public int getValue(){
return i;
}
OuterInterface getInterface(){
return new OuterInterface();
}
}
public OuterInterface doit(){
new InterClass().getInterface();
}
}
在doit()方法內部首先返回一個OuterInterface的引用,然後在return語句中插入一個定義內部類的程式碼,由於這個類沒有名稱,所以這裡將該內部類稱為匿名內部類。實質上這種內部類的作用就是建立一個實現了OuterInterface介面的匿名類的物件。
*靜態內部類
一個靜態內部類中可以宣告static成員,但是在非靜態內部類中不可以宣告靜態成員;靜態內部類不可以使用外部類的非靜態成員;如果建立靜態內部類的物件,不需要其外部類的物件;StaticInnerClass$Inner表示Inner是StatiInnerClass的一個內部類
當try程式碼塊中的語句發生異常時,程式就會調轉到catch程式碼塊中執行,執行完catch程式碼塊中的程式程式碼後,將繼續執行catch程式碼塊後的其他程式碼,而不會執行try程式碼塊中發生異常語句後面的程式碼。由此可知,Java的異常處理是結構化的,不會因為一個異常影響整個程式的執行。
throws關鍵字通常被應用在宣告方法時,用來指定方法可能丟擲的異常;throw關鍵字通常用於方法體中,並且丟擲一個異常物件。
*列舉型別其實也是一種類,如果在類內部建立列舉型別會被作為內部類使用,它相當於繼承與java.lang.Enum類,當定義一個列舉型別時,每一個列舉型別成員都可以看作是列舉型別的一個例項,這些列舉型別成員都預設被final,public,static修飾,所以當使用列舉型別成員時直接使用列舉型別名稱呼叫列舉型別成員即可。
*在java中ArrayList<E>,HashMap<K,V>,HashSet<E>,Vector<E>這些集合框架已經被泛型化了,可以直接例項化,例如:ArrayList<Integer> array=new ArrayList<integer>():
*限制泛型可用型別
1.class 類名稱<T extends anyClass>
2.使用型別萬用字元
泛型類名稱<? extends List>a=null;
3.繼承泛型類和實現泛型介面
*泛型的型別引數只能是類型別,不可以是簡單型別,如A<int>這種泛型定義就是錯誤的
*流是一組有序的資料序列,根據操作的型別,可分為輸入流和輸出流兩種。I/O流提供了一條通道程式,可以使用這條通道把源中的位元組序列送到目的地。
*定義的final變數屬於全域性變數時,必須在定義時就設定它的初值,否則將會產生編譯錯誤。區域性變數可以不在定義的時候賦初值(但是在使用前必須賦初值)。
*普通的成員變數(全域性變數),可以為它設定初始值,也可以不設定初始值。如果不設定初始值,則會有預設值
*區域性變數在使用時必須進行賦值操作或被初始化,否則會出現編譯錯誤
*java.lang.StringBuilder
append(String str);insert(int offset,String str)
delete(int start,int end)
*在java中陣列是物件
int array[]
int[] array([]表示要建立的是陣列型別)
int a[][]=new int[3][4];//給陣列開闢記憶體空間,同時全部賦初值為0
*abstract修飾的方法子類繼承必須重寫
final修飾的方法子類繼承不能重寫
*在介面中定義常量時,該常量的修飾符為final和static;定義方法全部預設為public和abstract修飾
*使用return關鍵字後,方法的執行將被終止
*在Java語言中規定使用this關鍵字來代表本類物件的引用,
this引用的就是本類的一個物件,this關鍵字被隱式的用於引用物件的成員變數和方法,this還可以作為方法的返回值,返回的是本類的一個物件
*靜態資料與靜態方法的作用通常是為了提供共享資料或方法,靜態成員同樣遵循著public、private和protected修飾符的約束
*非靜態方法中可以呼叫靜態成員和方法,靜態方法中不可以直接呼叫非靜態方法(但可以通過物件呼叫非靜態方法),因為非靜態不依附於類還沒有被初始化,在靜態方法中也不可以使用this關鍵字
*不能將方法體內的區域性變數宣告為static
*靜態程式碼塊會首先被執行,並且只執行一次,通常用於執行類的初始化
*靜態內部類和非靜態內部類
(1)內部靜態類不需要有指向外部類的引用。但非靜態內部類需要持有對外部類的引用。
(2)非靜態內部類能夠訪問外部類的靜態和非靜態成員。靜態類不能訪問外部類的非靜態成員。他只能訪問外部類的靜態成員。
(3)一個非靜態內部類不能脫離外部類實體被建立,一個非靜態內部類可以訪問外部類的資料和方法,因為他就在外部類裡面。
*Java中宣告一個物件的時候其實是一個引用,引用的內容是相應物件的記憶體地址
*int num=Integer.parseInt("12345");
Integer num=Integer.valueOf("12345");
String numStr=num.toString();
*子類不能通過super呼叫父類修飾為private的方法
*重寫可以修改修飾許可權,但是隻能由小範圍到大範圍修改
*重寫可以修改返回值型別,但必須是父類返回值型別的子類
*在例項化子類物件時會先例項化父類物件,然後再例項化子類物件
*在例項化子類物件時,父類無參構造方法將會自動呼叫,但有參構造方法並不能被自動呼叫,只能依賴於super關鍵字顯示地呼叫父類的構造方法
*把子類物件賦值給父類型別的變數,這種技術被稱為“向上轉型”
*由於向上轉型總是從一個較具體的類到較抽象的類的轉換,所以它總是安全的,如可以說平行四邊形是特殊的四邊形,但不能說四邊形是平行四邊形
*當在程式中使用向下轉型技術時,必須使用顯示型別轉換(強制型別轉換),向編譯器指明將父類物件轉換為哪一種型別的子類物件
*在執行向下轉型之前需要養成一個良好的習慣,就是判斷父類物件是否為子類物件的例項。這個判斷通常使用instanceof操作符來完成。可以使用instanceof操作符判斷是否一個類實現了某個介面,也可以用它來判斷一個例項物件是否屬於一個類。
*在談到引數個數可以確定兩個方法是否具有過載關係時,會想到定義不定長引數方法,在引數列表中使用“...”形式定義不定長引數,其實這個不定長引數a就是一個數組,編譯器會將(int...a)這種形式看作是(int[]a)(這裡不是十分準確,使用(int...a)做引數執行傳入的引數個數可以為0)
*如果宣告一個抽象的方法,就必須將承載這個抽象方法的類定義為抽象類,不可能在非抽象類中獲取抽象方法。換句話說,只要類中有一個抽象方法,此類就被標記為抽象類。但是抽象類中是可以包含非抽象方法的
*抽象類被繼承後必須實現其中所有的抽象方法,也就是保證相同的方法名稱、引數列表和相同的返回值型別創建出非抽象方法,當然也可以是抽象方法
*java中規定類不能同時繼承多個父類,但是可以同時實現多個介面,實現介面需要重寫介面中的所有方法
*介面也可以進行向上轉型操作,也就是說介面也可以定義物件,並且可以使用實現該介面的類定義的物件對介面定義的物件進行例項化。這裡類定義的具體方法將會覆蓋介面中的該方法。
*在java中無論是將一個類向上轉型為父類物件,還是向上轉型為抽象父類物件,或者向上轉型為該類實現介面,都是沒問題的
*當使用import指定了一個包中的所有類時,如果用到這個包中的子類,需要再次對子包做單獨引用
*import還可以匯入靜態成員,例如:improt static java.lang.System.out;
*final關鍵字定義的變數必須在宣告時對其進行賦值操作(宣告為final的成員變數可以在構造方法中進行初始化,一個既是static又是final的欄位只佔據一段不能改變的儲存空間,在裝載時被初始化,而不是每次建立新物件時被初始化
*定義為final的方法不能被重寫,定義為final的類不能被繼承,如果將某個類設定為final形式,則類中的所有方法都被隱式設定為final形式,但是final類中的成員變數可以被定義final或非final形式
*內部類的成員只有在內部類的範圍之內是可知的,不能被外部類使用。在內部類中可以隨意使用外部類的成員方法和成員變數
*對一個內部類進行例項化的操作
OuterClass out=new OuterClass();
OuterClass.innerClass in=out.new innerClass();//需要使用外部類的物件來建立其內部類的物件
*內部類的許可權修飾符的作用和成員變數和方法是一樣的,如果修飾為private就說明只有當前的外部類可以引用該內部類,其他類都不可以使用
*通常會在外部類中定義一個實現某介面的private型別的內部類,然後再在外部類中定義一個返回那個介面物件的成員方法,這樣可以很好的隱藏內部類的實現細節
*成員內部類,就和成員變數和成員方法的定義位置和訪問類似
*區域性內部類(內部類不僅可以在類中進行定義,也可以在類的區域性位置定義,如在類的方法或任意的作用域中均可以定義內部類)
*定義在成員方法中的內部類,在該成員方法的外部不能訪問該內部類,但是該內部類可以訪問當前程式碼塊的常量以及此外部類的所有成員
*匿名內部類
Interface OuterInterface{
public int getValue();
}
class OuterClass{
public OuterInterface doit(){
return new OuterInterface(){
private int i=0;
public int getValue(){
return i;
}
};
}
}
等價於
Interface OuterInterface{
public int getValue();
}
class OuterClass{
private class InterClass implements OuterInterface{
private int i=0;
public int getValue(){
return i;
}
OuterInterface getInterface(){
return new OuterInterface();
}
}
public OuterInterface doit(){
new InterClass().getInterface();
}
}
在doit()方法內部首先返回一個OuterInterface的引用,然後在return語句中插入一個定義內部類的程式碼,由於這個類沒有名稱,所以這裡將該內部類稱為匿名內部類。實質上這種內部類的作用就是建立一個實現了OuterInterface介面的匿名類的物件。
*靜態內部類
一個靜態內部類中可以宣告static成員,但是在非靜態內部類中不可以宣告靜態成員;靜態內部類不可以使用外部類的非靜態成員;如果建立靜態內部類的物件,不需要其外部類的物件;StaticInnerClass$Inner表示Inner是StatiInnerClass的一個內部類
當try程式碼塊中的語句發生異常時,程式就會調轉到catch程式碼塊中執行,執行完catch程式碼塊中的程式程式碼後,將繼續執行catch程式碼塊後的其他程式碼,而不會執行try程式碼塊中發生異常語句後面的程式碼。由此可知,Java的異常處理是結構化的,不會因為一個異常影響整個程式的執行。
throws關鍵字通常被應用在宣告方法時,用來指定方法可能丟擲的異常;throw關鍵字通常用於方法體中,並且丟擲一個異常物件。
*列舉型別其實也是一種類,如果在類內部建立列舉型別會被作為內部類使用,它相當於繼承與java.lang.Enum類,當定義一個列舉型別時,每一個列舉型別成員都可以看作是列舉型別的一個例項,這些列舉型別成員都預設被final,public,static修飾,所以當使用列舉型別成員時直接使用列舉型別名稱呼叫列舉型別成員即可。
*在java中ArrayList<E>,HashMap<K,V>,HashSet<E>,Vector<E>這些集合框架已經被泛型化了,可以直接例項化,例如:ArrayList<Integer> array=new ArrayList<integer>():
*限制泛型可用型別
1.class 類名稱<T extends anyClass>
2.使用型別萬用字元
泛型類名稱<? extends List>a=null;
3.繼承泛型類和實現泛型介面
*泛型的型別引數只能是類型別,不可以是簡單型別,如A<int>這種泛型定義就是錯誤的
*流是一組有序的資料序列,根據操作的型別,可分為輸入流和輸出流兩種。I/O流提供了一條通道程式,可以使用這條通道把源中的位元組序列送到目的地。