JAVA5的新特性總結


------- android培訓java培訓、期待與您交流! ----------
2-1 靜態導入
靜態導入可以導入靜態方法,這樣就不必寫類名而可以直接調用靜態方法了。

示例:
求3和6的最大值,以及3-6的絕對值並且打印出來,Java5以前的代碼如下:
StaticImport.java
package com.itheima.day1;

public class StaticImport {
       public static void main(String[] args) {
            System. out.println(Math.max(3,6));
            System. out.println(Math.abs(3-6));
      }
}

Java5以後的代碼如下:
StaticImport.java
import static java.lang.Math.max ;
import static java.lang.Math.abs ;

public class StaticImport {
       public static void main(String[] args) {
            System. out.println(max(3,6));
            System. out.println(abs(3-6));
      }
}
意:
1、也可以通過import static java.lang.Math.*;導入Math類下所有的靜態方法。
2、如果將javac設置爲了Java5以下,那麼靜態導入等jdk1.5的特性都會報告錯誤。

2-2 可變參數
問題:一個方法接受的參數個數不固定,例如:
System.out.println(countScore(2,3,5));
System.out.println(countScore(1,2,3,5));  
如果使用重載的方式解決需要寫多個重載的方法,而使用可變參數就可以避免這種情況。  

可變參數的特點:
·只能出現在參數列表的最後。
·...位於變量類型和變量名之間,前後有無空格都可以。
·調用可變參數的方法時,編譯器爲該可變參數隱含創建一個數組,在方法體中以數組的形式訪問可變參數。


示例:
VariableParameter.java
package com.itheima.day1;

public class VariableParameter {
       public static void main(String[] args) {
            System. out.println(add(1, 2));
            System. out.println(add(1, 2, 3));
      }
      
       public static int add(int x, int... args){
             int sum = x;
             for(int i = 0; i < args.length; i++){
                  sum += args[i];
            }
             return sum;
      }
}

2-3 增強for循環
語法:
for ( type 變量名:集合變量名 )  { … } 

注意事項:
迭代變量必須在( )中定義!
集合變量可以是數組或實現了Iterable接口的集合類。

示例:
VariableParameter.java
package com.itheima.day1;

public class VariableParameter {
       public static void main(String[] args) {
            System. out.println(add(1, 2));
            System. out.println(add(1, 2, 3));
      }
      
      public static int add(int x, int... args){
             int sum = x;
             for(int arg : args){
                  sum += arg;
            }
             return sum;
      }
}

2-4 基本數據類型的自動拆箱與裝箱
示例:
AutoBox.java
package com.itheima.day1;

public class AutoBox {
       public static void main(String[] args) {
             //裝箱
            Integer iObj = 3;
            
             //拆箱
            System. out.println(iObj + 12);
             //結果:15
            
            Integer i1 = 13;
            Integer i2 = 13;
            System. out.println(i1 == i2);
             //結果:true
            
            i1 = 137;
            i2 = 137;
            System. out.println(i1 == i2);
             //結果:false
      }
}
意:
如果有很多很小的對象,並且他們有相同的東西,那就可以把他們作爲一個對象。
如果還有很多不同的東西,那就可以作爲外部的東西,作爲參數傳入。
這就是享元設計模式(flyweight)。

例如示例中的Integer對象,在-128~127範圍內的Integer對象,用的頻率比較高,就會作爲同一個對象,因此結果爲true。超出這個範圍的就不是同一個對象,因此結果爲false。

2-5 枚舉
2-5-1 爲什麼要有枚舉?
問題:要定義星期幾或性別的變量,該怎麼定義?假設用1-7分別表示星期一到星期日,但有人可能會寫成int weekday = 0;或即使使用常量方式也無法阻止意外。
枚舉就是要讓某個類型的變量的取值只能爲若干個固定值中的一個,否則,編譯器就會報錯。
枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。

2-5-2 用普通類實現枚舉功能
·私有的構造方法。
·每個元素分別用一個公有的靜態成員變量表示。
·可以有若干公有方法或抽象方法。


示例:
WeekDay.java
package com.itheima.day1;

public class WeekDay {
      
       private WeekDay(){}
      
