[置顶] 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基础加强_第1张图片


典型应用:

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基础加强_第2张图片


[置顶] JavaSE基础加强_第3张图片

[置顶] JavaSE基础加强_第4张图片

[置顶] JavaSE基础加强_第5张图片

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

  

[置顶] JavaSE基础加强_第6张图片

[置顶] JavaSE基础加强_第7张图片


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

[置顶] JavaSE基础加强_第8张图片

可变参数

 

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

 

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

 

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

 

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

 

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

 

 

可变参数方法示例代码1

[置顶] JavaSE基础加强_第9张图片

可变参数方法示例代码2

[置顶] JavaSE基础加强_第10张图片

可变参数方法示例代码3

[置顶] JavaSE基础加强_第11张图片

可变参数方法示例代码4

 

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

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

 [置顶] JavaSE基础加强_第12张图片

枚举类

为什么需要枚举?

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

 

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

 

枚举类引入

 

枚举类练习

   设计一个Student类

   class Student{

   private String name;

   private Grade grade;

   ……}

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

 

[置顶] JavaSE基础加强_第13张图片

[置顶] JavaSE基础加强_第14张图片

手动实现枚举类:

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

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

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

 

[置顶] JavaSE基础加强_第15张图片

[置顶] JavaSE基础加强_第16张图片

枚举类入门

 

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

 

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

 

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

 

枚举类和普通类的区别:

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

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

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

 

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

 

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

 

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

[置顶] JavaSE基础加强_第17张图片

[置顶] JavaSE基础加强_第18张图片

枚举类的属性

 

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

 

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

 

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

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

[置顶] JavaSE基础加强_第19张图片

[置顶] JavaSE基础加强_第20张图片

[置顶] JavaSE基础加强_第21张图片

[置顶] JavaSE基础加强_第22张图片

枚举类3(使用内部类)

[置顶] JavaSE基础加强_第23张图片

[置顶] JavaSE基础加强_第24张图片

[置顶] JavaSE基础加强_第25张图片

[置顶] JavaSE基础加强_第26张图片

枚举类常用的方法

 

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

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

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

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

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

 

[置顶] JavaSE基础加强_第27张图片

枚举类练习

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

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

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

 

 

package net.csdn.time;

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

 class TimeBean {

       privateString name;

       privateWeekDay timeLong;

  

      

       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 String timeLong;

  

   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);

     

   }

}

 

 



你可能感兴趣的:(java,jdk,String,Integer,iterator,import)