java基礎總結大全jdk1.5的新特性

java基礎總結大全jdk1.5的新特性

(1)靜態導入

(2)可變參數

(3)增強for循環

(4)基本數據類型的自動裝箱和拆箱

(5)枚舉

(6)泛型

方法/步驟

靜態導入:

**import語句可以導入一個類或某個包中的所有類

**import static語句導入一個類中的某個靜態方法或所有靜態方法

靜態導入後,靜態方法前面就不用寫類名.方法的方式類調用

**語法舉例:

import static java.lang.Math.sin;//導入一個靜態方法

import static java.lang.Math.*; //導入一個類中的所有靜態方法

**靜態導入使用注意:

當類名重複時,需要制定具體的包名;

當方法重名時,需要制定具體所屬的對象或者類

可變參數:

**可變參數的特點:

*可變參數只能出現在參數列表的最後;

*...位於變量類型和變量名之間,前後有無空格都可以;

*調用可變參數的方法時,編譯器為該可變參數隱含創建一個數組,

在方法體中以數組的形式訪問可變參數。

**可變參數舉例:

*變量類型... 變量名 如 int... arr 表示可變參數數組

*public static void show(String str , int... arr){}

增強for循環:

**語法:

for ( type 變量名:集合變量名 )  { … }

**注意事項:

疊代變量必須在( )中定義!

集合變量可以是數組或實現了Iterable接口的集合類

**舉例:

public static int add(int x,int ...args) {

int sum = x;

for(int arg:args) {

sum += arg;

}

return sum;

}

**增強for循環代替了疊代器使用的不爽,簡化書寫

**增強for循環局限性:

對集合或者數組進行遍歷時,只能取元素,不能對集合進行操作

基本數據類型的自動裝箱和拆箱

**基本數據類型

byte ---> Byte

short ---> Short

int ---> Integer

long ---> Long

float ---> Float

double ---> Double

char ---> Character

boolean ---> Boolean

**例子:

**裝箱:自動把一個基本數據類型的數據裝箱成一個該類型數據的對象引用

Integer i = 3;(jdk1.5之前這樣寫是不行的,編譯報錯)

**拆箱:自動把一個基本數據類型的對象引用拆箱成一個基本數據類型的數據,再參與運算

Integer i = 12;

sop(i+4);

**享元模式:

Integer num1 = 12;

Integer num2 = 12;

System.out.println(num1 == num2);//列印true

Integer num5 = Integer.valueOf(12);

Integer num6 = Integer.valueOf(12);

System.out.println(num5 == num6);//列印true

Integer num3 = 129;

Integer num4 = 129;

System.out.println(num3 == num4);//列印false

為什麼前面的返回true而後面的運算返回false呢?

對於基本數據類型的整數,裝箱成Integer對象時,如果該數值在一個字節內,(-128~127),

一旦裝箱成Integer對象後,就把它緩存到磁裡面,當下次,又把該數值封裝成Integer對象時

會先看磁裡面有沒有該對象,有就直接拿出來用,這樣就節省了內存空間。因為比較小的整數,

用的頻率比較高,就沒必要每個對象都分配一個內存空間。

這就是享元模式!比如26個英文字母,10個阿拉伯數字

枚舉

**為什麼要有枚舉?

問題:要定義星期幾或性別的變量,該怎麼定義?假設用1-7分別表示星期一到星期日,

但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。

枚舉就是要讓某個類型的變量的取值只能為若干個固定值中的一個,否則,編譯器就會報錯。

枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,

普通變量的方式在開發階段無法實現這一目標。

**用普通類如何實現枚舉的功能?定義一個Weekday類來模擬實現:

步驟:

*私有化構造方法

*每個元素分別用一個公有的靜態成員變量表示(public static final)

*可以有若干公有方法或抽象方法。採用抽象方法定義nextDay就將大量的if.else語句

轉移成了一個個獨立的類。

**枚舉的應用:

舉例:定義一個Weekday的枚舉。

擴展:枚舉類的values,valueOf,name,toString,ordinal等方法

(記住,講課時要先於自定義方法前介紹,講課更流暢)

總結:枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象。

例如可以調用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。

**枚舉的高級應用:

**枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。

**枚舉元素必須位於枚舉體中的最開始部分,枚舉元素列表的後要有分號與其他成員分隔。

把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。

**帶構造方法的枚舉

構造方法必須定義成私有的

如果有多個構造方法,該如何選擇哪個構造方法?

枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。

**帶方法的枚舉

定義枚舉TrafficLamp

實現普通的next方法

實現抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,

這些子類採用類似內部類的方式進行定義。增加上表示時間的構造方法

**枚舉只有一個成員時,就可以作為一種單例的實現方式。

泛型:

**泛型是提供給javac編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住源程序中的非法輸入,

編譯器編譯帶類型說明的集合時會去除掉「類型」信息,使程序運行效率不受影響,

對於參數化的泛型類型,getClass()方法的返回值和原始類型完全一樣。

由於編譯生成的字節碼會去掉泛型的類型信息,只要能跳過編譯器,

就可以往某個泛型集合中加入其它類型的數據,例如,用反射得到集合,再調用其add方法即可。

**ArrayList<E>類定義和ArrayList<Integer>類引用中涉及如下術語:

整個稱為ArrayList<E>泛型類型

ArrayList<E>中的E稱為類型變量或類型參數

整個ArrayList<Integer>稱為參數化的類型

ArrayList<Integer>中的Integer稱為類型參數的實例或實際類型參數

ArrayList<Integer>中的<>念著typeof

ArrayList稱為原始類型

**參數化類型與原始類型的兼容性:

參數化類型可以引用一個原始類型的對象,編譯報告警告,

例如,Collection<String> c = new Vector();//可不可以,不就是編譯器一句話的事嗎?

原始類型可以引用一個參數化類型的對象,編譯報告警告,

例如,Collection c = new Vector<String>();//原來的方法接受一個集合參數,新的類型也要能傳進去

**參數化類型不考慮類型參數的繼承關係:

Vector<String> v = new Vector<Object>(); //錯誤!///不寫<Object>沒錯,寫了就是明知故犯

Vector<Object> v = new Vector<String>(); //也錯誤!

編譯器不允許創建泛型變量的數組。即在創建數組實例時,

數組的元素不能使用參數化的類型,

例如,下面語句有錯誤:

Vector<Integer> vectorList[] = new Vector<Integer>[10];

**泛型限定:

**限定通配符的上邊界:

正確:Vector<? extends Number> x = new Vector<Integer>();

錯誤:Vector<? extends Number> x = new Vector<String>();

**限定通配符的下邊界:

正確:Vector<? super Integer> x = new Vector<Number>();

錯誤:Vector<? super Integer> x = new Vector<Byte>();

**提示:

限定通配符總是包括自己。

?只能用作引用,不能用它去給其他變量賦值

Vector<? extends Number> y = new Vector<Integer>();

Vector<Number> x = y;

上面的代碼錯誤,原理與Vector<Object > x11 = new Vector<String>();相似,

只能通過強制類型轉換方式來賦值。

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場