天天看點

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