黑马程序员——JDK1.5新特性
------- android培训、java培训、期待与您交流! ----------
JDK5.0新特性:静态导入,自动装箱/拆箱,增强for循环,可变参数,枚举,泛型。
静态导入:import static java.util.Arrays.*;可以不用写类...只对一个类的静态成员有效:
格式,
import static 包名.类名.静态成员
自动装箱: Integer i = 1; 就是把基本数据类型自动装箱成对象。
自动拆箱:int j = i ; 把对象自动拆成基本数据类型。
增强for循环:只能用在数组,或者实现Iterable接口的集合类上。注意细节,增强for只适合取数据,不能改数据。
可变参数:可变参数可以把他看成数组,
@Test
public void test(){
int[] arr ={1,2,3,4,5,6};
sum(arr);
sum(1,2,3,4,5,6,7);
}
//可变参数你就可以把他看成数组,这里是三个点。
public void sum(int ...nums){
int sum=0;
for(int i:nums){
sum=sum+i;
}
System.out.println(sum);
}
需要注意的问题演示1:可变参数只能处于参数列表的最后,所以一个方法最多只能有一个长度的可变参数。
@Test
public void testAa(){
aa(1,2,3,4);
}
//这样写不行。public void aa(int...num,int x){}因为传入参数时无法判断,会把值全部给可变参数。
public void aa(int x ,int...nums){//这样写才正确
}
需要注意的问题演示2:调用可变参数的方法时,编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数。
@Test
public void bb(){
List list = Arrays.asList("1","2","3");
System.out.println(list);
String[] arr = {"1","2","3","4"};
list = Arrays.asList(arr);
System.out.println(list);
//注意,这里使用基本数据类型的数组时,编译器会把他当成数组对象传递,打印出来的是哈希码值。
// int[] nums = {1,2,3,4,5};
// 如果使用Integer 那么打印出来的就是这些数组元素。
Integer[] nums = {1,2,3,4,5};
list = Arrays.asList(nums);
System.out.println(list);
}
枚举关键字:enum 1..其实就特殊形式的java类 2..枚举类中声明的每一个枚举值代表枚举类的一个实例对象。3..与java中的普通类一样,在声明枚举类时,也可以声明属性、构造函数、方法、但枚举类的构造函数必须为私有<因为防止别人创建对象>,4..枚举也可以实现接口或者继承抽象类。5..在JDK1.5之中扩展了switch语句,除了可以接收int byte char short外还可以接收一个枚举类型。
6..若枚举只有一个枚举值则可以当作单例设计模式使用。
------- android培训、java培训、期待与您交流! ----------
定义方法:enum 类名{}
代码实现如下:
public class Demo2 {
public void test(){
//调用对象
print(Grade1.A);
}
public void print(Grade1 g){
}
}
enum Grade1{
//A,B,C相当于此类的静态无参对象,可以由类名调用
A,B,C;
}
在jdk1.5之前。以下代码实现与枚举定义是一样的的。
public class Demo2 {
@Test
public void test(){
//调用对象
print(Grade1.E);
}
public void print(Grade1 g){
}
}
class Grade1{
private Grade1(){}//私有构造函数,禁止创建对象,
public static final Grade1 E = new Grade1();//提供静态的对象。
public static final Grade1 F = new Grade1();
public static final Grade1 G = new Grade1();
}
在枚举中定义字段,与构造函数,方法。
public class Demo1 {
@Test
public void test(){
print(Grade.D);
}
public void print(Grade g){
String value = g.getValue();
System.out.println(value);
}
}
enum Grade{
//由于已经有有参的构造函数,所以枚举的这些对象需要写参数
A("100-90"),B("89-80"),C("79-70"),D("69-60");
private String value;//封装每个对象对应的分数
private Grade(String value){//私有有参构造方法
this.value=value;
}
public String getValue(){//带方法的枚举,获取字段。
return this.value;
}
}
带抽象方法的枚举定义、、
public class Demo3 {
@Test
public void test(){
print(Person.A);
}
public void print(Person p){
String value = p.loValue();
System.out.println(value);
}
}
//带抽象方法的枚举
enum Person{
//由于抽象方法存在,所以要想创建本类对象,必须实现抽象方法、
A("100-90"){
public String loValue(){
return "优秀";
}
}
,B("89-80"){
public String loValue(){
return "良好";
}
}
,C("79-70"){
public String loValue(){
return "一般";
}
};
private String value;//封装每个对象队友的分数。
private Person(String value){
this.value=value;
}
public String getValue(){
return value;
}
//带抽象方法的枚举。
public abstract String loValue();
}
枚举的一些常见方法:
public void test2(){
//获取该枚举对象的常量名字
System.out.println(Person.A.name());
//获取该枚举对象的常量序号,从零开始、
System.out.println(Person.C.ordinal());
String str ="B";
// Person p = Person.valueOf(Person.class, str);
//这个方法与上面那个方法是一样的,将某个字符串转成枚举,如果该字符串转成枚举后该枚举中不存在就会抛出异常
Person p = Person.valueOf("B");
System.out.println(p);
//返回所有的枚举值存入数组
Person[] arr = Person.values();
//遍历数组
for(Person p1:arr){
System.out.println(p1);
}
}
}