您的位置:首页 > 编程语言 > Java开发

jdk1.5新特性——可变参数、增强for循环、枚举

2012-05-17 16:44 239 查看
---------------------- android培训java培训、期待与您交流! ----------------------
可变参数

问题,一个方法接收的参数个数不固定,例如:

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

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

我们可能很容易想到使用overload(重载)方法来实现接收参数个数不同但类型相同的功能,但是使用重载的方法无疑在代码的书写上增加了很大的麻烦,为此jdk1.5后提供可变参数的引入,对于上面的接收不同个数的相加方法其可变参数方法的书写格式是:

public
static int
add(int x,int... args)
{
    int sum = x;
    for(int i = 0;i<args.length;i++)
    {
       sum=sum+args[i];
    }
       return sum;
}
可变参数的特点:

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

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

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

For 循环增强

不同于传统的for循环,java在jdk1.5后增加了增强的for循环,增强for循环必须有一个被遍历的目标,如集合等,他的语法是:

For(type 变量名 : 集合变量名){…}

如:

public
static int
add(int x,int... args)
{
    int sum = x;
    for(int arg :args)

{

        sum +=arg;

}

       return sum;
}
在使用时需要注意的几点事项是:

1,  迭代的变量必须在()中定义出,如上面的arg。

2,  集合变量可以是数组后实现了iterable接口的集合来。

当然在遍历数组时建议尽量使用传统的for循环,因为其可以定义角标,便于其他方面的使用。

基本数据类型的自动装箱与拆箱

在jdk1.5之前,在操作基本数据了类型时,如以下语句代码:

IntegeriObj = 3;

这种格式使用时不正确的,但在jdk1.5之后,java增加新的特性:自动装箱与拆箱,在这版本的java后使用此格式的语句就可以了,原因是java会在内部自动的为我们将右边的3做new Integer(3);然后在赋给左边的Integer,这就是自动装箱操作,也就是不要我们手动的区显示出了,大大的简化了书写,在如语句

IntegeriObj = 3;

iObj =iObj + 12;

第二句的相加在jdk1.5之前也是不允许的,因为iObj是一个对象,而12是一个整数,他们是不可以直接相加的,但在jdk1.5之后这也是可以的,java在内部会自动将有边作为对象的iObj拆箱,变成int类型,然后再和12进行相加,然后再将和进行自动装箱赋给右边的左边的对象iObj。

当然在使用这一新特性时我们需要注意一些事项,如下面代码:

package cn.itcast.day1;
public
class
AutoBox {
    /**
     * @param args
     */
    public
static void
main(String[] args) {
       // TODO Auto-generatedmethod stub
        Integer iObj = 3;
       System.out.println(iObj + 12);
      
       String s1 = new String("abc");
       String s2 = new String("abc");
       System.out.println(s1 == s2);
 
       Integer i1 = 12;
       Integer i2 = 12;
       System.out.println(i1 == i2);
    }
}
输出语句一自然是输出15,输出语句二输出false,输出语句三输出true。为什么二和三输出的结果不同,这就是需要注意的地方,因为输出语句二操作的是两个new的String对象,他们是不同(地址不同),所以输出的是false,而输出语句三操作的数值在byte类型的范围内,在新特性中,当数值在byte范围内时(0-127),如果该数值已经存在,则不会再开辟新的空间,故输出的结果就是true了。

 

枚举

枚举是java jdk1.5之后出现的新特性,枚举很像一个类,实际上java.lang.Enum本身就是一个抽象类,自定义枚举类型,隐含所创建的类型都是都是java.lang.Enum的子类。他们继承了Enum中许多有用的方法。枚举类型中的枚举值都是隐式定义为公有静态(publicstatic),而且值之间用逗号隔开。

枚举的出现就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

比如下面创建的枚举:

public
enum
WeekDay
{
    SUN,MON,TUE,WED,THU,FRI,ST
4000
R;

}

最后的一个分号可以不写,因为这个枚举里只有几个元素。后面没有构造函数。其中每一个元素都是该类的一个实例对象,在定义变量是我们只能去枚举中的某一个元素,否则就会出现错误,也即WeekDay weekday = WeekDay.FRI;其中红色部分只能是上面枚举中的七个值之一。创建了对象后就可以继承很多枚举的方法,如下语句:

System.out.println(weekDay);//FRI
打印对象的名称,其实枚举自动帮我们实现了toString方法,将结果打印出来
System.out.println(weekDay.name());//FRI
同样是打印名称,调用了name方法
System.out.println(weekDay.ordinal());//5
打印weekDay对象的序号,第一个为0,依次类推
System.out.println(weekDay.getClass());
//获取类名:class cn.itcast.day1.EnumTest$WeekDay
System.out.println(weekDay.getDeclaringClass());
//获取类名:class cn.itcast.day1.EnumTest$WeekDay
同样,也可以直接类名调用枚举里的静态方法,如以下语句中的方法
System.out.println(WeekDay.valueOf("TUS"));//TUS
//ValueOf(args);通过传入的元素,获取实际对象,能打印TUS说明封装了toString方法
System.out.println(WeekDay.values());
//返回的一个WeekDay类型的数组,可以遍历得到数组,这是直接对枚举类所不能实现的功能。直接输出就是数组的地址
System.out.println(WeekDay.values().length);//获取转换后数组的长度。
 

与类一样,枚举也可以由数据成员和方法成员,如上的简单枚举可以加入构造函数,代码如下:

public
enum
WeekDay
{
    SUN,MON,TUS,WES,THR,FRI,STR;
    private WeekDay(){}
    private WeekDay(int day){}
}  
定义构造方法,一定要放在元素列表之后,而且构造方法必须私有,在如上的两个构造方法中,枚举中的每一个元素也即对象在创建时是用第一个构造函数(也即空参数的构造函数)进行初始化的。由于枚举里的七个元素都是static的,所以类一加载就会立马初始化,如果想使部分元素用第二个构造函数进行初始化,可以在元素后面加上参数,如
    public
enum
WeekDay
{     
    SUN(1),MON(2),TUS,WES,THR,FRI,STR;
}
这样前两个就会用第二个构造函数进行初始化。
 
带有抽象方法的枚举,每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义,见如下代码:
public
enum
TrafficLamp{
       RED(30){
           public TrafficLamp nextLamp(){
              returnGREEN;
           }
       },
       GREEN(45){
           public TrafficLamp nextLamp(){
              returnYELLOW;
           }
          
       },
       YELLOW(5){
           public TrafficLamp nextLamp(){
              returnRED;
           }
       };
       public
abstract
TrafficLamp nextLamp();
        /*由于是抽象方法,所以不能再用枚举类创建对象了,而只能用枚举类的子类对象来完成,而子类必须覆盖父类中的抽象方法。
*/
       private
int
time;
       private TrafficLamp(int time){this.time = time;}
      
    }
 
 

---------------------- android培训java培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