Java的一些新特性
可变参数
本质上还是一个数组,适用于方法参数不确定数目的情况。
public class Temp {
public static void main(String[] args){
method(1);
method(1,2);
method(1,2,3);
}
/**
* 可变参数本质上还是一个数组
* @param args
*/
public static void method(int...args){
for (int i = 0;i < args.length;i++) {
System.out.print(args[i]+" , ");
}
System.out.println();
}
}
foreach
for (数据类型 变量:数组|集合){
to do sth...
}
public class Temp {
public static void main(String[] args){
method(1);
method(1,2);
method(1,2,3);
}
/**
* 可变参数本质上还是一个数组
* @param args
*/
public static void method(int...args){
for (int i:args){
System.out.print(i+" , ");
}
System.out.println();
}
}
foreach与正常for循环效率对比
直接for循环效率最高,其次是迭代器和 ForEach操作
泛型
枚举
之前在讲解构造函数私有化时,介绍了多例设计模式,JDK 1.5之后,Java使用了一个新的关键字进行定义enum,默认都继承了Enum:
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
......
}
public class Temp {
public static void main(String[] args) {
for (Color color : Color.values()) {
System.out.println(color.name() + " : " + color.ordinal());
}
// 输出
// RED : 0
// GREEN : 1
// BLACK : 2
}
}
enum Color {
RED, GREEN, BLACK;
}
需要注意的是,枚举的构造方法必须私有化(非public),且每一个定义的对象,必须写在首行。
public class Temp {
public static void main(String[] args) {
System.out.println(Color.BLACK.toString());
}
}
enum Color {
RED("红色"), GREEN("绿色"), BLACK("黑色");
private String msg;
/**
* 如果在枚举类中,定义了构造方法,则每个枚举对象必须显示调用构造方法,否则编译出错
* @param msg
*/
private Color(String msg){
this.msg = msg;
}
@Override
public String toString() {
return this.msg;
}
}
public class Temp {
public static void main(String[] args) {
System.out.println(Color.BLACK.getMsg());
}
}
/**
* 如果枚举中直接定了抽象方法,那么每个枚举对象都要去实现它
*/
enum Color {
RED("红色"){
@Override
public String getMsg() {
return this.toString();
}
}, GREEN("绿色"){
@Override
public String getMsg() {
return this.toString();
}
}, BLACK("黑色"){
@Override
public String getMsg() {
return this.toString();
}
};
private String msg;
/**
* 如果在枚举类中,定义了构造方法,则每个枚举对象必须显示调用构造方法,否则编译出错
* @param msg
*/
private Color(String msg){
this.msg = msg;
}
@Override
public String toString() {
return this.msg;
}
public abstract String getMsg();
}