黑马程序员_jdk1.5新特性总结

来源:互联网 发布:淘宝网红盛典 编辑:程序博客网 时间:2024/05/16 10:00

                                                       ------- android培训java培训、期待与您交流! ----------

1、静态导入

  import语句导入的是一个类或者一个包中的所有类。当我们使用某个类的静态方法时,必须用类名.静态方法名才可以,如果你使用的静态方法很多,可以静态导入,格式为import static ,这样在使用静态方法时,直接使用方法名就好了。

 比方说:我要比较两个值的大小,得到最大值,可以使用Math类中的max方法,如果不静态导入,需这样写:Math.max(3,6)。如果静态导入的话,需要在代码第一行写上import static java.lang.Math.max;调用方法时,直接max(3,6)就好了。

2、可变参数

  当一个方法接收的参数个数不确定或类型未知时,可以用可变参数列表来解决此问题。

  可变参数的特点:

   1)只能出现在参数列表的最后;

   2)...位于变量类型和变量名之间 ,前后有无空格都可以。

   3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。

 举例如下:

public class VariableParameter {

    public static void main(String[] args){

        System.out.println(add(2,5));

System.out.println(add(2,5,8));

System.out.println(add(2,5,4,12));

    }

    public static int add(int x,int ...args){

int sum = x;

for (int i = 0; i < args.length; i++) {

     sum +=args[i];

}

        return sum;

    }

}

如果参数类型不确定,因为所有的类都间接或直接的继承Object类,我们可以用Object作为参数类型,来传参,这样就可以接受不同的对象。当然可变参数列表和自动装箱机制可以很好地融合,比如我们用Integer作为参数类型,当我们传参new Integer(12)或直接传参12数值都是可以的,因为自动装箱机制可以讲int型有选择的装箱成Integer。

3、自动拆装箱机制

 如Integer x = 4

   X = x +2;

在执行第一句话时,xInteger类型,而4只是一个基本数据类型,在执行这句话时,该机制会自动装箱,把4封装成Integer对象。而执行第二句话时,要与2进行加法运算,此时要自动拆箱,把4变成int类型与2进行加法运算后,再装箱赋给x。这就是自动拆装箱机制,简化了书写。

注意:这是x不能为空,否则会抛异常。

此外,对于该新特性,有一个特殊的例子:

Integer a = 126

Integer b=126

此时a ==b是为true的。因为在新特性里,当数值在byte范围内时(即-128~127),若该值已经存在,就不会再开辟新空间,直接将b引用指向该值。这种现象也成为享元设计模式。

 

4、Foreach语法

 Foreach语法,表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项。用于对数组和容器的遍历。

例如:有一个int数组,我们要遍历该数组。

public class Foreach {

   public static void main(String[] args) {

     int[] arr = new int[5];

     for(int a : arr){

       System.out.println(a);

     }

   }

}

这样可以简化书写。

 

5、枚举enum

enum关键字使得我们在需要群组并使用枚举类型集时,可以很方便的处理。

比如我们可以创建一个名为Spiciness的枚举类型,它具有5个具名值。由于枚举类型的实例是常量值,所以按命名惯例我们都用大写字母表示,单词与单词之间用下划线分隔。

public enum Spiciness{

   NOT,MILD,MEDIUM,HOT,FLAMING

}

那么我们如何使用枚举值呢?需要创建一个该类型的引用,并将其赋值给某个实例。

如 Spiciness howHot = Spiciness.MEDIUM;

Enum类中有toString()方法:返回枚举常量的名称;ordinal()方法:返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零static values()方法:提取常量值。

另外enum有一个很实用的特性,就是可以在switch中使用。因为switch是要在有限的可能值集合中进行选择。

枚举类型的特性:只能够取常量中的某一个。


6、@Override注解

 @Override并不是关键字,但是可以把它当做是关键字使用,当你想要重写某一方法是,可以选择添加这个注解,在你不留心重载而并非重写了该方法时,编译器会发生一条错误消息。

可以防止你在不想重载是而意外的进行了重载。

class Homer{

  char doh(char c){

     System.out.println("doh(char)");

     return 'd';

  }

  float doh(float f){

     System.out.println("doh(float)");

     return 1.0f;

  }

}

class Milhouse{}

class Lisa extends Homer{

   @Override void doh(Milhouse m){

     System.out.println("doh(Milhouse)");

   }

}

public class Hide {

  public static void main(String[] args){

    Lisa l = new Lisa();

    l.doh(new Milhouse());

  }

}

编译器出错结果是:The method doh(Milhouse) of type Lisa must override 

                or implement a supertype method


7、协变返回类型

  协变返回类型表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。在以前的版本,只   能强制返回基类方法的返回类型。

 下面给出示例:

class Grain{

  public String toString(){

   return "Grain";

  }

}

class Wheat extends Grain{

   public String toString(){

     return "Wheat";

   }

}

class Mill{

   Grain process(){

     return new Grain();

   }

}

class WheatMill extends Mill{

  Wheat process(){

    return new Wheat();//协变返回类型,允许被覆盖的方法返回导出类型

  }

}

public class CovariantReturn {

   public static void main(String[] args){

     Mill m = new Mill();

     Grain g = m.process();

     System.out.println(g);

     m = new WheatMill();//多态

     g = m.process(); //获得子类的process方法返回的Wheat类型

     System.out.println(g);

  }

}

被覆盖的process方法可以返回基类的导出类型Wheat