关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、概述
其实说起来jdk1.5已经出现很长时间了,现在再说它是新特性未免有些过时,事实上这一部分知识从新颖性上确实不足,但是从实用性上却是值得我们好好研究。
些特性包括静态导入、可变参数、增强形for循环、自动拆箱与装箱、枚举、反射、javaBean内省。
那么之后就依次介绍这些新特性。
二、静态导入
·1,语法
静态导入的知识比较简单,就是在导入包的语句中的import关键字后面加static关键字。
比如:import static java.lang.Math.PI;
a,以前没有静态导入的时候写法
System.out.println(Math.random());
b,有静态导入的写法
import static java.lang.Math.PI; import static java.lang.Math.random; public class TextDemo { public static void main(String[] args) { System.out.println(PI); System.out.println(random()); } }
2,优缺点
静态导入虽然简化了我们的书写,但也容易造成不必要的混淆。因为看不到方法的所属,而且也不能导入不同包中相同名称的方法,所以并不推荐大量使用静态导入。
三、可变参数
1,概述
可变参数顾名思义,就是使程序员可以声明一个接受可变数目参数的方法。
比如说我们要做一个简单的加法函数
add(1,2)
add(1,2,3)
add(1,2,3,4)
add(1,2,3,4,5)
因为这个方法接受的参数个数不确定,按照我们以前的做法要写很多个方法重载来完成,显然很麻烦。如果使用可变参数的话我们只需要一个函数就行了
2,例如
public class TextDemo { public static void main(String[] args) { System.out.println(add(1, 2)); System.out.println(add(1, 2, 3)); System.out.println(add(1, 2, 3, 4)); System.out.println(add(1, 2, 3, 4, 5)); } private static int add(int i, int ... nums) { int sum = i; for(int num : nums){ sum =sum + num; } return sum; } }
,3,注意:
a,可变参数只能出现在参数列表的最后
b,...位于类型和变量之间,有无空格均可。
c,根据如下代码提示可以看出,int ... nums 其实隐含的是声明了一个数组。
四、增强型for循环
增强型for循环在上个例子中其实就已经用到了,事实上它也确实挺好用的。
1,语法
for(数据类型变量名 :被遍历的集合或者数组) {...}
2,举例
上面有一个迭代数组的例子,这里就再举一个集合的吧
import java.util.ArrayList; import java.util.Iterator; public class TextDemo { public static void main(String[] args) { ArrayList<String> arrs = new ArrayList<String>(); arrs.add("aaa"); arrs.add("bbb"); arrs.add("ccc"); //传统迭代方法 Iterator it = arrs.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //增强for循环迭代方式 for(String arr : arrs){ System.out.println(arr); } } }
3,注意
增强型for循环对集合进行遍历,只能获取集合元素。但是不能对集合进行操作。
传统for遍历数组时有索引,如果想要对某一索引操作还是需要用传统for循环。
五、自动拆箱与装箱
在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。
自动装箱:基本类型自动转为包装类.(int >> Integer)
自动拆箱:包装类自动转为基本类型.(Integer >> int)
public class TextDemo { public static void main(String[] args) { int i = 2; ArrayList<Integer> arrs = new ArrayList<Integer>(); arrs.add(i);//自动装箱,自动将int转换成Integer //-------------------------------------------\ Integer j = 3; int num = 2 + j;//自动拆箱,将Integer自动转成int } }
六、枚举
1,概述
用过c++的人肯定对枚举不陌生,现在java也加入了枚举。
枚举作用就是让某个类型的变量取值只能为若干固定的值,否则,编译器就会报错。
枚举可以让编译器在编译时就能控制源程序中填写的非法值。
2,格式
public enum weeks { SUN, MON, TUE, WEN, THI, FRI, SAT; }
3,常见方法
weeks day = weeks.MON; System.out.println(day); System.out.println(day.name()); System.out.println(day.toString()); System.out.println(weeks.FRI); System.out.println(day.ordinal());//该元素在所属的位置 System.out.println(day.valueOf("FRI"));//将字符串转化为枚举常量 System.out.println(day.values().length);//获取长度
,4,带有构造函数方法的枚举
枚举可以看做一个内部类,类有构造方法,枚举也不例外
5,注意:
a,但是枚举的构造只能私有,不能公有,因为枚举值是public static final的常量,这样可以保证外部代码无法重新构造枚举类的实例。
b,构造器只是在构造枚举值的时候被调用。
比如:
<span style="white-space:pre"> </span>public static void main(String[] args) { <span style="white-space:pre"> </span>weeks day = weeks.MON; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public enum weeks {// 这里的枚举是一个内部类 <span style="white-space:pre"> </span>SUN, MON, TUE, WEN, THI(1), FRI, SAT;//这里的THI(1)就是在调用枚举的有参构造函数 <span style="white-space:pre"> </span>private weeks() { <span style="white-space:pre"> </span>System.out.println("first"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>private weeks(int i) { <span style="white-space:pre"> </span>System.out.println("second"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>}
返回的结果调用了7此构造函数
6,带有方法的枚举
public class TextDemo { public static void main(String[] args) { TrafficLamp lamp =TrafficLamp.Red; System.out.println(lamp.nextLamp().toString()); } // 交通灯 public enum TrafficLamp { Red,Yello,Green; public TrafficLamp nextLamp() { if (this == Yello) { return Red; } if (this == Red) { return Green; } if (this == Green) { return Yello; } return null; } } }
7,带有抽象方法的枚举
// 交通灯 public enum TrafficLamp { Red(60){//内部类中的匿名内部类,表示红灯60s @Override public TrafficLamp nextLamp() { return Green; } },Yello(10) { @Override public TrafficLamp nextLamp() { return Red; } },Green(60) { @Override public TrafficLamp nextLamp() { return Yello; } }; public abstract TrafficLamp nextLamp(); private int time; private TrafficLamp(int time) { this.time = time; } }
七、最后
JDK1.5的新特性,都是与我们实际开发有关的有用功能,由于篇幅有限,所以写成多篇。