       public static final WeekDay SUN = new WeekDay();
       public static final WeekDay MON = new WeekDay();
      
       public WeekDay nextDay(){
             if(this == SUN){
                   return MON ;
            } else{
                   return SUN ;
            }
      }
      
       public String toString(){
             return this == SUN? "SUN":"MON" ;
      }
}

意:
可以採用抽象方法定義nextDay將大量的if...else語句轉移到一個個獨立的對象中實現。

WeekDay.java
package com.itheima.day1;

public abstract class WeekDay {
      
       private WeekDay(){}
      
       public static final WeekDay SUN = new WeekDay(){
             public WeekDay nextDay(){
                   return MON ;
            }
      };
      
       public static final WeekDay MON = new WeekDay(){
             public WeekDay nextDay(){
                   return SUN ;
            }
      };
      
       public abstract WeekDay nextDay();
      
       public String toString(){
             return this == SUN? "SUN":"MON" ;
      }
}

EnumTest.java
package com.itheima.day1;

public class EnumTest {

       public static void main(String[] args) {
            WeekDay day = WeekDay.MON;
            System. out.println(day.nextDay());
            //結果:SUN
      }
}

2-5-3 Java5枚舉的基本應用
示例:
EnumTest.java
package com.itheima.day1;

public class EnumTest {

       public static void main(String[] args) {
            WeekDay day = WeekDay.FRI;
            System.out.println(day);
             //結果:FRI
            System.out.println(day.name());
             //結果:FRI
            System.out.println(day.ordinal());
             //結果:5
            System.out.println(WeekDay. valueOf("SUN"));
             //結果:SUN
            System.out.println(WeekDay. values().length);
             //結果:7
      }
      
      public enum WeekDay{
             SUN,MON ,TUE,WED, THI,FRI ,SAT;
      }
}
總結:
枚舉是一種特殊的類,其中的每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
意:
最後一個枚舉元素後面可以加分號,也可以不加分號。

2-5-4 實現帶有構造方法的枚舉
·枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。
·枚舉元素必須位於枚舉體中的最開始部分,枚舉元素列表的最後要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器會報告錯誤。
·帶構造方法的枚舉:
 構造方法必須定義成私有的
 如果有多個構造方法,將根據枚舉元素創建時所帶的參數決定選擇哪個構造方法創建對象。
 枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。


示例:
EnumTest.java
package com.itheima.day1;

public class EnumTest {

       public static void main(String[] args) {
            WeekDay day = WeekDay.FRI;
      }
      
      public enum WeekDay{
             SUN(1),MON (),TUE, WED,THI ,FRI,SAT;
            
             private WeekDay(){
                  System. out.println("first" );
            }
            
             private WeekDay(int value){
                  System. out.println("second" );
            }
             //結果:
             //second
             //first
             //first
             //first
             //first
             //first
             //first
      }
}

2-5-5 實現帶有抽象方法的枚舉
定義枚舉TrafficLamp。
實現抽象的nextTrafficLamp方法:每個元素分別是由枚舉類的子類來生成的實例對象,這些子類採用類似內部類的方式進行定義。
增加上表示時間的構造方法。

示例:
EnumTest.java
package com.itheima.day1;

public class EnumTest {

       public static void main(String[] args) {
            TrafficLamp lamp = TrafficLamp.RED;
            System. out.println(lamp.nextLamp());
             //結果:GREEN
      }
      
       public enum TrafficLamp{
             RED(30) {
                   public TrafficLamp nextLamp() {
                         return GREEN ;
                  }
            }, GREEN(45) {
                   public TrafficLamp nextLamp() {
                         return YELLOW ;
                  }
            }, YELLOW(5) {
                   public TrafficLamp nextLamp() {
                         return RED ;
                  }
            };
            
             private int time;
            
             private TrafficLamp(int time){
                   this.time = time;
            }
            
             public abstract TrafficLamp nextLamp();
      }
}
意:
1、枚舉只有一個成員時,就可以作爲一種單例的實現方式。
2、查看生成的class文件,可以看到內部類對應的class文件。

                                                                     -------android培訓JAVA培訓、期待與您交流! ----------

--------詳細請查看www.itheima.com-------------



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章