JDK1.5java新特性
JDK1.5java增加的新特性:
自动装箱/拆箱 增强for 泛型 枚举 静态导入 可变参数
1 自动装箱/拆箱
* JDK1.5允许开发人员把一个基本类型直接赋给对应的包装类变量或者赋给Object类型的变量,这个过程称为自动装箱。
* 自动装箱和自动拆箱相反,即把包装类对象直接赋给一个对应的基本类型变量。
也就是基本类型与其对应的引用类型之间的转换,但是不能乱用,一般我们要采用基本类型,如果在使用时不注意,可能会造成程序低效率运行。
int ----- Integer
float ----- Float
double ---- Double
char ------- Character
boolean ---- Boolean
short ---- Short
long ---- Long
byte ---- Byte
比如:
Long sum = 0;
for(long i =0;i<10000;i++){
sum += i;
}
此处造成程序低效率就在于频繁的进行拆箱装箱操作。注意sum被定义成了Long而不是long。
还有两个高精度的类:
BigInteger
BigDecimal
2 增强for
优缺点:
优点:遍历更简单,在集合遍历中增强for就是代替迭代器的
弊端:增强for的目标不能为null(即数组或集合不能为null),所以在遍历之前需要进行判断
格式:
for(元素数据类型 变量:数组或集合){
....................................
使用变量,该变量就是集合或者数组中的元素
}
举例:
String[] names = {"小明","小李","小王"};
for(String name : names){
System.out.println("hello "+name);
}
3 泛型
引入泛型的好处:
1)去除了原先必须的冗长的强制类型转换
2)能够在编译期检测出错误,不至于在运行时才发现,消除了潜在的错误,提高代码运行的可靠性。
3)使用XJad.exe反编译工具可以看到,在编译期间泛型被擦除。
泛型基本应用:
1)泛型类
*把泛型定义在类上
*格式:public class 类名<泛型类型1.....>
*注意:泛型类型必须是引用类型
2)泛型方法
* 把泛型定义在方法上:方法可以接收任意类型
* 格式:public<泛型类型> 返回类型 方法名(泛型类型)
3)泛型接口
* 把泛型定义在接口上
* 格式:public interface 接口名<泛型类型1.....>
例1:一个简单的泛型类
package basic.demo;
public class FanTypeClass<T>{
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
测试类:
package basic.demo;
public class FanTypeDemo {
public static void main(String[] args) {
FanTypeClass<String> obj1 = new FanTypeClass<String>(); //使用泛型
obj1.setObj("hello"); //这时候set方法接收的参数必须是String,如果不传该类型,在编译期就会报错
String s = obj1.getObj(); //这种方式下不需要强转
System.out.println(s);
FanTypeClass obj2 = new FanTypeClass(); //没使用泛型
obj2.setObj(3);
int num = (int) obj2.getObj(); //需要进行强转,如果不小心写错了就会产生ClassCastException,即类型转换异常
String num = (String)obj2.getObj(); //这样写在编译期并不会报错,但是一旦执行就会产生类型转换异常
System.out.println(num);
}
}
例2:泛型方法的使用
package basic.demo;
public class FanTypeMethod {
public <T> void show(T t){
System.out.println(t);
}
}
测试类:
package basic.demo;
public class FanTypeDemo {
public static void main(String[] args) {
FanTypeMethod ft = new FanTypeMethod();
ft.show("hello");
ft.show(100);
ft.show(true);
}
}
输出结果:
hello
100
true
例3 泛型接口
分为两种用法:子类实现时已知将来使用类型和子类实现时未知使用类型(这一种常见)
package basic.demo;
public interface FanTypeInter<T>{
public abstract void show(T t);
}
package basic.demo; //子类未知要使用的类型,故还是用泛型T
public class FanTypeInterImpl<T> implements FanTypeInter<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
测试:
package basic.demo;
public class FanTypeDemo {
public static void main(String[] args) {
FanTypeInter<String> fti1 = new FanTypeInterImpl<String>();
fti1.show("hello");
FanTypeInter<Integer> fti2 = new FanTypeInterImpl<Integer>();
fti2.show(100);
}
}
泛型高级应用(通配符):
1)泛型通配符 <?>
*任意类型,如果没有明确,那么就是Object以及任意的java类
2)? extends E
* 向下限定,E及其子类
3)? super E
* 向上限定,E及其父类
例:理解高级应用:红色标注皆为错误用法
package basic.demo;
import java.util.ArrayList;
import java.util.List;
public class FanTypeSeniorDemo {
public static void main(String[] args) {
//泛型如果明确写,必须前后一致
// List<Object> list1 = new ArrayList<Object>();
// List<Object> list2= new ArrayList<Person>(); //error
// List<Object> list3 = new ArrayList<Student>(); //error
// List<Object> list4 = new ArrayList<Teacher>(); //error
//?表示任意类型都是可以的
// List<?> list1 = new ArrayList<Object>();
// List<?> list2= new ArrayList<Person>();
// List<?> list3 = new ArrayList<Student>();
// List<?> list4 = new ArrayList<Teacher>();
//? extends E 向下限定:E及其子类
// List<? extends Person> list1 = new ArrayList<Object>(); //error
// List<? extends Person> list2= new ArrayList<Person>();
// List<? extends Person> list3 = new ArrayList<Student>();
// List<? extends Person> list4 = new ArrayList<Teacher>();
//? super E 向上限定 E及其父类
List<? super Person> list1 = new ArrayList<Object>();
List<? super Person> list2= new ArrayList<Person>();
List<? super Person> list3 = new ArrayList<Student>(); //error
List<? super Person> list4 = new ArrayList<Teacher>(); //error
}
}
class Person{
}
class Student extends Person{
}
class Teacher extends Person{
}
4 枚举
关键字:Enum,用于定义一个枚举类
为什么需要枚举?
一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。
枚举类具有如下特性:
枚举类也是一种特殊形式的Java类。
枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。
枚举类也可以实现接口、或继承抽象类。
JDK5中扩展了switch语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型。
若枚举类只有一个枚举值,则可以当作单例设计模式使用。
Java中声明的枚举类,均是java.lang.Enum类的子类,它继承了Enum类的所有方法。
常用方法:
name():返回此枚举常量的名称,在其枚举声明中对其进行声明。
ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。也可以称为索引
valueOf(Class enumClass, String name)
values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。
5 静态导入
可以直接导入到方法的级别。
格式:import static 包名....类名.方法名;
注意:
*方法必须是静态的
*如果有多个同名的静态方法,容易不知道使用谁??这个时候要使用该特性,需要加前缀。由此可见,意义不大。所以一般不用,仅需知道就行。
例1:使用静态导入,使用静态方法时直接使用。
package basic.demo;
import static java.lang.Math.max;
import static java.lang.Math.min;
public class StaticImportDemo {
public static void main(String[] args) {
int num1 = 23;
int num2 = 30;
max(num1,num2);
min(num1,num2);
}
}
例2:编写重名的静态方法,然后一起在StaticImportDemo使用:
package basic.demo;
public class MyMath {
public static int max(int num1,int num2){
return num1>num2?num1:num2;
}
public static int min(int num1,int num2){
return num1>num2?num2:num1;
}
}
package basic.demo;
import static java.lang.Math.max;
import static java.lang.Math.min;
import static basic.demo.MyMath.max;
import static basic.demo.MyMath.min; //使用都加前缀了,也就不需要静态导包了
public class StaticImportDemo {
public static void main(String[] args) {
int num1 = 23;
int num2 = 30;
java.lang.Math.max(num1,num2); //必须加包名前缀,否则报错
basic.demo.MyMath.min(num1,num2);//必须加包名前缀,否则报错,但是这样一加前缀就没有导包的意义了。。。。。
}
}
6 可变参数
Effective Java不建议使用该特性,而且在java编程思想中也说了此特性的隐患。
*定义方法的时候不知道定义多少个参数,故引入可变参数的概念。
使用格式:
* 修饰符 返回值类型 方法名(数据类型...变量名){}
注意:
* 这里的变量其实是一个数组
*如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个,否则编译器报错。
举例:
*Arrays工具类中的一个方法:
public static <T>List<T> asList(T...a)
例1:简单使用:
package basic.demo;
public class ChangeParaDemo {
public static void main(String[] args) {
int[] data = {1,2,3,4};
System.out.println(sum(data));
int sum = sum(2,3,4,5);
System.out.println(sum);
sum = sum(2,5);
System.out.println(sum);
}
private static int sum(int...num) {
int result = 0;
for(int i:num){
result += i;
}
return result;
}
}
例2 方法中有多个参数:java在编译器期间就强调可变参数必须在最后的位置。
package basic.demo;
public class ChangeParaDemo {
public static void main(String[] args) {
int sum = sum(100,1,2,3,4);
System.out.println(sum); //如果把可变参数放在方法参数的最后,结果是10
int sum = sum(1,2,3,4,100);
System.out.println(sum); //如果可变参数放在前面,会报错
}
private static int sum(int special,int...num) {
int result = 0;
for(int i:num){
result += i;
}
return result;
}
//error: 错误写法
//出错原因,因为可变参数变量其实是一个数组,如果把可变参数放在前面,则special变量被视为数组的一部分,也就是说你只传了一个参数,和原方法参数个数不一致
private static int sum(int...num,int special) {
int result = 0;
for(int i:num){
result += i;
}
return result;
}
}
JDK1.5java新特性的更多相关文章
- JDK1.7新特性
jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...
- jdk1.6新特性
1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...
- JDK1.8 新特性
jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...
- JDK1.6新特性,WebService强化
Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...
- JDK1.5新特性,基础类库篇,集合框架(Collections)
集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...
- JDK1.7新特性(2):异常和可变长参数处理
异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...
- jdk1.8新特性应用之Iterable
我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...
- jdk1.8新特性之方法引用
方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...
- jdk1.8新特性之lambda表达式
lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...
随机推荐
- LabVIEW之生产者/消费者模式--队列操作
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
- linux 使用dd命令清空文件
- Gruntjs提高生产力(一)
gruntjs是一个基于nodejs的自动化工具,只要熟悉nodejs或者又一定js经验就可以熟练应用. 1. 安装 a. 保证已安装了nodejs,并带有npm b.安装客户端命令行工具,grunt ...
- Spring Boot Logback几种日志详解
日志对于应用程序来说是非常重要的,Spring框架本身集成了不少其他工具,我们自身的应用也会使用到第三方库,所以我们推荐在Spring应用中使用SLF4J/Logback来记录日志. SLF4J与Lo ...
- 【MySQL】查看当前存储引擎
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你的mysql当前默认的存储引擎: m ...
- Quartz教程:快速入门
原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...
- redis的list类型以及其操作
lists类型 给你个图;' lists类型以及操作List是一个链表结构,主要功能是push.pop.获取一个范围的所有值等等,操作中key理解为链表的名字.Redis的list类型其实就是每一个子 ...
- Python的集合框架
Python内置了四种集合框架(list.tuple.dict.set) list:list是一种有序的集合 list里面的元素的数据类型也可以不同,list元素也可以是另一个list In [28] ...
- CSS 清除浮动 clear 属性
CSS 清除浮动 clear 属性用于设定元素哪一侧不允许有其他浮动元素(而并非取消元素的浮动). 可能的取值如下: 取值 说明 none 默认值,允许两侧都有浮动元素 left 左侧不允许有其他浮动 ...
- 《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法
RHS语法 使用说明 RHS是满足LHS条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息.RHS主要用于处理结果,因此不建议在此部分再进行业务判断.如果必须要业务判断需要考虑规则设计的 ...