黑马程序员-->Java基础加强-->JDK1.5新特性

-------android培训java培训、期待与您交流! ----------

 

总结一下java高薪技术有关JDK1.5版本一些新特性:
一、静态导入(static import) 

   静态导入,是用来导入指定类的某个静态属性值或全部静态属性值。
   当我们调用静态成员(静态变量和静态方法)的时候,我们必须按照“类名.静态成员”这个格式。如果一开始我们就加入静态导入,就可以简化书写,不需要写“类名.",直接调用即可。因为使用静态导入可以使被导入类的所有静态成员在当前类直接可见。
   静态导入语句使用“import static”语句,静态导入也有两种语法,分别用于导入指定类的单个静态属性和全部静态属性。

   导入指定类单个静态属性的语法格式:import static package.subpackage...ClassName.fieldName;

下面举例子说明一下:

运行结果:
2
6
3
231
3.141592653589793

总结:静态导入使代码更加简洁、简化了书写,如果导入的静态成员变量过多,可能会出现不同类重名的成员变量,无疑会增加阅读难度,所以注释一定要详细清楚到那个类中的静态成员

 

二、可变参数(Varargs)

   可变参数,顾名思义就是一个方法接受的参数个数不固定,JDK1.5版本之前要么是多个重载方法实现,比较麻烦,效率不高;要么是传入一个数组,另外还需要new一个数组对象存储多个不同的参数。为了代码简洁和书写方便,JDK1.5版本加入了可变参数。

   可变参数特点:
   1、只能放在参数列表的最后
   2、用“typename ...Arguments”来表示可变参数,省略号位置前后有无空格都可以,位于变量类型和变量名之间
   3、在调用可变参数所在的方法时,JVM会默认为该可变参数(隐含)建立一个数组,在方法体中访问可变参数时,是以数组的形式操作(或者在方法体中以数组的形式访问可变参数)

   下面举例子说明一下:

运行结果:
5
10
总结:可变参数,避免了同一个方法多个不同参数参与运算造成多个函数重载或者自定义数组,代码冗长低效的麻烦,内部隐含创建数组访问多个参数大大提高了代码书写简洁和运行效率。

 

三、增强for循环(Enhanced For loop)

  增强for循环一般都是用于迭代输出集合或者数组中的元素
  语法格式:for(type variableName(迭代变量名) : variabaleSet(集合变量名)){...}

  注意2点:
  迭代变量必须在()内定义
  集合变量可以是数组也可以是实现iterable(迭代器)接口的集合类

   下面举例子说明一下:
 

运行结果:
java01
java02
java03
------------------------分割线---------------------
java01
java02
java03

总结:增强for循环使代码短小精悍、书写简洁,但是与传统的for循环相比,增强for循环有一个局限性,就是必须有被遍历的目标:集合或者数组。例如:集合或者数组的长度一般是固定的,在操作过程中发生改变,增强for循能遍历已经没有的元素,固然会报错。

 

四、自动装箱和拆箱(Autoboxing/unboxing)

自动装箱:基本数据类型自动转化为包装类  快速记忆:基本数据类型--(装箱)-->相对应的对象
自动拆箱:包装类自动转化为基本数据类型  快速记忆:相对应的对象--(拆箱)-->基本数据类型

基本数据类型和包装类对应关系:
* byte<-->Byte
* short<-->Short
* int<-->Integer
* long<-->Long
* float<-->Float
* double<-->Double
* char<-->Character
* boolean<-->Boolean

下面举例子说明一下:

运行结果:
24
[1, 14]
true
false

扩展知识:享元模式(flyweight)

由上面(21行到27行)代码运行结果看出,返回结果为true,是同一对象;返回结果为false,是不同对象。为什么呢?
   因为赋值范围在一个字节内的整数使用频率很高,即[-128~127],一旦把这些很小的整数包装成一个Integer对象之后,会缓存到一个常量池里面,当下次用到这个Integer对象的数据时,先看常量池里面有没有,有就直接调用,这样可以避免每次需要这个区间的数据都要产生新的对象,以节省内存空间。这就是一种设计模式,又叫做享元模式。
   关键:只要在[-128~127]区间的所有Integer对象,如果内存中有相同的,就不再建立新的对象。
概念: 享元模式(flyweight)
   有很多个小对象 ,它们有很多属性是相同的,把它们变成一个对象;那些不同的属性,把他们变成方法的参数,称之为外部状态,那些相同的属性称之为内部状态。

比如:
(char ,x , y) :如果char是很小的对象,代表某个英文单词中某个字母,x,y是外部状态,代表这个字母所在的位置。这里就可以用享元模式。
图标:window下的文件夹图标,只有名称属性不同,其他很多相同的属性,那么也可以用享元设计模式。

 

五、枚举(Enums)

为什么要有枚举
   很多时候,程序员对同一个对象起不同的名字,明明是同一个对象却拥有很多不同的名字,就会引起很多不必要的麻烦,比如星期,中国人习惯星期日用“7”表示一周的最后一天,外国人习惯星期日用“0”表示一周的第一天。如果有一种规定,只能用一种表示方法代表同一个对象,就可以避免出现太多不同名字代表同一个对象造成数据混乱的麻烦,枚举就是这个规定,一旦程序员使用枚举规定好了指定对象的名字,以后不管谁都要按规定使用这个对象,确保类型安全。
   枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
   私有的构造方法,不能实例化对象。
   每个元素分别用一个公有的静态成员变量表示,表示格式public final static Enum e = new Enum()。
   可以有若干公有方法或者抽象方法,例如要提供nextDay方法必须是抽象的。采用抽象方法定义nextDay就将大量的if else语句转移成了一个个独立的类(这里用到了匿名内部类)。

定义一个枚举类
   枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。
   枚举类的实例变量把所有的枚举实例都加载一次。
   枚举中的每个元素都是public final static的,所以它们都是常量,所以在定义的时候要全部大写。
   枚举元素必须位于枚举体中的最开始部分,枚举元素列表的最后要有分号与其他成员分割。
   枚举是一个类,可以定义构造方法,成员变量,普通方法和抽象方法。
   枚举的构造方法必须是private,可以有参数,也可以没有参数,没有参数时都是调用默认的构造方法,
当要调用有参数的构造方法的时候,就要在元素后面加上(),并且在里面传递参数。
   枚举只有一个成员时,就可以作为一种单例的实现方式。
   当定义了抽象方法的时候,这个函数就不能创建对象了,这时就需要使用匿名内部类来重写抽象方法了。

   枚举常见方法介绍:
   (1)name:   得到自己的名字
   (2)ordinal:得到自己在枚举中的位置
   (3)valueOf:静态方法,将字符串转换成相应的枚举对象
   (4)values: 静态方法,得到枚举所有的元素

   下面举例子说明一下:
定义一个普通的WeekDay枚举类:

运行结果:
星期一

由于nextDay方法中出现有大量if else语句,可以采用抽象方法定义nextDay,
将大量的if else语句转移到一个个独立的对象中实现(这里用到匿名内部类)。如下:

 

用JDK1.5版本提供的enum关键字定义一个枚举类,如下:

运行结果:
second
first
first
first
first
first
first
SUN
SUN
0
SUN
7
SUN
MON
TUE
WED
THU
FRI
SAT


下面用交通灯举个最复杂的枚举类(内含抽象方法和匿名内部类)

运行结果:
RED

小结:关键字enum定义的枚举类是特殊的内部类。枚举内部有toString()方法重写。定义抽象方法时,每个元素对象都可以用匿名内部类实现对该抽象方法的重写。

 

-------android培训java培训、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值