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

心得19--JDK新特性-可变参数、枚举

2012-09-17 16:33 330 查看
1. 可变参数

从 JDK 1.5 开始, Java 允许定义形参长度可变的参数,从而允许为方法指定数量不确定的形参,若在定义方法时,在最后一个形参的类型后增加三点(…, ...位于变量类型和变量名之间,前后有无空格都可以)则表明该形参可以接受多个参数值, 多个参数值被当成数组传入

可变形参只能处于形参列表的最后, 所以一个方法最多只能有一个长度可变的形参;调用包含一个可变形参的方法时,可以为该形参传入多个参数或一个数组调用可变参数的方法时,
编译器为该可变参数隐含创建一个数组, 在方法体中以数组的形式访问可变参数
代码案例:

packagecom.java.test;
publicclass ChangeTest {
  
/**
  
 * @param args
  
 */
  
publicstaticvoid main(String[] args) {
     
//调用sum方法,传递参数
     
Integer sum = sum(1,2,3,4,5,6);
     
System.out.println(sum);
     
Integer sum1 = sum1(1,2,3,4,5,6);
     
System.out.println(sum1);
     
//调用sum参数,传递数组方法
     
Integer[] arr = {7,8,9,0,4};
     
sum = sum(arr);
     
System.out.println(sum);   
  
}
  
publicstatic Integer sum(Integer...arr) {// ...前后有无空格都可以
     
int sum = 0;
     
for(Integer i : arr) {
        
sum += i;
     
}
     
return sum;    
  
}
  
publicstatic Integer sum1(Integerj,Integer...arr) {//
主方法把里面传参的时候把第一个数传个了j,最后的传给了arr
     
int sum = 0;
     
for(Integer i : arr) {
        
sum += i;
     
}
     
return sum;    
  
}
}
测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组的情况;注意:传入基本数据类型数组的问题

案例分析:

packagecom.java.test;
importjava.util.Arrays;
importjava.util.List;
publicclass AsList {
  
/**
  
 * @param args
  
 */
  
publicstaticvoid main(String[] args) {
     
List list = Arrays.asList("1","2","3");
     
System.out.println(list); //
结果:[1, 2, 3]
     
     
Integer[] num = {1,2,3,4};
     
List list1 = Arrays.asList(num);
     
System.out.println(list1); //结果:[1, 2, 3, 4]
     
 
     
// 这里的num1值1、2、3、4不是对象,int[]
num1 才是一个对象,因为java中数组也是对象
     
int[] num1 = {1,2,3,4};
     
List list2 = Arrays.asList(num1);
     
System.out.println(list2); //结果:[[I@b5dac4]
  
}
}
2. 
枚举


为什么需要枚举?

一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。

   不用枚举的案例:

packagecom.java.student;
publicclass Student {
  
private Stringname;
  
private Stringgrade;
  
public String getName() {
     
returnname;
  
}
  
publicvoid setName(String name) {
     
this.name = name;
  
}
  
public String getGrade() {
     
returngrade;
  
}
  
publicvoid setGrade(String grade) {
     
     
if(!grade.matches("[ABCDE]")) {
        
thrownew IllegalArgumentException("输入的成绩不符合要求!");
     
}
     
this.grade = grade;
  
}
}
l    JDK 5新增的 enum 关键字用于定义一个枚举类。

l    手动实现枚举类:

•       通过 private 将构造器隐藏起来

•       把这个类的所有可能实例都使用 publicstatic final 修饰

•       属性不应允许被改动, 所以应该使用 private final 修饰

案例:
packagecom.java.test;
publicclass Student {
  
private Stringname;
  
private Gradegrade;
  
public String getName() {
     
returnname;
  
}
  
publicvoid setName(String name) {
     
this.name = name;
  
}
  
public Grade getGrade() {
     
returngrade;
  
}
  
publicvoid setGrade(Grade grade) {
     
this.grade = grade;
  
}
}
class Grade{
  
private Grade () {}
  
publicstaticfinal GradeA =
new Grade();
  
publicstaticfinal GradeB =
new Grade();
  
publicstaticfinal GradeC =
new Grade();
  
publicstaticfinal GradeD =
new Grade();
  
publicstaticfinal GradeE =
new Grade();
}
publicvoid test1() {
     
Student s = new Student();
     
s.setName("join");
     
s.setGrade(Grade.A);
   }

上面写法比较麻烦,java中提供了一种更方便的方法----枚举类可以解决上面的问题;
enum 关键字
用于定义枚举类枚举类也是一种特殊形式的Java类

l    枚举类和普通类的区别:

•       使用 enum 定义的枚举类默认继承了 java.lang.Enum 类

•       枚举类的构造器只能使用 private 访问控制符

•      枚举类的所有实例必须在枚举类中显式列出(,分隔 ;结尾).列出的实例系统会自动添加 public static final 修饰

l    JDK5中扩展了switch语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型

l    若枚举只有一个成员, 则可以作为一种单例模式的实现方式

l     枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰;举类的属性应该在构造器中为其赋值枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数

l    Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:

•       name():返回此枚举常量的名称,在其枚举声明中对其进行声明

•       ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

•       valueof(Class enumClass, String name):返回带指定名称的指定枚举类型的枚举常量。 静态方法

•       values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。

  枚举类进阶(由浅入深)案例:

简单:
packagecom.java.student;
publicclass Student2 {
  
private Stringname;
  
private Grade1grade;
  
public String getName() {
     
returnname;
  
}
  
publicvoid setName(String name) {
     
this.name = name;
  
}
  
public Grade1 getGrade() {
     
returngrade;
  
}
  
publicvoid setGrade(Grade1 grade) {
     
this.grade = grade;
  
}
}
enum Grade1{
  A,B,C,D,E;
}
枚举类中带构造器带参的案例:

packagecom.java.student;
publicclass Student3 {
  
private Stringname;
  
private Grade2grade;
  
public String getName() {
     
returnname;
  
}
  
publicvoid setName(String name) {
     
this.name = name;
  
}
  
public Grade2 getGrade() {
     
returngrade;
  
}
  
publicvoid setGrade(Grade2 grade) {
     
this.grade = grade;
  
}
}
 
enum Grade2 {
  
A("100-90"),B("90-80"),C("80-70"),D("70-60"),E("60-0");
  
private Grade2 (String value) {
     
this.value=value;
  
}
  
public Stringvalue;
  
public String getValue() {
     
returnvalue;
  
}
}
  综合抽象案例:

packagecom.java.student;
 
publicclass Student4 {
  
private Stringname;
  
private Grade3grade;
  
public String getName() {
     
returnname;
  
}
  
publicvoid setName(String name) {
     
this.name = name;
  
}
  
public Grade3 getGrade() {
     
returngrade;
  
}
  
publicvoid setGrade(Grade3 grade) {
     
this.grade = grade;
  
}
}
enum Grade3 {
  
A("100-90") {
     
@Override
     
public String toLocalGrade() {
        
return"优";
     
}
  
},
  
B("90-80") {
     
@Override
     
public String toLocalGrade() {
        
return"良";
     
}
  
},
  
C("80-70") {
     
@Override
     
public String toLocalGrade() {
        
return"中";
     
}
  
},
  
D("70-60") {
     
@Override
     
public String toLocalGrade() {
        
return"可";
     
}
  
},
  
E("60-0") {
     
@Override
     
public String toLocalGrade() {
        
return"差";
     
}
  
};
  
private Grade3 (String value) {
     
this.value=value;
  
}
  
public Stringvalue;
  
public String getValue() {
     
returnvalue;
  
}
  
publicabstract String toLocalGrade();
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