首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JavaSE基础增强

2012-09-22 
JavaSE基础加强JavaSE基础加强 在JavaSE的学习过程中,有些知识是需要我们重点掌握和了解的,下面就将相关的

JavaSE基础加强

            JavaSE基础加强

 

在JavaSE的学习过程中,有些知识是需要我们重点掌握和了解的,下面就将相关的知识进行一下加强和巩固。

 

 一、JDK 5.0 新特性

 

“JDK 5.0”的一个重要主题就是通过新增一些特性来简化开发,这些特性包括:

?        静态导入

?        自动装包/拆包

?        for-each循环

?        可变参数

?        枚举

?        泛型

?        元数据

使用这些特性有助于编写更加清晰,精悍,安全的代码

 

 

静态导入

 

 JDK 1.5 增加的静态导入语法用于导入指定类的某个静态属性值(方法)或全部静态属性值(方法)

 

语法:

?        Import static 包名.类名.静态属性|静态方法|*

静态导入语句使用import static 语句

?        导入指定类的单个静态属性:                             

     import static java.lang.System.out

?        导入指定类静态方法
 import static java.lang.Math.max

?        导入指定类全部静态属性和方法                                  

     import static java.lang.Math.*

 

自动装箱/拆箱

自动装箱(autoboxing):把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 变量

 

自动拆箱:把包装类对象直接赋给一个对应的基本类型变量JavaSE基础增强


典型应用:

List list = new ArrayList();

list.add(1);

int j = (Integer)list.get(0);

 

 

增强for循环

    引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦!

 

因此JDK5中定义了一种新的语法——增强for循环,以简化此类操作。增强for循环只能用在数组、或实现Iterator接口的集合类上

使用 foreach 循环遍历数组和集合元素时, 无须获得数组和集合长度, 无须根据索

 

引来访问数组元素和集合元素, foreach 循环自动遍历数组和集合的每个元素

 

语法格式:

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

          for(type varName : array | collection){

                  //varName 自动迭代访问每一个元素

           }

使用增强for循环的几个实例:

JavaSE基础增强


JavaSE基础增强

JavaSE基础增强

JavaSE基础增强

使用增强for循环的几个注意事项:

  

JavaSE基础增强

JavaSE基础增强


引入:定义一个方法求数组中元素的和

JavaSE基础增强

可变参数

 

从 JDK 1.5 开始, Java 允许定义形参长度可变的参数,从而允许为方法指定数量不确定的形参

 

若在定义方法时, 在最后一个形参的类型后增加三点(…, ...位于变量类型和变量名之间,前后有无空格都可以)则表明该形参可以接受多个参数值, 多个参数值被当成数组传入

 

可变形参只能处于形参列表的最后, 所以一个方法最多只能有一个长度可变的形参

 

调用包含一个可变形参的方法时, 可以为该形参传入多个参数或一个数组

 

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

 

 

可变参数方法示例代码1

JavaSE基础增强

可变参数方法示例代码2

JavaSE基础增强

可变参数方法示例代码3

JavaSE基础增强

可变参数方法示例代码4

 

测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组的情况

注意:传入基本数据类型数组的问题。

 JavaSE基础增强

枚举类

为什么需要枚举?

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

 

JDK 5新增的 enum 关键字用于定义一个枚举类。

 

枚举类引入

 

枚举类练习

   设计一个Student类

   class Student{

   private String name;

   private Grade grade;

   ……}

  要求:学生的grade只能是a,b,c,d,e五个级别。可以给学生设置成绩,并可以输出学生成绩情况(优,良,中,可,差)

 

JavaSE基础增强

JavaSE基础增强

手动实现枚举类:

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

?        把这个类的所有可能实例都使用 public static final 修饰

?        属性不应允许被改动, 所以应该使用 privatefinal 修饰

 

JavaSE基础增强

JavaSE基础增强

枚举类入门

 

上面写法比较麻烦,java中提供了一种更方便的方法----枚举类可以解决上面的问题

 

JDK 1.5 新增的 enum 关键字用于定义枚举类

 

枚举类也是一种特殊形式的Java类

 

枚举类和普通类的区别:

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

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

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

 

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

 

若枚举只有一个成员, 则可以作为一种单例模式。

 

枚举类1(没有参数的构造方法)

JavaSE基础增强

JavaSE基础增强

枚举类的属性

 

枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰

 

枚举类的使用 private final 修饰的属性应该在构造器中为其赋值

 

若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数

枚举类2(有参数的构造方法)

JavaSE基础增强

JavaSE基础增强

JavaSE基础增强

JavaSE基础增强

枚举类3(使用内部类)

JavaSE基础增强

JavaSE基础增强

JavaSE基础增强

JavaSE基础增强

枚举类常用的方法

 

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

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

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

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

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

 

JavaSE基础增强

枚举类练习

练习:请编写一个关于星期几的枚举WeekDay,要求:

?        枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun

?        该枚举要有一个方法,调用该方法返回中文格式的星期。

 

 

package net.csdn.time;

//做的是一个关于员工每周工作时长的实体Bean

 class TimeBean {

       privateStringname;

       privateWeekDaytimeLong;

  

      

       publicString getName() {

      returnname;

   }

   publicvoid setName(String name) {

      this.name = name;

   }

   public WeekDaygetTimeLong() {

      returntimeLong;

   }

   publicvoid setTimeLong(WeekDay timeLong) {

      this.timeLong = timeLong;

   }

      

      

}

enum WeekDay{

   Mon("2h") {

      @Override

      publicString toLocalTime() {

       

        return"星期一";

      }

   },

   Tue("3h") {

      @Override

      publicString toLocalTime() {

        //TODO Auto-generated method stub

        return "星期二";

      }

   },

   Wed("4h") {

      @Override

      publicString toLocalTime() {

        //TODO Auto-generated method stub

        return "星期三";

      }

   },

   Thu("5h") {

      @Override

      publicString toLocalTime() {

        //TODO Auto-generated method stub

        return "星期四";

      }

   },

   Fri("6h") {

      @Override

      publicString toLocalTime() {

        //TODO Auto-generated method stub

        return "星期五";

      }

   },

   Sat("7h") {

      @Override

      publicString toLocalTime() {

        //TODO Auto-generated method stub

        return "星期六";

      }

   },

   Sun ("8h") {

      @Override

      publicString toLocalTime() {

        //TODO Auto-generated method stub

        return "星期日";

      }

   };

  

   private StringtimeLong;

  

   private WeekDay(StringtimeLong){

      this.timeLong = timeLong;

   }

  

  

  

   public StringgetTimeLong() {

      returntimeLong;

   }

 

 

 

   publicabstract String toLocalTime();

}

publicclass TestTimeBean{

   publicstaticvoid main(String [] args){

      TimeBean tb = newTimeBean();

      tb.setName("张三");

      tb.setTimeLong(WeekDay.Mon);

     

      //tb.getTimeLong(WeekDay.Mon.toLocalTime());

     

      String timeLong = WeekDay.Mon.getTimeLong();

      String localTime = WeekDay.Mon.toLocalTime();

       

      System.out.println(tb.getName()+"..."+localTime +"..."+timeLong);

     

   }

}

 

 



热点排行