天天看點

JavaSE 拾遺(15)——JavaSE 高新技術基礎增強...java5簡單新特性和枚舉

JavaSE 高新技術基礎增強有下面的内容

  • 第2單元:eclipse開發工具
  • 第3單元:java5的一些簡單新特性
  • 第4單元:java5的枚舉
  • 第5單元:反射的深入講解
  • 第6單元:java5的注解
  • 第7單元:java5的泛型
  • 第8單元:類加載器的深入講解與應用
  • 第9單元:動态代理技術的深入講解

1.eclipse 開發工具

  • eclipse 及 IDE開發工具介紹
  • eclipse工程管理與快捷鍵配置
  • eclipse視圖管理與程式調試
  • 配置eclispe的編譯與運作環境
  • 在eclispe中配置java模闆代碼
  • 在eclipse中導入已有的工程

java preference 的配置和 workspace  是一一對應的,一旦 workspace 改變,配置将改變,在 workspace 裡面還有和各種開發語言一一對應的配置 

Java 模闆的配置,模闆是跟語言相關的,是以在 Preference ——> Java ——> Editor ——> Templetes 裡面配置 Java 的模闆

2.java5的一些簡單新特性

  • java5的靜态導入與編譯器文法設定
  • 可變參數與OverLoad相關面試題分析
  • java5的增加for循環
  • 基本資料的自動拆裝箱及享元設計模式

java5 的靜态導入

/**
 * 需求:示範靜态導入的使用
 * 
 * 思路:
 * 
 * 步驟:
 * 
 * 總結:
 * 靜态導入是 xxx,用來做 xxx,為什麼有靜态導入,靜态導入為什麼是這樣
 * 
 * 1.靜态導入是 xxx
 * 概念: 靜态的導入類中的靜态成員
 * 格式: import static 包名.類名.靜态成員名;
 * 源代碼
 * 
 * 2.用來做 xxx(總結的角度)
 * 什麼情況下用、優點、缺點
 * 靜态導入,主要的作用是友善在使用某個類的靜态成員的時候,可以不用寫類名
 * , 直接使用成員名調用,好處是簡化書寫,設計類時可以把某些常量用接口封裝
 * 在一起, 使代碼看起來更整潔,弊端是引入了不必要的混淆,降低了代碼的閱讀性
 * 是以 java 中靜态導入的使用原則是:限制靜态導入的使用,不要在應用程式中普
 * 遍使用靜态導入。因為 java 作為一個計算機語言,最重要的作用就是要便于表達
 * 人的設計思想,以及便于人的閱讀。
 * 
 * 源代碼
 * 3.為什麼有 xxx,為什麼是這樣
 * 
 * 靜态導入————小乘佛法,是解決複雜度的問題,不是解決設計邏輯的可行性問題
 * 但是有的問題複雜度如果太高,也相當于不可以行。
 */
package cn.itcast.day1;

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

/**
 * @author vivianZhao
 * 
 */
public class StaticImport {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(abs(-5));
		System.out.println(max(3, 6));

	}

}
           

可變參數和Overload

/**
 * 需求:示範可變參數函數的使用
 *
 * 思路:
 *
 * 步驟:
 *
 * 總結:
 * 可變參數函數是 xxx,用來做 xxx,為什麼有可變參數函數,可變參數函數為什麼是這樣
 *
 * 1.可變參數函數是 xxx
 * 概念:可變參數函數就是函數定義時參數個數不定的,延遲确定參數個數到函數調用時的函數
 * 格式:類型 ... 參數名,比如 int ... args, ... 位于類型和參數名之間,有無空格都可以
 * 在以前參數定義的形式上加上...,
 * 使用注意:可變參數隻能出現在參數清單的最後
 * 源代碼:
 *
 * 2.用來做 xxx(總結的角度)
 * 什麼情況下用:在想要明确表示方法參數是相同類型的參數的個數可變(不定)的設計時用可變參數函數
 * 源代碼:
 *
 * 3.為什麼有可變參數函數,為什麼是這樣
 * 為了表達一個方法的參數清單中相同類型的參數的個數,在程式編寫時不固定(不确定)的設計,可以用數
 * 組參數來完成, 數組參數的定義形式 add(int [] parameterArr),在調用這個函數的時候,必須先建立
 * 一個數組作為實際參數。可變參數函數是數組參數函數的簡寫形式,調用可變參數的方法時,編譯器會為
 * 該可變參數隐含建立一個數組,在方法體中以數組的形式通路可變參數,是以可變參數簡化了這種參數不
 * 定的需求下的方法調用的書寫。又數組參數不隻可以表示參數可變的含義,是以可變參數的表達形式,使
 * 參數可變的含義更明确。
 * 在方法參數清單中的參數定義的時候,沒有出現過 ... 這種形式,而自然語言中...通常也用來表示等等
 * 的意思,是以可以在參數類型和參數名之間加...來表示可變參數是完全可以解析和了解的形式
 * 
 * 決定權反轉、決定時間反轉
 * 決定權反轉,主要強調的是擁有決定權的對象和被決定的對象反轉
 * 決定時間反轉,主要強調下決定的時刻改變,并且時刻具有先後性
 */
