JDK1.5新特性 靜态導入
靜态導入和非靜态導入的差別 : 顧名思義 import語句可以導入一個類或某個包中的所有類
import static語句導入一個類中的某個靜态方法或所有靜态方法,另外靜态導入比非靜态導入更加簡化了代碼的書寫
靜态導入的範圍不同,那麼導入的靜态方法的範圍也不同 例如: import static java.lang.*;此處導入的是lang包中的所有靜态方法 import static java.lang.math.*;此處導入的是math類下的所有靜态方法
代碼示例:
package com.learn;
import static java.lang.Math.*;
public class Demo
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
int a = 5;
int b = 9;
System.out.println(max(a,b));
}
}
可變參數 可變參數用于解決一個方法中傳入相同類型的不同參數的問題 可變參數的變量是數組類型,如果要使用可變參數中的值,需要周遊其中的元素
可變參數的特點:
隻能出現在參數清單的最後;這個要記住
...位于變量類型和變量名之間,前後有無空格都可以;
調用可變參數的方法時,編譯器為該可變參數隐含建立一個數組,在方法體中以數組的形式通路可變參數。
package com.learn;
public class Demo2
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
System.out.println(sum(1,2,3,4,5));
}
public static int sum(int...a)
{
int b = 0;
for (int i = 0; i < a.length; i++)
{
b +=a[i];
}
return b;
}
}
增強for循環
文法:
for ( type 變量名:集合變量名 ) { … }
注意事項:
疊代變量必須在( )中定義!
集合變量可以是數組或實作了Iterable接口的集合類
增強for循環和普通for循環的差別:
1.定義格式不同:增強for循環中,定義一個變量用于存儲每次周遊到的元素 普通for循環中,可以定義一個循環增量,來記錄循環的次數 2.增強for循環必須有周遊的目标 普通for循環相對靈活一些
包裝類(将基本資料類型封裝成對象)
JAVA語言是一門面向對象的語言,這裡一切都是對象,是以這裡的基本資料類型也包裝成了對象,友善程式員的操作
基本資料類型和包裝類之間的轉換:
基本類型變量-->包裝類對象:通過new WrapperClass(primitive)建立 包裝類對象-->基本類型變量:通過WrapperInstance.xxxvalue()方法
基本資料類型的自動拆箱與裝箱
自動裝箱: Integer num1 = 12; 自動拆箱: System.out.println(num1 + 12);
基本資料類型的對象緩存:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2); 這塊相等,<=127都是真的
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4); 當Integer的執行個體對象大于127時,将會重新建立一個Integer執行個體,是以不相等
枚舉
枚舉類概述:
java5新增了一個enum關鍵字(它與class,interface關鍵字的地位相同,作用相似),用以定義枚舉類。枚舉是一個特殊的類,它的内部一樣可以定義Filed、方法、構造函數,可以實作一個或者多個接口。一個java源檔案中最多隻能定義一個public通路權限的模具類,且該java源檔案也必須和該枚舉類的類名相同。
枚舉類和普通類的差別:
1.枚舉類可以實作一個或多個接口,使用enum定義的枚舉類預設繼承了java.lang.Enum類,普通類是直接繼承Object類的。同時Enum類實作了Serializable和Comparable兩個接口,也就是說,enum類可以調用Enum中的方法和複寫Serizlizable和Comparable接口中的抽象方法; 2.使用enum定義、非抽象的枚舉類預設會使用final修飾,是以枚舉類不能被繼承,也就是沒有子類。 3.枚舉類的構造器隻能使用private修飾符,如果省略了構造器的通路控制符,則預設使用private修飾。 4.枚舉類的所有執行個體必須在枚舉類的第一行顯示列出,否則這個枚舉類永遠不能産生執行個體。列出這些執行個體時,系統會自動添加public static final修飾,無需程式員顯示添加。
枚舉的作用:
枚舉就是要讓某個類型的變量的取值隻能為若幹個固定值中的一個,否則,編譯器就會報錯。 枚舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變量的方式在開發階段無法實作這一目标。
普通類實作枚舉功能步驟:
1.私有的構造函數 2.每個元素分别用一個公有的靜态成員變量表示 public static final 3.可以有若幹公有方法或抽象方法。
代碼示例:
package com.learn;
public class SeasonTest
{
/**
* @param args
* 1.私有的構造函數
* 2.每個元素分别用一個公有的靜态成員變量表示 public static final
* 3.可以有若幹公有方法或抽象方法。
* 定義季節的枚舉類
*/
public SeasonTest(Season s)
{
//建立該類的構造函數
System.out.println("季節:"+s.getName());
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
//建立對象,傳入Season類中的靜态常量
new SeasonTest(Season.AUTUMN);
}
}
class Season
{
private String name;
//因為季節對象是固定的四個季節,是以使用final分别定義四個季節常量
public static final Season SPRING = new Season("春天");
public static final Season SUMMER = new Season("夏天");
public static final Season AUTUMN = new Season("秋天");
public static final Season WINTER = new Season("冬天");
//用private将構造函數隐藏
private Season(String name)
{
// TODO Auto-generated constructor stub
this.name = name;
}
public String getName()
{
return name;
}
}
使用枚舉類更新上面程式
package com.learn;
//此處enum類如果修飾符是public,必須單獨寫一個類檔案
enum Season1
{
//枚舉類的素有示例必須寫在該類的第一行
//SPRING("春天")是這樣寫法的簡寫:
//publi static final SPRING = new Season("春天");
SPRING("春天"),SUMMER("夏天"),AUTUMN("秋天"),WINTER("冬天");
private String name;
private Season1(String name)//使用private隐藏枚舉中的構造方法
{
this.name = name;
}
public String getName()
{
return name;
}
}
public class SeasonTest2
{
SeasonTest2(Season s)
{
System.out.println("季節:"+s.getName());
}
public static void main(String[] args)
{
new SeasonTest2(Season.AUTUMN);
}
}
Java.lang.Enum類中常用的方法
Enum values():傳回枚舉類中的元素 int ordinal():傳回枚舉值在類中的索引值,其實就是角标,從零開始 public static<Textends Enum<T>> T valueOf(Class<T> enum Type,String name):傳回指定枚舉類中的指定枚舉值
枚舉中的抽象方法
package com.learn;
public class TrafficLamp
{
/**
* @param args
*/
public TrafficLamp(Lamp l)
{
System.out.println(l);
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
new TrafficLamp(Lamp.GREEN);
}
public enum Lamp
{
//枚舉類的抽象方法
/*相當于
public static final RED = new Lamp的子類(40)
{
public Lamp returnLamp()
{
return YELLOW;
}
}
簡寫
*/
RED(40)
{
public Lamp returnLamp()
{
return YELLOW;
}
},
GREEN(60)
{
public Lamp returnLamp()
{
return RED;
}
},
YELLOW(3)
{
public Lamp returnLamp()
{
return GREEN;
}
};
private int time;
//每個執行個體實作該抽象方法
public abstract Lamp returnLamp();
private Lamp(int time)
{
this.time = time;
}
}
}
總結: 1.枚舉類中的執行個體變量都是靜态的,是以都可以使用枚舉類名直接調用。 RED完整形式: public static final RED = new Lamp(int time);
2.編譯上面的程式,可以看到生成了TrifficLamp$Lamp$1.class,TrifficLamp$Lamp$2.class,TrifficLamp$Lamp$3.class,TrifficLamp$Lamp.class四個檔案,這說明RED,YELLOW,GREEN三個類是Lamp的匿名子類的執行個體
3.枚舉隻有一個成員時,可以用單例設計模式實作。