1、静态导入:
格式:import static java.lang.Math.*;
静态导入后,代码中就可以直接使用导入类中的静态方法,而不需要再加类名。
静态导入可以导入一个类,或某个包中的所有类。
package cn.itcast.day1;
//静态导入
//import static java.lang.Math.max;
//导入全部静态方法
import static java.lang.Math.*;
public class StaticImport {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(max(3, 6));
System.out.println(abs(3 - 6));
}
}
2、可变参数
- 只能出现在参数列表的最后;
- ...位于变量类型和参数名之间,前后有无空格都可以;
- 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
3、增强for循环(for each)
语法:for(type 变量名 : 集合变量名){...}
- 迭代变量必须在 ( ) 中定义!
- 集合变量可以是数组或实现了Iterable接口的集合类。
4、基本数据类型的自动装箱和拆箱
package cn.itcast.day1;
public class AutoBox {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer iObj = 3;//自动装箱
System.out.println(iObj + 12);//自动拆箱
//享元设计模式
//-128 ~ 127之间的Integer对象使用同一个对象。
Integer i1 = 13;
Integer i2 = 13;
System.out.println(i1 == i2);//true
//超过这个范围的Integer对象每次都要新建一个对象。
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);//false
Integer i5 = Integer.valueOf(3);
Integer i6 = Integer.valueOf(3);
System.out.println(i5 == i6);//true
}
}
扩展:享元设计模式
5、枚举
package cn.itcast.day1;
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay weekDay = WeekDay.FRI;
System.out.println(weekDay);
System.out.println(weekDay.name());
System.out.println(weekDay.ordinal());
System.out.println(weekDay.getClass());
//静态方法
System.out.println(WeekDay.valueOf("SUN"));
System.out.println(WeekDay.values().length);
}
//枚举类
public enum WeekDay{
SUN(0),MON(),TUE,WED,THI,FRI,SAT; //列表后面没有内容时,可以没有;
private WeekDay() {}
private WeekDay(int day){}
}
//带有抽象方法的枚举类
public enum TrafficLamp{
RED (45){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},GREEN(30) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},YELLOW (3){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.setTime(time);}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}
//枚举只有一个成员时,就可以作为一种单例的实现方式。
}
用普通类模拟枚举类
package cn.itcast.day1;
public abstract class WeekDayDemo {
private WeekDayDemo(){}
public final static WeekDayDemo SUN = new WeekDayDemo(){
@Override
public WeekDayDemo nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public final static WeekDayDemo MON = new WeekDayDemo(){
@Override
public WeekDayDemo nextDay() {
// TODO Auto-generated method stub
return TUE;
}};
public final static WeekDayDemo TUE = new WeekDayDemo(){
@Override
public WeekDayDemo nextDay() {
// TODO Auto-generated method stub
return WEN;
}};
public final static WeekDayDemo WEN = new WeekDayDemo(){
@Override
public WeekDayDemo nextDay() {
// TODO Auto-generated method stub
return THI;
}};
public final static WeekDayDemo THI = new WeekDayDemo(){
@Override
public WeekDayDemo nextDay() {
// TODO Auto-generated method stub
return FRI;
}};
public final static WeekDayDemo FRI = new WeekDayDemo(){
@Override
public WeekDayDemo nextDay() {
// TODO Auto-generated method stub
return SAT;
}};
public final static WeekDayDemo SAT = new WeekDayDemo(){
@Override
public WeekDayDemo nextDay() {
// TODO Auto-generated method stub
return SUN;
}};
//用抽象方法定义nextDay()
public abstract WeekDayDemo nextDay();
/* public WeekDay nextDay(){
if (this == SUN) {
return MON;
}else if (this == MON) {
return TUE;
}else if (this == TUE) {
return WEN;
}else if (this == WEN) {
return THU;
}else if (this == THU) {
return FRI;
}else if (this == FRI) {
return SAT;
}
return SUN;
}*/
}
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法
枚举元素必须位于枚举体中最开始的部分,枚举元素列表的后面要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报错。
带构造方法的枚举
- 构造方法必须定义成私有的
- 如果有多个构造方法,该如何选择哪个构造方法?
- 枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
带方法的枚举
如上例
- 定义枚举TrafficLamp
- 实现普通的next方法
- 实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
- 增加上表示时间的构造方法
枚举只有一个成员时,就可以作为一种单例的实现方式。