标签:
Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
JDK1.5新特性:
为什么会出现新特性:
新的技术出现是为了解决老的问题,Java语言为了提高开发者的开发效率,对之前的某些不利于提高效率的技术进行改进。
静态导入:
静态导入:可以导入某个类下的静态方法,静态导入后,可以不写类名而直接使用此类下的静态方法。
语法:import static 包名.类名.静态方法
代码示例:
package com.itheima.day1; /** * 静态导入 * @author Administrator */ import static java.lang.Math.*;//静态导入MAth类下的所有静态方法 import static java.lang.System.*; public class StaticImportDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub out.println(max(1, 6)); out.println(abs(3-7)); } }
好处:简化了对类中静态属性和方法的调用,简化代码书写。
弊端:如果在程序中自己定义了与被静态导入的静态方法同名的方法,JVM将不明了该使用哪一个,所以一般不建议静态导入。
可变参数:
可变参数的出现是为了解决一个方法可以接受的参数个数不确定的问题。
例如:
System.out.println(add(2,3));
System.out.println(add(2,3,5));
如果用方法重载的方式解决,则需要写多个重载的方法,需要接受的参数个数变化一次,就必须再多写一次重载方法,造成代码繁杂;使用可变参数,可以避免这种情况。
示例:
public class VariableParameterTest { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(add(2,3)); System.out.println(add(2,3,5)); } public static int add(int x,int... args){ int sum = x; for(int i=0;i<args.length;i++){ sum = sum+args[i]; } return sum; } }
可变参数的原理:
调用可变参数的方法时,编译器将自动创建一个数组保存传递给方法的可变参数。
可变参数特点与注意事项:
1、可变参数只能出现一次且只能出现在参数列表的最后
2、调用可变参数的方法时,编译器自动创建一个数组用于接受传递进来的可变参数。
3、可变参数格式:参数类型 ... 参数名称,省略符前后有无空格均可。
增强for循环:
引入增强for循环的原因:
在1.5版本之前,遍历数组或集合中的元素,需要先获取数组的长度或集合的迭代器,比较麻烦。
因为在1.5版本中增加了一种新的语法:增强for循环。
语法格式:
for(修饰符 变量类型 变量 :需迭代的数组或集合){}
代码示例:
/** * Java1.5新特性:增强for循环 * @author Administrator */ public class EnhanceForLoop { public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = new int[]{3,4,5,6,6,7,4,6,9}; for(int x: arr){ System.out.println(x); } } }
自动装箱与拆箱:
自动装箱:JDK 1.5的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变量,这个过程称之为自动装箱。
自动拆箱:自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量。
代码示例:
/** * Java1.5新特性:自动装箱与拆箱 * @author Administrator */ public class AutoBox { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Integer i = 3;//自动装箱 int x = i;//自动拆箱 System.out.println(i+3);//自动装箱与拆箱 Integer i1 = 23; Integer i2 = 23; System.out.println("i1==i2?:"+(i1==i2)); Integer i3 = 128; Integer i4 = 128; System.out.println("i3==i4?:"+(i3==i4)); } }
程序结果:
6 i1==i2?:true i3==i4?:false
可以看出i1==i2与i3==i4的打印结果不一样。
原因是因为byte常量池的原因。
byte常量池:
对于这些基本数据类型的整数要集装成Integer对象的时候,如果这个数字是在1个字节之内(-128~127)的数字,就缓存在byte常量池中,下次再包装一个基本数据类型整数时,如果这个也在1个字节之内,那就先去这个常量池中去寻找,如果找到,就直接拿来用,这样节省了内存空间;如果没有,则创建后存入缓存池,以便下次使用。
这是一种设计模式:享元模式(flyweight)
享元模式:
就是很多个小的对象,他们具有很多相同的属性,将他们封装成一个对象,把他们那些不同的属性变为这个对象方法的参数,称之为这个对象的外部状态;那些他们都具有相同的属性称为这个对象的内部状态。
例如:示例中的Integer对象,在-128~127范围内的Integer对象,用的频率比较高,就会作为同一个对象,因此结果为true。超出这个范围的就不是同一个对象,因此结果为false。
享元模式的应用:
1、Word中的英文字母。
每个对象值是出现的位置不同(坐标),所以可用一个对象调用位置的方法。
如,字母Q:Q.zuobiao(int x,int y),将高度重复使用的char类型的字母Q封装成一个对象使用。
2、图标:Window下的文件夹图标,只是名称这个属性不同,包含了很多其他相同的属性,那么可以应用享元模式。
枚举:
为什么需要枚举?
一个对象在初始化时,它能够被初始化的值不能是任意的,只能是有限选择范围内的值。比如星期几,这个数字不能是任意选择的,必须有个选择范围。
此类问题在JDK1.5之前只能采用自定义带有枚举功能的类解决,而在1.5之后可以用枚举解决。
JDK1.5之后出现了一个新关键字enum,用于定义一个枚举类。
自定义类实现枚举功能:
1、需要私有化构造方法。
2、每个成员变量都是这个自定义类的对象,并且要公有并静态修饰。
3、可以自定义公有非抽象方法或抽象方法。
代码示例:
/* * 用一个普通类模拟枚举 * :一周的星期数(为简化,将一周假设为两天) */ public class WeekDay1 { private WeekDay1(){} public final static WeekDay1 SUN = new WeekDay1(); public final static WeekDay1 MON = new WeekDay1(); public WeekDay nextDay(){ if(this == SUN) return MON; else return SUN; }
public String toString(){ return this==SUN?"SUN":"MON"; } }
在上面示例中,也可以采用抽象方法定义nextDay()将if...else...语句转移到一个个独立的对象中去实现。
代码示例:
/* * 用一个普通类模拟枚举 * :一周的星期数(为简化,将一周假设为两天,其他都一样) */ public abstract class WeekDay1 { private WeekDay1(){} public final static WeekDay1 SUN = new WeekDay1(){ public WeekDay1 nextDay(){ return MON; } }; public final static WeekDay1 MON = new WeekDay1(){ public WeekDay1 nextDay(){ return SUN; } }; /*public WeekDay nextDay(){ if(this == SUN) return MON; else return SUN; }*/ public abstract WeekDay1 nextDay(); public String toString(){ return this==SUN?"SUN":"MON"; } }
枚举的定义:
代码示例:
public enum WeekDay{ SUN,MON,TUE,WED,THI,FRI,SAT; }
Java中声明的枚举类,都是java.lang.Enum的子类,它继承了Enum类中的所有方法。
常用方法:
name();
ordinal();
valueOf(String name);
values():
代码示例:
public class EnumTest { public static void main(String[] args){ WeekDay day = WeekDay.FRI; System.out.println("day:"+day); System.out.println("day.name:"+day.name()); System.out.println("day.ordinal:"+day.ordinal()); WeekDay day2 = WeekDay.valueOf("SUN"); System.out.println("day2:"+day2); WeekDay[] days = WeekDay.values(); for(WeekDay day3: days){ System.out.println(day3); } }
}
实现带有构造方法和抽象方法的枚举示例:
public enum TrafficLamp{ GREEN(60) { @Override public TrafficLamp nextLamp() { // TODO Auto-generated method stub return YELLOW; } }, RED (30){ @Override public TrafficLamp nextLamp() { // TODO Auto-generated method stub return GREEN; } }, YELLOW (5){ @Override public TrafficLamp nextLamp() { // TODO Auto-generated method stub return RED; } }; private int time; private TrafficLamp(int time){this.time=time;} public abstract TrafficLamp nextLamp(); }
枚举类总结:
1、枚举类是一种特殊形式的Java类。
2、枚举类中声明的每个枚举值都代表这个枚举类的一个示例对象。
3、在枚举类中,可以声明属性、方法、构造方法。但枚举类的构造方法必须私有修饰。
4、枚举类也可以实现接口,继承抽象类。
5、在枚举类中只有一个枚举值时,则可以当作单例模式使用。
6、在枚举类被加载时,枚举类中的所有枚举值也都被加载。
7、1.5版本后,枚举类对象可以被switch语句接受。
标签:
原文地址:http://www.cnblogs.com/alvis2015/p/4298559.html