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-------------



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