黑马程序员_学习笔记_Java加强_JDK1.5部分新特性

来源:互联网 发布:手机维修培训软件 编辑:程序博客网 时间:2024/05/20 18:44


1、静态导入

Import可以导入某一类或某个包中的所有类。

Import static导入一个类中某个静态方法或所有静态方法。

下面是一个典型 的静态导入的事例。

import static java.lang.Math.*;public class StaticImport {public static void main(String[] args) {System.out.println(abs(3 - 6));System.out.println(max(3, 6));}}

 

2、可变参数

一个方法接受的参数个数不固定。以前的方法是多次重载。

特点:

只能出现在参数列表的最后。

…位于变量类型和变量名之间,前后有无空格均可。

调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

下面是可变参数的应用。

public class VariableParameter {public static void main(String[] args) {System.out.println(add(2,4,5,7,8));System.out.println(add(2,3,8));}public static int add(int x,int...args){int sum = 0;/*for(int i = 0;i<args.length;i++){sum+=args[i];}*/for(int arg:args){sum+=arg;}return sum;}}

 

3、增强for循环

语法:for(type 变量名:集合变量名){…}

注意事项:

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

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

举例:

public class VariableParameter {public static void main(String[] args) {System.out.println(add(2,4,5,7,8));System.out.println(add(2,3,8));}public static int add(int x,int...args){int sum = 0;/*for(int i = 0;i<args.length;i++){sum+=args[i];}*/for(int arg:args){sum+=arg;}return sum;}}

 

4、基本数据类型的装箱与拆箱

自动装箱:Integer i1 = 12;

自动拆箱:System.out.println(i1+8);

基本数据类型的对象缓存:

基本数据类型中,某些常用的值,用相应的类包装成相应的对象,存入常量池的缓存中。再创建一个对象时,如果值在范围内,就会直接到缓存中寻找,调用更加方便。

享元模式flyweight:

有多个数值比较小的对象,他们有很多属性相同,把他们变成一个对象,相同属性层位内部状态。那些不同的属性变成方法的参数,称之为外部状态。这种模式成为享元模式,可以优化内存。

 

5、枚举

枚举意义:

枚举就是要让某个类型变量的取值只能为若干个固定值中的一个,否则编译器就会报错。因此枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发中不能实现这一目标。

例如:星期或性别等的定义。

用普通的java类模拟枚举的实现原理。

下面的代码是用普通类来模拟了枚举的原理

public abstract class WeekDay {        private WeekDay(){}        public final static WeekDay SUN=new WeekDay(){            public WeekDay nextDay(){                return MON;            }        };        public final static WeekDay MON=new WeekDay(){            public WeekDay nextDay(){                return SUN;            }        };        public abstract WeekDay nextDay();        public String toString(){            return this==SUN?"SUN":"MON";        }    }    

采用抽象方法定义一个nextDay就将大量的if-else语句转换成一个个独立的类。

 

 

枚举的基本应用:

下面为枚举的基本应用:

public class EnumTest {public static void main(String[] args) {WeekDay weekDay2 = WeekDay.FRI;System.out.println(weekDay2);System.out.println(weekDay2.ordinal());System.out.println(weekDay2.getDeclaringClass());System.out.println(weekDay2.getClass());System.out.println(WeekDay.valueOf("SUN").toString());System.out.println(WeekDay.values().length);}public enum WeekDay{SUN(1),MON(),TUE,WED,THU,FRI,STA;private WeekDay(int day){System.out.println("second");}private WeekDay() {System.out.println("first");}}}

 

枚举的高级应用:

枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。

枚举元素必须位于枚举体中最开始的部分,枚举元素列表后要加分号与其他成员相分隔。

带构造方法的枚举:

构造方法必须定义为私有;

如果有多个构造方法,通过参数列表判断选择哪个方法。

枚举元素后,带不带括号都表示调用默认的构造方法;括号中带有参数,才表示调用指定方法。

交通灯枚举的创建方法:

定义枚举TrafficLamp。

实现普通方法next。

实现抽象的next方法,每个元素分别由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方法进行定义。

增加表示时间的构造方法。

请看代码:

public enum TrafficLamp{RED(30){public TrafficLamp nextLamp() {return GREEN;}},GREEN(45){public TrafficLamp nextLamp() {return YELLOW;}},YELLOW(5){public TrafficLamp nextLamp() {return RED;}};public abstract TrafficLamp nextLamp();private int time;private TrafficLamp(int time){this.time=time;}}

这是一段不完整的代码,为的是便于理解枚举更深层的应用。

枚举只有一个成员时,就可以作为一种单例的实现方式。