枚举与java5的一些简单新特性
2015-04-17 13:56
477 查看
一、概述
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)定义枚举TrafficLamp2)实现普通的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=32)自动拆箱: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,即把基本数据类型变为包装类。
相关文章推荐
- 黑马程序员-1-java5的一些简单新特性
- kotlin的一些特性介绍和与java C#的简单对比
- java--加强之 jdk1.5简单新特性,枚举,注解
- 黑马程序员------java5的一些简单新特性(静态导入、可变参数、增强for循环、自动拆箱装箱及享元)
- java--加强之 jdk1.5简单新特性,枚举,注解
- 黑马程序员 java高新技术<一>--eclipse开发工具、java5的一些简单新特性
- JavaSE 拾遗(15)——JavaSE 高新技术基础增强...java5简单新特性和枚举
- java 枚举 循环遍历以及一些简单常见的使用
- 枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。
- Java1.5语言新特性简单总结
- 一些简单的java代码
- Java基础加强<一>_MyEclipse、JDK1.5新特性、枚举、反射
- Java1.5语言新特性简单总结
- 黑马程序员——Java高新技术——JDK4.5版本新特性枚举、高级for循环、静态导入、可变参数、基本数据类型的自动装箱与拆箱
- java中Date类的一些简单实用的解析
- JAVA学习中应该注意的一些简单问题?
- java 枚举和反射 实现简单的工厂模式
- Java的一些高级特性(四)——集合
- Java高新技术新特性之枚举
- Java代码书写风格及一些简单的注意事项