package cn.itcast.day1;

/**
 * @author vivianZhao
 *
 */
public class VariableParameter {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(add(1,2,3));
		System.out.println(add(1,2));
	}
	
	public static int add(int x, int ... args){
		int sum = x;
		for(int temp : args){
			sum += temp;
		}
		return sum;
	}
}
           

java5增強for循環

/**
 * 需求:示範增強型 for 循環
 * 
 * 思路:
 * 
 * 步驟:
 * 
 * 總結:
 * 增強型 for 循環是 xxx,用來做 xxx,為什麼有增強型 for 循環, 增強型 for 循環為什麼是這樣 
 * 1.增強型 for 循環是 xxx
 * 概念:用來對集合對象中的元素内容進行周遊的 for 循環,相當于 c# 中的 foreach(...in...)
 * 格式:for(集合中元素類型 變量名 : 集合對象){...}
 * 源代碼:
 * 使用注意:集合對象必須屬于實作了 Iterable 接口的類
 * 
 * 2.用來做 xxx
 * 增強型 for 循環用來周遊集合類對象中元素的内容
 * 優點:書寫簡單,表示周遊集合中元素内容的含義明确
 * 缺點:和普通 for 循環相比不能使用 Iterator 的方法
 * 
 * 3.為什麼有增強型 for 循環,增強型 for 循環為什麼是這樣
 * 因為周遊集合中元素的内容在程式中經常使用,是以單獨用一種結構來表達這種設計,是程式更加簡單明了。
 * 因為人們已經接受了 for each(... in ...) 的使用方法,for(... : ...) 相當于把 in 替換為了 : 符号。
 */
package cn.itcast.day1;

/**
 * @author vivianZhao
 *
 */
public class EnhanceFor {

	/**
	 * @param args
	 */
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(add(1,2,3));
	}
	
	public static int add(int x, int ... args){
		int sum = x;
		for(int temp : args){
			sum += temp;
		}
		return sum;
	}

}
           

基本資料的自動拆裝箱及享元設計模式

/**
 * 需求:示範自動裝箱拆箱和享元模式
 * 
 * 思路:
 * 
 * 步驟:
 * 
 * 總結:
 * 1.能做什麼
 * 自動裝箱拆箱,簡化了程式的書寫
 * 2.是什麼
 * 自動裝箱和拆箱,是指在 java 源程式中,編譯器 javac 把基本資料類型自動按運算符的需要裝換為相應基本資料類
 * 型的引用類型,比如把 int 類型資料 12,轉換為 (Integer)12;自動拆箱和裝箱剛剛相反,是指編譯器為了運算符的
 * 需要自動把引用類型的對象轉換為其對應的基本資料類型。
 * 3.為什麼是這樣
 * 
 * 表達式中資料類型的自動轉換,是由運算符的需求來決定的,運算符需要什麼類型,表達式結果的值就自動轉換為什麼
 * 類型
 * 
 * 享元模式 、flyweight 模式, flyweight 輕量級,顧名思義,輕量級就是讓記憶體的負擔減輕,共享某些必要的對象,
 * 就可以實作這個目的。是以也叫做享元模式。在基本資料類型的裝箱裡面就有使用了享元模式,對一個位元組表示的整形
 * 常量,裝箱後都是同一個對象。
 * 
 * 對于某些小的對象,他們有大部分屬性相同,一部分屬性不同,并且在程式運作過程中這些相同的屬性不會被改動,
 * 于是我們就把這些對象相同屬性封裝成一個對象,稱為對象的内部狀态,把不同屬性封裝成方法的參數,稱為外部狀态
 * ,這樣就可以隻為這些對象建立一個對象, 這就叫做享元模式。
 * 
 * 從 javap 反編譯可以知道,自動裝箱拆箱編譯器會處理就是調用 Integer.valueOf() 和 Integer.IntValue() 函數,
 * 對應 byte 範圍類的資料有享元模式功能,我想也是在這兩個函數中實作的
 * 
 */
package cn.itcast.day1;

/**
 * @author vivianZhao
 *
 */
public class BoxingAndUnboxing {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer iObj = 13;					// 自動裝箱
		System.out.println(iObj + 12);		// 自動拆箱
		
		int iVariable1 = 15;
		int iVariable2 = 15;
		Integer iObj1 = iVariable1;			
		Integer iObj2 = iVariable2;
		System.out.println(iObj1 == iObj2);	// 享元模式
		
		iVariable1 = 135;
		iVariable2 = 135;
		iObj1 = iVariable1;
		iObj2 = iVariable2;
		System.out.println(iObj1 == iObj2);	// 享元模式在整數裡面隻對 byte 範圍資料有效
		
		String s1 = "abc";
		String s2 = "abc";
		System.out.println(s1 == s2);		// 這裡也是享元模式
		
		String s3 = new String("abc");		// 這裡使用 new 了就會産生3個對象,1個在常量池,2個在堆中
		String s4 = new String("abc");
		System.out.println(s3 == s4);
	}

}
           
JavaSE 拾遺(15)——JavaSE 高新技術基礎增強...java5簡單新特性和枚舉

3.枚舉 Enumeration

  • 枚舉的作用介紹
  • 用普通類實作枚舉
  • java5的枚舉的基本應用
  • 實作帶有構造方法的枚舉
  • 實作帶有抽象方法的枚舉

枚舉的作用介紹

為什麼要有枚舉?

枚舉的用處:

 要定義星期幾或性别的變量,該怎麼定義?假設用1-7分别表示星期一到星期日,但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。如果把這種問題定義為 Exception 來提示使用代碼的人未免太麻煩,因為每一種這種類型的資料都要定義一個 Exception,為了友善程式員,Java 1.5 又重新支援 Enumeration,

枚舉是什麼: 枚舉就是要讓某個類型的變量的取值隻能為若幹個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變量的方式在開發階段無法實作這一目标。枚舉是一種特殊的類的簡寫的形式。

枚舉是一種特殊的類,是一種在類定義的時候我們就已經明确了該類的所有對象的資訊和限制的類。在類定義的時候就知道所有對象的名字和個數,是以在l類定義的是就建立好了對象。并且以後不讓再建立該類的對象。這種類我們完全可以用普通 class 來定義,但是為了簡潔、清晰、明了,我們專門設計了一種關鍵字 enum 來定義這種類,因為很多資訊已經固定,是以定義的文法上删掉了很多不必要的資訊,枚舉是這種類的一種特定的文法表達形式。

用普通類實作枚舉

用普通類如何實作枚舉功能,定義一個 Weekday 的類來模拟枚舉功能。

/**
需求:自定義一個 WeekDay 類,來模拟枚舉類的功能

思路:
1.枚舉類定義的變量,隻能取枚舉中的值,我們可以用普通類的對象來代替枚舉類中的值
2.如果不讓别人生成新的對象,我們可以把 WeekDay 類的構造函數私有化
3.在 WeekDay 中我們需要提供不同的值,讓其變量使用,是以需要定義 public static final 的變量來儲存 WeekDay 
對象

步驟:
*/
package cn.itcast.day1;

/**
 * @class: WeekDay
 * @package: cn.itcast.day1
 * @description: TODO
 * @author: vivianZhao
 * @date: 2013-7-19 下午6:37:51
 * @version: 1.0
 */
public class WeekDay {
	private WeekDay(){
		
	}
	
	public static final WeekDay SUN = new WeekDay();
	public static final WeekDay MON = new WeekDay();
}
           

這樣 WeekDay 也相當于一個 Enumeration 的類型了,可以使用 WeekDay.SUN 表示星期天,而且 WeekDay 類型的變量不能取其他值,隻能取 WeekDay 的成員。

執行個體:加上 next 和 toString 功能的 WeekDay

/**
需求:自定義一個 WeekDay 類,來模拟枚舉類的功能

思路:
1.枚舉類定義的變量,隻能取枚舉中的值,我們可以用普通類的對象來代替枚舉類中的值
2.如果不讓别人生成新的對象,我們可以把 WeekDay 類的構造函數私有化
3.在 WeekDay 中我們需要提供不同的值,讓其變量使用,是以需要定義 public static final 的變量來儲存 WeekDay 
對象
4.如果提供 next 方法,一種實作是在 next 方法中使用 if-else 判斷目前對象和那個成員 == ,另一種比較簡潔的實作
是使用内部類的方式,在每個成員對象内部重新 next 方法

步驟:

總結:
這裡示範了内部類巧妙的使用,把父類裡面大量的 if-else 語句轉換為一個個獨立的類
 */
