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

枚举与java5的一些简单新特性

2015-04-17 13:56 435 查看

一、概述

1、为什么要有枚举?

问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人肯呢个会写成int weekday=0;

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以

控制程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

2、用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。

1)私有的构造方法

2)每个元素分别用一个公有的静态成员变量表示

3)可以有若干公有方法或抽象方法,例如,要提供newtDay方法必须是抽象的。采用抽象类方法定义nextDay就将大量的if else语句转移成了一个个独立的类

例1

abstract class WeekDay
{
private WeekDay(){}

public final static WeekDay SUN=new WeekDay()
{
public WeekDay nextDay()
{
return MON;
}
};

public final static WeekDay MON=new WeekDay()
{
public WeekDay nextDay()
{
return SUN;
}
};

public abstract WeekDay nextDay();

public String toString()
{
return this==SUN?"SUN":"MON";
}
}

class EnumTest
{
public static void main(String[] args)
{
WeekDay weekDay=WeekDay.MON;
System.out.println(weekDay.nextDay());
}
}

结果输出:



二、枚举的基本应用

1、

举例:定义一个Weekday的枚举。

扩展:枚举类的values,valueOf,name,toString,ordinal等方法

总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName()

注:枚举类是一个class,而且是一个不可被继承的final类,其中的元素都是类静态常量。

2、基本方法

枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。

枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。

把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。

非静态方法:(所有的枚举类都继承了Enum方法)       

 1)String toString() ;//返回枚举量的名称       

 2)int ordinal() ;//返回枚举值在枚举类中的顺序,按定义的顺序排       

 3)Class getClass() ;//获取对应的类名       

 4) String name();//返回此枚举常量的名称,在其枚举声明中对其进行声明。

静态方法:       

 1)valueOf(String e) ;//转为对应的枚举对象,即将字符串转为对象       

 2)values() ;//获取所有的枚举对象元素

例2

class EnumTest
{
public static void main(String[] args)
{
WeekDay weekday1=WeekDay.FRI;
System.out.println(weekday1);//输出枚举常量名
System.out.println(weekday1.name());//输出对象名
System.out.println(weekday1.ordinal());//输出此对象在枚举常量的次序
System.out.println(weekday1.valueOf("SUN").toString());//将字符串转化为枚举常量并输出枚举对象名
System.out.println(weekday1.values().length);//获取所以的枚举元素,并打印其长度
}

public enum WeekDay
{
SUN,MON,TUE,WED,THI,FRI,SAT
}
}

结果输出:



3、带构造方法的枚举

1)构造方法必须定义成私有的

2)如果有多个构造方法,该如何选择哪个构造方法?

3)枚举元素MON和MON()的效果一样,都是调用默认的构造方法。

例3

class EnumTest
{
public static void main(String[] args)
{
WeekDay weekday1=WeekDay.FRI;

System.out.println(weekday1);//输出枚举常量名
System.out.println(weekday1.name());//输出对象名
System.out.println(weekday1.ordinal());//输出对象在枚举常量中的次序
System.out.println(weekday1.valueOf("SUN").toString());//将字符串转化为枚举常量并输出枚举对象名
System.out.println(weekday1.values().length);//获取所有的枚举元素,并打印长度
}

public enum WeekDay
{
//枚举常量
SUN(1),MON,TUE,WED,THI,FRI,SAT;//分号可有可无,但如果下面还有方法或其他成员时,分号不能省。
//而且当有其他方法时,必须在这些枚举变量的下方
//午餐构造方法,默认调用
private WeekDay()
{
System.out.println("first");
}
//有参数的构造方法
private WeekDay(int day)
{
System.out.println("second");
}
}
}

结果输出:



4、带方法的枚举

1)定义枚举TrafficLamp

2)实现普通的next方法

3)实现抽象的next方法:每个元素分别是由枚举的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。

4)增加上表示时间的构造方法

枚举只有一个成员时,就可以作为一种单例的实现方式。

例4

public enum TrafficLamp
{
RED(30)//传入时间,用类似内部类的方式定义,覆盖抽象方法
{
public TrcfficLamp nextLamp()
{
return GREEN;
}
},
GREEN(45)
{
public TrcfficLamp nextLamp()
{
return YELLOW;
}
},
YELLOW(5)
{
public TrcfficLamp nextLamp()
{
return RED;
}
};
public abstract TrafficLamp nextLamp();//抽象方法,返回的是TrafficLamp类型
private int time;
private TrafficLamp(int time)
{
this.time=time;
}
}

三、java5的一些简单新特性

1、java5的静态导入

1) import语句可以导入一个类或某个包中的所有类

2)import static语句导入一个类中的某个静态方法或所有静态方法

如:import static java.lang.Math.*;

  System.out.println(Math.max(3,6));可以简写成System.out.println(max(3,6));

2、可变参数

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

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

可变参数的特点:

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

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

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

public class ViriableParameter {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(add(2,3));
System.out.println(add(2,3,5));//传入数字和数组
}

public static int add(int x,int... args){
int sum=x;
for(int i=0;i<args.length;i++)
{
sum+=args[i];//sum=sum+args【i】
}
return sum;
}
}

3、增强for循环

1)语法:

for(type 变量名:集合变量名){...}

2)注意事项:

迭代变量必须在()中定义

几何变量可以是数组或实现了Iterable接口的集合类

3)举例:

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

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

1)自动装箱:Integer  iObj=3

2)自动拆箱:iObj+2

3)对于基本数据类型的说明:整数在-128~127之间的数,包装成Integer类型对象,会存入常量池中的缓存,再创建一个对象的时候,如果其值在这个范围内,就会直接到常量池中寻找,因为这些小数值使用的频率很高,所以缓存到常量池中,被调用时就方便很多。

4)享元模式(fiyweight):

概述:有很多个小的对象,他们有很多相同的属性,把属性相同的部分变为同一个对象,这些属性称为内部状态。那些不同的属性,把他们变成方法的参数,称之为外部的状态。这种优化内存,只创建一个对象的模式,称之为享元模式。例如:Integer对象中对象取值范围在-128~127时,其值相同的对象相等,因为这些小的数被缓存在一
4000
个池中,被调用的频率较高,所以通常在池中取,从而导致对象相同。这就是典型的享元设计模式。

 

应用:(1)word中输入英文字母,可创建26对象,每个对象值是出现的位置不同(坐标),所以可用一个对象调用位置的方法:如,字母i:i.display(int x,int y),将高度重复使用的char类型的字母i封装成一个对象使用。

            (2)图标:window下的文件夹图标,只有名称这个属性不同,包含了很多其他相同的属性,那么可以应用享元模式。

valueOf(int x):Integer中静态方法,将一个整数转换为Integer,即把基本数据类型变为包装类。

 

 



 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: