1.5新特性靜態匯入、增強for、可變引數、自動裝箱拆箱、列舉
第一 靜態匯入
一、概述:
1、import語句:是匯入一個類或某個包中的所有類。
2、import static語句:匯入一個類中的某個靜態方法或所有靜態方法。
3、特點:簡化了書寫,但是程式碼的閱讀性較差。
import static java.lang.Math.*;
/*
* 1.5新特性
* 靜態匯入
*/
public class StaticImport {
public static void main(String[] args) {
System.out.println(abs(3 - 6));
}
}
第二 增強for迴圈
一、概述
1、語法:for(可加修飾符 type 變數名 : 集合){statement}
2、注意:迭代變數必須定義在()中,集合必須是實現Iterable介面的集合類,變數型別前可加修飾符,如final(可被區域性內部類訪問到)。
/* * 1.5新特性 * * 增強for迴圈 * 格式:for(可以新增修飾符 type 變數名 :集合){} * 這裡的集合必須是實現了Iterable */ public class EnhanceFor { public static void main(String[] args) { System.out.println(variableParameter(1, 2, 5, 8, 6)); } /* * 可變引數的方法 可變引數只能放與最後 */ public static int variableParameter(int x, int... arr) { int sum = 0; // 可變引數其實內部封裝了陣列,按照陣列方式取值 for (int num : arr) { sum += num; } return sum; } }
第三 可變引數
一、概述:所謂的可變引數就是引數個數不固定,就是方法的過載。
二、特點:
1、只能出現在引數列表的最後。
2、用…這三個點表示引數可以有很多,且這三個點位於變數型別和變數名之間,前後有無空格皆可。
3、呼叫可變引數的方法時,編譯器為該可變引數隱含建立一個數組,在方法體中以陣列的形式訪問可變引數。
/* * 1.5新特性 * * 可變引數 */ public class VariableParameter { public static void main(String[] args) { System.out.println(variableParameter(1, 2, 5, 8, 6)); } /* * 可變引數的方法 * 可變引數只能放與最後 */ public static int variableParameter(int x, int... arr){ int sum = 0; //可變引數其實內部封裝了陣列,按照陣列方式取值 for(int i=0; i<arr.length; i++){ sum += arr[i]; } return sum; } }
四 自動裝箱拆箱
一、概述:
1、自動裝箱:Integer i = 3;
2、自動拆箱:i + 2;
3、對於基本資料型別的說明:整數在-128 ~ 127之間的數,包裝成Integer型別物件,會存入常量池中的快取,再建立同一個物件的時候,會直接使用前一個已有的值,因為這些小數值使用的頻率很高,所以這些數值需要如此的使用以優化記憶體。
/*
* 1.5新特性:
* 自動裝箱和拆箱
*/
public class AutoBox {
public static void main(String[] args) {
Integer i = 123;//自動裝箱
System.out.println(i);//自動拆箱
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);
/*
* 享元模式:
* 就是將小的,經常用的放在常量池中,可供分享,這樣就不用建立那麼多物件,優化記憶體
* 如正數的-128~127
*/
Integer i5 = Integer.valueOf(50);
Integer i6 = Integer.valueOf(50);
System.out.println(i5 == i6);
Integer i7 = Integer.valueOf(-158);
Integer i8 = Integer.valueOf(-158);
System.out.println(i7 == i8);
}
}
4、享元模式(flyweight):
1)概述:如果很多很小的物件,他們有很多相同的屬性,那麼就可變為一個物件使用,這些屬性稱為內部狀態,還有些不同的屬性,作為方法引數植入,這些稱為外部狀態。這種優化記憶體,只建立一個物件的模式,稱之為享元模式。
2)應用:
①、word中輸入英文字母,可建立26物件,每個物件值是出現的位置不同(座標),所以可用一個物件呼叫位置的方法:如,字母i:i.display(intx,int y),將高度重複使用的char型別的字母i封裝成一個物件使用。
②、圖示:window下的資料夾圖示,只喲名稱這個屬性不同,包含了很多其他相同的屬性,那麼可以應用享元模式。
第五 列舉
一、概述:1、在實際程式設計中,往往存在著這樣的“資料集”,它們的數值在程式中是穩定的,而且“資料集”中的元素是有限的。例如星期一到星期日七個資料元素組成了一週的“資料集”,春夏秋冬四個資料元素組成了四季的“資料集”。而在java中就是通過列舉對特定的"資料集"進行限定的。
2、列舉的作用:一些程式在執行時,它需要的資料不是任意的,而是必須在一定範圍內的值舉例說明,沒有列舉的時候,就是通過自定義類來實現限定的,類似下面列印成績的程式,但是成績只有ABCDE五個等級,所以需要對其進行限定。
//沒有列舉的時候:
class Demo{
public void test(){
print(Gread.B);
}
public void print(Gread g){
//列印成績,只能接收ABCDE
}
}
class Gread{
private Gread(){}
public static final Gread A = new Gread();
public static final Gread B = new Gread();
public static final Gread C = new Gread();
public static final Gread D = new Gread();
public static final Gread E = new Gread();
}
有了列舉:
enum Gread{
A,B,C,D,E;
}
首先不明白不要緊,但是直觀的效果就是簡化了書寫,讓程式碼更加簡單了。其實列舉簡單的說就是限定條件,讓特定的“資料集”不會超出預定的範圍。
enum很像特殊的class,實際上enum宣告定義的型別就是一個類,而且是一個不可被繼承的final類,其中的元素都是類靜態常量。而這些類都是類庫中Enum類的子類(java.lang.Enum<E>)。它們繼承了這個Enum中的許多有用的方法
二、列舉的特徵及用法:
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
WeekDay2 weekday2 = WeekDay2.MON;
System.out.println(weekday2.nextDay());
WeekDay weekday = WeekDay.FRI;
System.out.println(weekday);
System.out.println(weekday.name());
System.out.println(weekday.ordinal());
System.out.println(WeekDay.valueOf("SUN"));
System.out.println(WeekDay.values().length);// WeekDay.values(),返回陣列
TrafficLamp tf = TrafficLamp.GREEN;
System.out.println(tf);
}
// (內部類)定義星期
public enum WeekDay {
SUN(1), MON(1, 1), TUE, WED, THL, FRI, SAT;// 元素列表
// 其他成員只能放於元素列表之後
private WeekDay() {
System.out.println("first");
}
private WeekDay(int day) {
System.out.println("second");
}
private WeekDay(int day, int d) {
System.out.println("third");
}
}
// 定義交通燈
public enum TrafficLamp {
// RED,GREEN,YELLOW;
// 子類實現父類的抽象方法
RED(30) {//呼叫建構函式,並覆蓋父類中的抽象方法
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(40) {
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5) {
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
private int time;
// 構造方法
private TrafficLamp(int time) {
this.time = time;
}
//抽象方法,子類必須實現
public abstract TrafficLamp nextLamp();
}
}
1、構造器:
1)構造器只是在構造列舉值的時候被呼叫。
2)構造器只有私有private,絕不允許有public構造器。這樣可以保證外部程式碼無法重新構造列舉類的例項,因為列舉值是public static final的常量,但是列舉類的方法和資料域是可以被外部訪問的。
3)構造器可以有多個,呼叫哪個即初始化相應的值。
2、所有的列舉類都繼承了Enum方法,方法如下:
1)toString() ---> 返回列舉量的名稱
2)ordina() ---> 返回列舉值在列舉類中的順序,按定義的順序排
3)getClass() ---> 獲取對應的類名
靜態方法:
1)valueOf(String e) ---> 轉為類中對應的物件,即將字串轉為物件
2)values() ---> 獲取陣列,將元素放入一個數組中。
三、注意:
1、元素列表即所有的元素專案,必須放在整個類的最前面。
2、元素列表後要可有可無分號,但是元素後面還有其他專案時,必須加上分號。
3、列舉類中的方法為private
4、在元素後跟上(),就可指定要使用的構造方法,含引數。
5、列舉類中的每個元素都是它的一個子類物件,當列舉類中存在abstract方法,須在子類後加{},並在其中實現此方法。
四、總結:
1、匿名內部類比較常用
2、類的方法返回的型別可以是類的型別
3、類中可定義靜態常量,常量的結果就是自己這個型別的例項物件
4、如果列舉只有一個成員,就可以作為一種單例的實現方式,物件只有一個。