package cn.itcast.day1;

/**
 * @class: WeekDay
 * @package: cn.itcast.day1
 * @description: TODO
 * @author: vivianZhao
 * @date: 2013-7-19 下午6:37:51
 * @version: 1.0
 */

public abstract class WeekDay {
	private WeekDay() {
	}

	public final static WeekDay MON = new WeekDay() {
		@Override
		public WeekDay next() {
			// TODO Auto-generated method stub
			return TUE;
		}

		public String toString() {
			return "MON";
		}
	};

	public final static WeekDay TUE = new WeekDay() {
		@Override
		public WeekDay next() {
			// TODO Auto-generated method stub
			return MON;
		}

		public String toString() {
			return "TUE";
		}
	};

/*	public WeekDay nexDay() {
		if (this == Mon) {
			return Tue;
		} else {
			return Mon;
		}

	}*/

	public abstract WeekDay next();

	public String toString() {
		return this == MON ? "MON" : "TUE";
	}
}
           

java5 的枚舉的基本應用

/**
 * 需求:示範 enum 的使用
 * 
 * 思路:定義一個 WeekDay 的枚舉類型,在 main 函數中示範枚舉類和枚舉對象相關的功能函數
 * 
 * 步驟:
 * 
 * 總結:
 * java 中枚舉和 c 中的枚舉功能一樣,但是實作原理不同, enum 定義的枚舉類,也是類,也有 Class 檔案,隻是是
 * 一種特殊的類,就像前面我們自己實作的枚舉類類似,enum 關鍵字隻是讓我們定義枚舉這種特殊的類更友善了,簡化
 * 了書寫,統一了功能函數
 * 1.枚舉類的功能函數
 * valueOf 根據字元串擷取枚舉類型值對象
 * values 擷取枚舉類型所有值對象構成的數組
 * 還有就是 Class 對象的功能
 * 
 * 2.枚舉類值對象的功能函數
 * name 擷取值對象的名字
 * ordinal 擷取值對象在枚舉類中的排名
 * 還有就是 Object 對象的功能
 */
package cn.itcast.day1;

/**
 * @class: EnumDemo
 * @package: cn.itcast.day1
 * @description: TODO
 * @author: vivianZhao
 * @date: 2013-7-19 下午8:38:39
 * @version: 1.0
 */
public class EnumDemo {

	/**
	 * @method: main
	 * @description: TODO
	 * @param args
	 * @return: void
	 * @author: vivianZhao
	 * @date: 2013-7-19 下午8:38:39
	 * @version: 1.0
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		WeekDay weekDay = WeekDay.MON;

		// 枚舉類值對象的功能函數
		System.out.println(weekDay);
		System.out.println(weekDay.name()); // 擷取值對象的名字
		System.out.println(weekDay.ordinal()); // 擷取值對象在枚舉類中的排名

		// 枚舉類的功能函數
		System.out.println(WeekDay.valueOf("MON")); // 根據字元串擷取枚舉類型值對象
		System.out.println(WeekDay.values()); // 擷取枚舉類型所有值對象構成的數組
	}

	public enum WeekDay {
		MON, TUE, WED, THU, FRI, SAT, SUN
	}
}
           

實作帶有構造方法的枚舉

/**
 * 需求:示範帶構造方法的  enum 類的使用
 * 
 * 思路:定義一個 WeekDay 的帶構造方法的枚舉類型,在 main 函數中示範帶鈎子方法的枚舉類
 * 
 * 步驟:
 * 
 * 總結:
 * 1.枚舉類中除了可以定義枚舉的值對象(成員變量),還可以定義和普通類一樣的構造方法、成員方法、成員變量
 * 2.如果枚舉類中除了枚舉值元素的定義,還要定義其他成員,那麼其他成員應該放在枚舉值元素定義的後面
 * 3.如果枚舉類中元素清單後面有成員定義,元素清單後面一定要加上分号,表示語句結束
 * 4.枚舉類中元素的建立時随枚舉類的加載而建立,建立枚舉類的值對象會調用枚舉類的預設構造函數
 * 5.如果枚舉類中顯示定義了構造函數,那麼構造函數必須是 private 修飾的
 * 6.如果枚舉類中定義了帶參數的構造函數,那麼可以通過在定義枚舉值變量的時候使用(),來指定相應的值對象要調用
 * 帶參數的構造函數,這相當于省略了該成員變量定義的部分結構,比如:
 *  public static final 枚舉類型 變量名 = new 枚舉類型()
 * 7.枚舉類型也是一個 Class ,隻是是特殊寫法的 Class,是以普通類中的東西,枚舉類中都可以有,隻是那樣的枚舉
 * 類用起來比較複雜。
 */
package cn.itcast.day1;

/**
 * @class: EnumDemo
 * @package: cn.itcast.day1
 * @description: TODO
 * @author: vivianZhao
 * @date: 2013-7-19 下午8:38:39
 * @version: 1.0
 */
public class EnumDemo {

