JDK 1.5 新特性学习笔记(1)

JDK 1.5/5.0在Java语言方面进行了许多加强。此文简要描述每一新特性的基本内容,便于快速了解相关知识点,更详细的描述请参考相关资料。app


1. 自动装箱(Auto Boxing)spa

自动装箱即在基本类型(Primitives)和对应的封装类型(Wrapper Types)之间自动进行转换。此特性主要是做为一个语言易用性上的加强,听起来很是简单,但也有一些须要注意的小陷阱。code

下面是常见的使用场景,提供了相应的代码示例,须要注意的地方在注释中加以描述。对象


1.1 将基本类型转换为对应的封装类型编译器

这种属于最基本的转换,且比较容易理解,也没有须要特别注意的地方。代码示例:虚拟机

Byte b = (byte) 0;
Short sh = (short) 0;
Integer i = 0;
Long l = 0L;
Boolean bool = true;
Character ch = 'a';
Float f = 0.1f;
Double d = 0.1d;

 

1.2 将封装类型转换为对应的基本类型it

这种也属于最基本的转换,须要注意对象为null的状况。代码示例:io

Integer i = 0;
int j = i;
i = null;
j = i; // a NullPointerException is thrown at runtime

 

1.3 封装类型上的自增(++)和自减(--)运算符编译

封装类型上也支持自增和自减运算。代码示例:class

Integer i = 0;
i++;
i--;

 

1.4 布尔型

布尔的封装类型(Boolean)也支持逻辑运算符。代码示例:

Boolean case1 = true;
Boolean case2 = true;
boolean case3 = false;
Boolean result = !((case1 || case2) && case3);

 

1.5 三元运算符

三元运算符的使用上也有一些变化,逻辑表达式的值能够是Boolean型,而且两个表达式的结果能够是相同基类的不一样子类型,不须要强制类型转换了。代码示例:

int i = 0;
String s = "1";
Boolean b = true;
Object obj = b ? i : s;
System.out.println(obj); // the output is 0

 

1.6 ==运算符

既然封装类型和基本类型之间能够互相转换,那么就引出一个问题,两个整数(基本类型和封装类型)之间的判等如何处理?代码示例

Integer i1 = 0;
Integer i2 = 0;
System.out.println(i1 == i2 ? "equal" : "not equal"); // equal
Integer i3 = new Integer(0);
Integer i4 = 0;
System.out.println(i3 == i4 ? "equal" : "not equal"); // not equal
int i5 = 0;
int i6 = new Integer(0);
System.out.println(i5 == i6 ? "equal" : "not equal"); // equal
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8 ? "equal" : "not equal"); // not equal

此处须要说明的是,-127~127范围内的整数会被转换成常量对象,所以==运算符返回true。

由于有和虚拟机实现相关的不肯定的因素在,因此对象之间的判等最好仍是使用equals方法,防止出现不可预料的结果。


1.7 方法重载的处理

为与以前的JDK版本兼容,JDK 1.5中方法重载时的方法定位分三趟进行

第一趟:编译器查找与方法调用一致的方法,不进行自动装箱、变长参数处理(即JDK 1.4的方式,首先使用类型彻底匹配的,如没有则使用参数为基类类型的);

第二趟:若是第一趟定位失败,则编译器增长自动装箱处理,再次定位;

第三趟:若是第二趟定位失败,则编译器增长自动装箱和变长参数处理,最后一次定位。

代码示例:

public static void main(String[] args) {
	/* method overloading */
	testOverloading(1); // the output is double
}
	
static void testOverloading(double d) {
	System.out.println("double");
}
	
static void testOverloading(Integer i) {
	System.out.println("Integer");
}
相关文章
相关标签/搜索