Java基礎加強_JDK1.5新特性


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.枚舉只有一個成員時,可以用單例設計模式實現。






發佈了57 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章