	/**
	 * @method: main
	 * @description: TODO
	 * @param args
	 * @return: void
	 * @author: vivianZhao
	 * @date: 2013-7-19 下午8:38:39
	 * @version: 1.0
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		WeekDay weekDay = WeekDay.MON; //使用枚舉類才會加載枚舉類
	}

	public enum WeekDay {
		SUN, MON(2), TUE, WED(1), THI, FRI, SAT;

		private WeekDay() {
			System.out.print("first ");
		}

		private WeekDay(int day) {
			System.out.print("second ");
		}
	}
}
           

帶參數的構造方法,枚舉值變量的聲明相當于:  public static final 枚舉類型 變量名 = new 枚舉類型(實參表)

上面程式執行結果:

JavaSE 拾遺(15)——JavaSE 高新技術基礎增強...java5簡單新特性和枚舉

實作帶有抽象方法的枚舉

/**
 * 需求:示範帶抽象方法的  enum 類的使用
 * 1.需要一個交通燈類,交通燈對象的值隻能是交通燈的顔色 RED、YELLOW、GREEN
 * 2.每個顔色的交通燈都有一個保持時間
 * 3.每個交通燈都還有擷取它自身下一個顔色的交通燈的功能
 * 
 * 思路:定義一個 TrafficLamp 的帶抽象方法的枚舉類型,在 main 函數中示範帶構造方法的枚舉類
 * 1.交通燈有三個顔色,那麼可以使用枚舉類來限制交通燈對象的取值
 * 2.每個燈都有一個保持時間的屬性,那麼可以使用 int 類型成員變量來儲存該屬性
 * 3.每個燈都有擷取寫一個顔色燈的能力,那麼可以定義一個 nextLamp 函數來傳回下一個燈,由于在 TrafficLamp 類
 * 中實作該功能需要比較多的 if-else 判斷,是以可以轉換為内部類來實作,這就需要用到 enum 類中含有抽象函數的
 * 形式。就是在每個值變量定義的後面用 { } 實作父類的抽象函數。
 * 
 * 步驟:
 * 
 * 總結:
 * 帶抽象方法的  enum 類是什麼,為什麼
 * 帶有抽象方法的 enum 類是指在 enum 類定義的時候,類中帶有抽象的成員方法
 * 
 * 帶抽象方法的  enum 類有什麼用
 * 帶抽象方法的  enum 類,可以讓每個值變量在定義的時候使用内部類實作抽象方法,讓每個值對象擁有多态的成員方法
 * 
 */
package cn.itcast.day1;

/**
 * @class: EnumDemo
 * @package: cn.itcast.day1
 * @description: TODO
 * @author: vivianZhao
 * @date: 2013-7-19 下午8:38:39
 * @version: 1.0
 */
public class EnumDemo {

	/**
	 * @method: main
	 * @description: TODO
	 * @param args
	 * @return: void
	 * @author: vivianZhao
	 * @date: 2013-7-19 下午8:38:39
	 * @version: 1.0
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

	// 交通燈枚舉(帶有抽象方法)
	public enum TrafficLamp {
		REDLAMP(30) {
			public TrafficLamp nextLamp() {
				return GRRMLAMP;
			}
		},
		GRRMLAMP(30) {
			public TrafficLamp nextLamp() {
				return YELLOWLAMP;
			}
		},
		YELLOWLAMP(5) {
			public TrafficLamp nextLamp() {
				return REDLAMP;
			}
		};

		private TrafficLamp(int timp) {
			this.timp = timp;
		}

		private int timp; // 儲存交通燈保持的時間
		
		/**
		 * 
		 * @description: 擷取下一個顔色交通燈
		 * @param timp
		 * @author: vivianZhao
		 * @date: 2013-7-19 下午10:23:15
		 * @version: 1.0
		 */
		public abstract TrafficLamp nextLamp();

	}
}
           

帶内部類的枚舉值變量聲明相當于: public static final TrafficLamp REDLAMP = new TrafficLamp(40){

public TrafficLamp nextLamp() {

return GRRMLAMP;

}

} ;

用枚舉實作單例模式

枚舉類隻有一個成員的時候可以看做是單例模式的一種實作。

繼續閱讀