JDK5引入的新特性

1.静态导入

   静态导入及导入一个类中的某个静态方法。

   Math类是一final类里面定义了两个静态变量和大量提供运算的静态方法。

   当一个类用final来修饰时,及这个类不能被改变,也就是不能被继承。

   当一个方法被final修饰时,这个方法不能被重写。

   当一个成员变量被final修饰时,这个变量为常量,必须赋予初值不能改变。

   当一个参数被final修饰时,这个参数不能被改变。

  在方法的局部变量前加final可以在该方法中的内部类访问。

java程序运行时,类的字节码文件将被加载到内存,为类中的static方法分配了入口地址,当类创建第一个对象时为类中的实例方法分配入口地址,再创建对象时不再分配入口地址,也就是说方法的入口地址被所有对象共享。

2.可变参数

   一个方法接收的参数不定可用可变参数来实现。可变参数只能出现在参数列表的最后,调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组形式访问该可变参数。例如:

    public static int add(int n,int... is){

int sum=n;

for(int i=0;i<is.length;i++){

sum+=is[i];

}

return sum;

}

 

  方法的重写,在子类中重写父类中的方法时不能降低方法的访问权限,如父类中的protected方法,子类重写时要为protectedpublic方法,父类的private方法子类不能重写。

   

3.增强for循环

   for(type  变量名:集合变量名){...}

   迭代变量必须在()中定义!

   集合变量可以是数组或实现了iterable接口的集合类。

   该集合可以使用Iterator<Titerator()方法获得Interface Iterator<E>迭代器,从迭代器中取出集合元素。

4.自动拆箱和装箱

 自动拆箱:Integer类型的对象可以自动转换成int型与int型数据运算。

 自动装箱:Integer i3=4

享元模式 flyweight

  在java中有很多使用频繁的对象,我们只创建一次,把不同的属性用方法的参数形式传入(外部状态),相同的属性作为成员变量(内部状态)。在以后每次使用时该对象时不需创建只需调用就可以了。

   -128127Integer类型的对象java用享元模式设计。

  比较两个对象是否为同一个对象用==

     Integer i1=7;

     Integer i2=7;

     System.out.println(i1==i2);结果true,享元模式设计引用同一个对象。

     Integer i1=new Integer(7);

     Integer i2=new Integer(7);

     System.out.println(i1==i2);结果fault,分别创建了两个对象

 

     String s3="abc";

     String s4="abc";

     System.out.println(s1==s2); 结果为trues3s4引用同一个对象。

     System.out.println(sum(5,4));

     String s1=new String("abc");

     String s2=new String("abc");

     System.out.println(s1==s2);结果为fault,分别创建了两个对象。

5.类型安全的枚举

  用普通类实现枚举类型

    定义枚举类型变量时,首先创建一个类,再类中定义该类型的常量,构造方法设为私有,及不能在类的外部实例化新的对象。

   public abstract class WeekDay {

    //构造方法声明为私有,在外面不能创建新的对象

private WeekDay() {

}

//定义枚举类型对象元素为final,static

public final static WeekDay SUN=new WeekDay(){

@Override

public WeekDay nextDay() {

return MON;

}

};

public final static WeekDay MON=new WeekDay(){

@Override

public WeekDay nextDay() {

return SUN;

}

};

public abstract WeekDay nextDay(); 

public String toString(){

return this==SUN?"SUN":"MON";

}

}

Abstract修饰的类为抽象类,抽象类不能直接实例化对象,要有其子类实例化对象。

抽象类中可以有抽象方法,抽象方法用abstract修饰,不能有方法体,且抽象方法只能在抽象类中出现。

 

 

 

 

用专门的枚举类实现:

枚举相当于一个类,枚举元素相当于该类实例化的对象。

public enum WeekDay{

SUN,MON,TUE,WED,THI,FRI,STA;

}

该枚举类有几个静态方法如values()返回一个装有所有枚举元素的数组。

 WeekDay.valueOf("SUN");方法可以把String类型的name转换成该类型的对象

带有构造方法的枚举:

public enum WeekDay{

SUN(0),MON,TUE,WED,THI,FRI,STA;

        private WeekDay(){System.out.println("first");}

        private WeekDay(int n){System.out.println("second");}

}

创建枚举时带上参数可以指定使用哪个构造方法创建枚举元素。

 

带有抽象方法的枚举类型交通灯实现

    当类中定义抽象方法时,枚举元素便不能有该类产生,要有该枚举类的子类产生,用内部类的方法实现。

//带有抽象方法的枚举类型实现

public enum TrafficLamp{

RED(30){

public TrafficLamp nextLamp() {

return GREEN;

}},

GREEN(40){

public TrafficLamp nextLamp() {

 

return YELLOW;

}},

YELLOW(5){

public TrafficLamp nextLamp() {

return RED;

}};

private int time;

private TrafficLamp(int time){this.time=time;}

//枚举中的抽象方法下一个元素

public abstract TrafficLamp nextLamp();

}

当枚举类型只有一个元素时,可以作为单例模式的一种实现方式。

6.泛型

   所谓泛型:就是变量类型的参数化。

 

你可能感兴趣的:(jdk)