天天看點

java--------學習之《JDK1.5新特性,枚舉,反射機制》Java(JDK1.5新特性:基本資料自動拆裝箱及享元設計模式)

Myeclipse于eclipse的差別:

    eclipse是開發java的一款專業ide,它本身就是由java程式所開發,myeclipse本身是eclipse的插件(用于開發javaee的平台),後來myeclipse把eclipse內建進去了,是以本人自己了解Myeclipse是一個加強版的Eclipse。

java(JDK1.5新特性:靜态導入)

好處:靜态導入後,可以在不寫類名的情況下,直接調用自己所導入類裡面已經定義好了的類方法。提高的代碼編寫的效率,

代碼示範:

//非靜态導入的代碼:
public class TestStatic{   
	public static void main(String[] args){   
      		System.out.println(Integer.toHexString(42)); 
   	}
}
//靜态導入之後的代碼:
import static java.lang.System.out;
public class TestStaticImport {
	public static void main(String[] args){
	      out.println(Integer.toHexString(42));  
	}
}
           

java (JDK1.5新特性:可變參數和增強for循環)

适用于參數個數不确定,類型确定的情況。

調用可變參數的方法時,編譯器為該可變參數隐含建立一個數組。

注意:可變參數必須寫在參數清單的最後面。

可變參數結合增強for代碼示範:

public class VarableParameter
{
    public static void main(String[] args)
    {
        System.out.println(add(1,2,3,5,6,8,9,10));
<span style="white-space:pre">	</span>System.out.println(add(4,5,8,10));
    }
    <span style="white-space:pre">	</span>//當參數類表的最後,變量類型和和變量名出現了...這個就是一個可變參數,
<span style="white-space:pre">	</span>//它能接收不确定個數的參數,但是确定變量類型
    public static int add(int x,int...args)
    {
        int sum = x;
        //調用可變參數的方法時,編譯器為該可變參數隐含建立一個數組,
        //在方法體中以數組的形式通路可變參數,那麼我們就用到了周遊數組來進行操作。
        //是以就用到了增強for
        for(int arg : args)
        {
            sum+= arg;
        }
        return sum;
    }
}
           

Java(JDK1.5新特性:基本資料自動拆裝箱及享元設計模式)

例如:

    Integer iObj = 3;//這個在1.5之前是非法操作,編譯不通過的,

    然而1.5開始:基本類和基本資料類型可以無需轉換直接參與計算

那麼在程式中,兩個Integer對象的值都為3,但是它們比較的結果為true,但是數值一旦超過-128~127這個範圍時,比較結果為false。

這時就涉及到了java的享元設計模式了(flyweight)

因為小的數字重複使用的頻率比大的資料高,如果一出現就封裝成對象,那麼最後對象越來越多,占用的記憶體會顯得很臃腫,而把這些重複屬性的對象(數值在一個位元組之内-128~127之間時)進行封裝成一個對象,它就在記憶體中隻占用一個對象的空間,而把它們不同的屬性變成方法的參數傳遞進來進行操作,實作共享。

代碼示範:

public classAutoBox
{
    public static void main(String[] args)
    {
        //自動裝箱
        IntegeriObj = 3;
        //自動拆箱
        System.out.println(iObj + 12);
       
        Integeri1 = 13;
        Integeri2 = 13;
        System.out.println(i1 == i2);
        //兩個對象對比的結果是true
        //如果超出數值在一個位元組之内-128~127之間時就會為false
    }
}
           

java(JDK1.5新特性:枚舉)

作用: 枚舉就是要讓某個類型的變量的取值隻能為若幹個固定值中的一個,否則,編譯器就會報錯。 

枚舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變量的方式在開發階段無法實作這一目标

Java中的枚舉并不是簡單常量的集合,而是一個對象,其本質依然是類,是以Java中的枚舉除了提供一系列相關值以外,還提供了一些額外功能,甚至還可以根據需要自行添加一些功能

代碼示範:

public classEnumTest {
    public static void main(String[] args){
       
    //WeekDay1 weekDay = WeekDay1.MON;
    //System.out.println(weekDay.nextDay());
   
    WeekDayweekDay2 = WeekDay.FRI;
    System.out.println(weekDay2);//預設就是擷取對象的名稱
    System.out.println(weekDay2.name());//也可以指定用name方法,擷取對象的名稱
    System.out.println(weekDay2.ordinal());//這個變量對應引用類型的排序位置,從0開始排的
    System.out.println(WeekDay.valueOf("SAT"));//根據字元串封裝為對象
    System.out.println(WeekDay.values().length);//得到枚舉類中的所有的枚舉元素長度,并用增強for循環周遊
   
   
   
    }
    //enum可以了解成為是特殊的class,
    //它也可以有自己的變量,可以定義自己的方法,可以實作一個或者多個接口。
    public enum WeekDay{
        //元素清單必須位于枚舉類的最前面
        SUN,MON,TUE,WED,THI,FRI,SAT;
        //枚舉的構造方法必須是私有private的
        private WeekDay(){System.out.println("first");}
        private WeekDay(int day){System.out.println("sencond");}
    }
   
    public enum TrafficLamp{
        RED(30){
            public TrafficLamp nextLamp(){
                return GREEN;
            }
        },
        GREEN(45){
            public TrafficLamp nextLamp(){
                return YELLOW;
            }
        },
        YELLOW(5){
            public TrafficLamp nextLamp(){
                return RED;
            }
        };
        public abstract TrafficLampnextLamp();
        private int time;
        private TrafficLamp(int time){this.time=time;}
    }
}
 
           

反射的基石-àClass類(此特性從JDK1.2就開始出現了。)

java程式中的各個java類屬于同一類事物,那麼這類事物就稱之為Class類。

詳細的的說Class類就是描述記憶體中的位元組碼檔案的,該類的對象就是記憶體中加載的位元組碼檔案。

擷取Class類常見的幾種方式

    ClassforName(“String”);  //通過字元串的形式擷取Class對象。

    類名.class;                //直接通過類名擷取Class對象。

    new Object().getClass();   //通過對象調用getClass方法擷取Class對象。

反射的作用是把類中的各種成分,映射到相應的類,

擷取Constructor類對象(代表某一個類中的構造函數)

代碼示範:

//擷取這個類的所有構造方法。

Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();

//擷取某一個構造方法:

Constructor constructor = String.class.getConstructor(StringBuffer.class);

擷取Field類對象(代表擷取一個類中的某一個成員變量)

代碼示範:

//假設有一個ReflectPoint類,裡面有x和y變量類型為int類型,而且都具備了get

//方法,擷取其中一個變量并列印

ReflectPoint point = new ReflectPoint(4,9);

Field fieldX = point.getClass().getField(“x”);

System.out.println(fieldX.get(point));

擷取Method類對象(代表擷取一個類中的某個成員方法)

代碼示範  

//擷取這個類的一個成員方法

//定義一個字元串變量,并且設值。

String x = “abc”;

Method  methodCharAt =String.class.getMethod(“charAt”,int.class);

System.out.println(methodCharAt.invoke(a,1));

數組的反射

數組的Class對象:具有相同的元素類型和相同的次元代表是相同的Class執行個體對象。

數組的Class對象調用getSuperClass可以傳回一個父類對應的Class類型對象。

基本類型的一維數組可以被當做Object類型使用,不能當做Object[]類型使用,非基本類型的一維數組,既可以當做Object類型使用,又可以當做Object[]類型使用。

反射的價值

Java中工具類是被使用者所調用,而架構是調用使用者提供的類。要實作架構這種功能,就必須要解決:無法知道使用者類的名稱,不能建立使用者類的對象這些問題,那麼就需要通過反射的方式來解決。