Jdk5.0中出现的新特性
掌握jdk5.0中出现的新特性
1.泛型(Generics)
2.增强的"for"循环(Enhanced For loop)
3.自动装箱/自动拆箱(Autoboxing/unboxing)
4.类型安全的枚举(Type safe enums)
5.静态导入(Static import)
6.可变参数(Var args)
1.泛型(Generics)
泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。
public class ArrayListTest {
public static void main(String[] args) {
List list = new ArrayList();
//加的时候无所谓
list.add("String");
list.add(new Integer(2));
list.add(new Boolean(false));
//但是取的时候需要知道加进去的是什么类型,方便向下类型转换。
String str = (String) list.get(0);
Integer in = (Integer) list.get(1);
Boolean bool = (Boolean) list.get(2);
//我们改一下,编译通过,我的天哪,list.get(1)是Integer类型的!!
//但是执行的时候,
//ClassCastException: java.lang.Integer cannot be cast to java.lang.String
String in1 = (String) list.get(1);
}
}//编译时没有问题,但是执行时有问题,泛型可以解决这个问题
在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型.
T并不是Java中的一个类,它代表的是一个类型的信息,
public class GenericFoo<T> {
private T foo;
public T getFoo() {
return foo;
}
public void setFoo(T foo) {
this.foo = foo;
}
public static void main(String[] args) {
GenericFoo<Boolean> foo1 = new GenericFoo<Boolean>();
GenericFoo<Integer> foo2 = new GenericFoo<Integer>();
//只能传进去Boolean类型的
foo1.setFoo(new Boolean(false));//其实可以自动装箱
//只能传进去Integer类型的
foo2.setFoo(new Integer(1));//其实可以自动装箱
//返回的就是Boolean的,不用强制转换
Boolean b = foo1.getFoo();
//返回的就是Integer的,不用强制转换
Integer in = foo2.getFoo();
System.out.println(b);
System.out.println(in);
}
}
所谓泛型: 就是变量类型的参数化
以后使用集合要使用泛型!!
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "aa");
map.put("b", "bb");
map.put("c", "cc");
Set<String> set = map.keySet();
for (Iterator<String> iter = set.iterator(); iter.hasNext(); ) {
String key = iter.next();
String value = map.get(key);
System.out.println(key + ":" + value);
}
System.out.println("----------");
Set<Map.Entry<String,String>> set2 = map.entrySet();
for (Iterator<Map.Entry<String, String>> iter = set2.iterator(); iter.hasNext(); ) {
Map.Entry<String, String> entry = iter.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + ":" + value);
}
}
}
如果使用泛型,只要代码在编译时没有出现警告,就不会遇到运行时ClassCastException。
限制泛型可用类型:
在定义泛型类别时,默认可以使用任何的类型来实例化泛型类型中的类型(GenericFoo<T>中的T可以指代任何类型),但是如果想要限制使用泛型类别时,只能用某个特定类型或者是其子类型才能实例化该类型时,可以在定义类型时,使用extends关键字(即使是接口也是用extends)指定这个类型必须是继承某个类,或者实现某个接口。
/** * T必须是List接口的实现类,ArrayList可以,LinkedList可以,但是HashMap不可以 */ public class ListGenericFoo<T extends List>
当没有指定泛型继承的类型或接口时,默认使用T extends Object,所以默认情况下任何类型都可以作为参数传入
----------------
For-Each循环(增强for循环)
For-Each循环的加入简化了集合的遍历,其语法如下。
for(type element : array) {
System.out.println(element);
}
type:集合或数组中每个元素的类型。
element:变量的名字,每个元素都赋给这个变量。
array:集合或数组的名字。
for(String name:names)
public class Test {
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
for (int[] row : array) {
for (int element : row) {
System.out.println(element);
}
}
}
}
当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的 for 循环,因为它丢失了下标信息.
----------------
自动装箱/拆箱
Java中只有8个原生数据类型不是对象。
自动装箱/拆箱大大方便了基本类型数据和它们包装类的使用。
自动装箱: 基本类型自动转为包装类.(int->Integer)
自动拆箱: 包装类自动转为基本类型.(Integer->int)
List<Integer> list = new ArrayList<Integer>(); //Jdk4.0 list.add(new Integer(4)); //Jdk5.0 liat.add(4); //Jdk4.0 Integer in = (Integer)list.get(i); //Jdk5.0 Integer in = list.get(i);
Integer 类有一个缓存,它会缓存介于-128~127 之间的整数。
----------------------------
可变参数
可变参数使程序员可以声明一个接受可变数目参数(参数的个数会变化)的方法。注意,可变参数必须是方法声明中的最后一个参数.
//接收不同个数的参数
private static int sum(int... nums){
int sum = 0;
for (int num : nums) {
sum += num;
}
return sum;
}
可变参数本质上就是一个数组,对于某个声明了可变参数的方法来说,我们既可以传递离散的值,也可以传递数组对象。但如果将方法中的参数定义为数组,那么只能传递数组对象而不能传递离散的值。
可变参数必须要作为方法参数的最后一个参数,即一个方法不可能具有两个或两个以上的可变参数。
private static int sum(String str, int... nums) {
}
private static int sum(int... nums,String str) {
}//错误
枚举
JDK1.5加入了一个全新类型的"类"-枚举类型。为此JDK1.5引入了一个新关键字enum. 我们可以这样来定义一个枚举类型。
public enum Color {
Red,
White,
Blue
}
Color color = Color.Blue;
枚举类型还提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如
for (Color color : Color.values()) System.out.println(color);
枚举(Enum): 我们所定义的每个枚举类型都继承自 java.lang.Enum 类,枚举中的每个成员默认都是 public static final 的。
而每个枚举的成员其实就是您定义的枚举类型的一個实例(Instance)。 换句话说,当定义了一个枚举类型后,在编译时刻就能确定该枚举类型有几个实例,分别是什么。在运行期间我们无法再使用该枚举类型创建新的实例了,这些实例在编译期间就已经完全确定下来了。
静态导入:
a)import static com.shengsiyuan.common.Common.Age;
b) import static com.shengsiyuan.common.Common.output;
表示导入 Common 类中的静态成员变量 AGE 以及静态方法 output。注意:使用 importstatic 时,要一直导入到类中的静态成员变量或静态方法。
Java 中,无论生成某个类的多少个对象,这些对象都会对应于同一个 Class 对象。
Jdk5.0中出现的新特性的更多相关文章
- C#6.0 中的那些新特性
C#6.0 中的那些新特性 前言 VS2015在自己机器上确实是装好了,费了老劲了,想来体验一下跨平台的快感,结果被微软狠狠的来了一棒子了,装好了还是没什么用,应该还需要装Xarmain插件,配置一些 ...
- C# 9.0中引入的新特性init和record的使用思考
写在前面 .NET 5.0已经发布,C# 9.0也为我们带来了许多新特性,其中最让我印象深刻的就是init和record type,很多文章已经把这两个新特性讨论的差不多了,本文不再详细讨论,而是通过 ...
- VS2015 C#6.0 中的那些新特性(转载)
自动属性初始化 (Initializers for auto-properties) 以前我们是这么写的 为一个默认值加一个后台字段是不是很不爽,现在我们可以这样写 只读属性的初始化(Getter-o ...
- VS2015 C#6.0 中的那些新特性(转自http://www.cnblogs.com/henryzhu/p/new-feature-in-csharp-6.html)
自动属性初始化 (Initializers for auto-properties) 以前我们是这么写的 为一个默认值加一个后台字段是不是很不爽,现在我们可以这样写 只读属性的初始化(Getter-o ...
- C#6.0中10大新特性的应用和总结
微软发布C#6.0.VS2015等系列产品也有一段时间了,但是网上的教程却不多,这里真对C#6.0给大家做了一些示例,分享给大家. 微软于2015年7月21日发布了Visual Studio 20 ...
- Android3.0中ActionBar的新特性
1. ActionBar(活动栏)替代了显示在屏幕顶端的标题栏.主要负责显示菜单,widget,导航等功能,主要包括:@ 显示选项菜单中的菜单项到活动栏:@ 添加可交互的视图到活动栏作为活动视图: ...
- VS2015 C#6.0 中的那些新特性
本人个人博客原文链接地址为http://aehyok.com/Blog/Detail/66.html. 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok ...
- iOS中的项目新特性页面的处理
一般项目中都会出现新特性页面,比如第一次使用应用的时候,或者在应用设置里查看新特性的时候会出现. 这里,选择新建一个专门处理项目新特性的控制器,来完成功能. 首先是 NewFeaturesViewCo ...
- Android 5.0(棒棒糖))十大新特性
Android 5.0(棒棒糖))十大新特性 1. 全新Material Design设计风格 Android Lollipop全新的设计语言是受到了多种因素影响,是一种大胆的平面化创新.换句话说,谷 ...
随机推荐
- 【转】404、500、502等HTTP状态码介绍
基本涵盖了所有问题HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HT ...
- C 语言循环之break、continue
在C 编程的过程中,我们很多时候都会用到循环,但有时需要中途跳出整个循环,或跳过某一次循环,这时就需要用到break或continue,关于二者的使用很多书籍和博文都有很相近的说明,此处不做任何讲解, ...
- winForm 打印预览
自己很少写技术博客,虽然已经干程序员两年多了,winform开发,web开发都干过,不论项目大小对于.net的相关技术也是了解的,如mvc,wcf,wpf,silverlight,socekt通讯,n ...
- 《疯狂的android讲义第3版》读书笔记
第一章.开始启程,你的第一行android代码 1.android系统架构: 1)linux内核层:为底层硬件提供驱动,如显示驱动.音频驱动.照相机驱动.蓝牙驱动.Wifi驱动.电源管理等 2)系统运 ...
- VLAN和Trunk
Vlan实验题: 如图所示 解答过程 (一)相同vlan之间的设备全连通 1. 在SW1和SW2上分别创建vlan2和vlan3, 命令如下 SW1# vlan database SW1(vlan)# ...
- IOS系统框架
IOS系统框架:ios架构号MAC OS的基础框架相似:ios扮演底层硬件和应用程序的中介,底层为所有应用程序提供基础服务,高层则包含一些复杂巧妙的技术和服务,并且创建的应用程序不能直接访问硬件. C ...
- android.support.v7.app.AppCompatActivity
1.Android Studio (api 23) 新建项目的时候 Activity public class MainActivity extends AppCompatActivity 2.系统默 ...
- Hibernate从入门到精通(七)多对一单向关联映射
上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...
- Python socket模拟HTTP请求
0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很 ...
- 【BZOJ 1022】 [SHOI2008]小约翰的游戏John
Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...