在这篇博客中我们来说一说java1.5版本的三个新特性及java中的几个类的使用。
Java从诞生开始一直在不断的进行着改进升级,而他的1.5版本是一次里程牌式的升级,这次的升级为我们提供了很多新鲜的事物与特性,在这里我们说一说1.5版本后出现的高级for循环、可变参数和静态导入。
一. 高级for循环
1. 高级for循环的格式
for( 数据类型 变量名: Collection集合或者数组)
class ForDemo {
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("小宏");
al.add("小绿");
al.add("小蓝");
//使用高级for循环取出元素
for(String s:al)
{
System.out.println(s);
}
}
}
2. 高级for循环的特点
1> 高级for循环只能对元素进行取出操作,如果我们使用迭代器取集合中的元素,我们不仅可以取出该元素,还可以删除这个元素,而高级for循环只能取出。
2> 高级for循环必须要有被遍历的目标。
二. 可变参数
1.可变参数简介
当我们接收参数的时候,知道他的类型但是不知道参数的具体个数,我们可以使用可变参数来接收。
格式:数据类型…参数名
例:int… arr
其实这句话的底层是由虚拟机完成的, 虚拟机会生成一个int[] arr数组的动作。可变参数就是生成一个该类型的数组,这个动作是由虚拟机完成的。public class Test1 {
public static void main(String[] args) {
//定义一个方法求一堆数字的和
int sum = add(1,2,3,4,3,21,54);
System.out.println(sum);
}
//使用可变参数让虚拟机帮我们生成一个int类型的数组
private static int add(int... arr) {
int sum = 0;
//使用高级for获取元素
for(int i:arr)
{
sum = sum+i;
}
return sum;
}
}
2. 注意事项
在使用可变参数的时候,可变参数一定要写在最后面。比如说:
public staticvoid show(int… arr,String s)
这句话编译器会报错,因为可变数组类型的后面不允许有其他参数,
public staticvoid show(String s,int… arr)
改成这样才能编译通过。
三.静态导入
1.静态导入的前提
当我们要多次调用一个类,而且这个类中的方法全部为静态时,比如工具类,这时候我们只需通过“类名.方法“来调用就可以拿到该方法,例如:
Arrays.asList();后期人们觉得每次都写这个类名有些麻烦,我们把这个类导入到当前程序中,这样我们只写方法就可以了,所以静态导入就诞生了。
例:导入Arrays工具类
import staticjava.util.Arrays.*;
2.注意点
当方法名重名的时候这个时候必须要在方法名前面加类名或对象名予以区分。
如果类名重名了,那么就得在类名前加包名予以区分。
四. System类
1. System类简介
该类存放的是系统的相关内容,他的方法与属性都是静态的,其中有两个重要的字段:out和in。
out:代表标准输出,默认是控制台输出
in:代表标准输入,默认是键盘录入
2.常用方法
1>getProperties()
返回一个Properties对象,此方法能获取到系统的属性信息,这些属性信息以键值对的形式存放在Properties中。Properties是HashTable的子类,所以我们可以用Map集合的方法来操作此对象。
2>setproperty(String key,String value)
返回一个String类型,如果这个系统属性的键key有对应的value值,调用该方法后新的value值会把以前的value值覆盖,并把旧的值返回来,如果没有则返回null。
3>getProperty(String key)
返回String类型,根据指定的key返回其对应的value值。
4>setIn(InputStream in)
此方法用来改变输入流,System.in的默认输入是键盘录入,我们可以通过传入一个InputStream对象来让标准输入的源头改为这个对象所关联的文件。
5>setOut(PrintStream out)
改变标准输出流,系统的默认输出是控制台,我们可以通过传入PrintStream对象来让输出变为该对象所关联的文件。
6>在启动虚拟机的同时动态的加载属性信息
做法就是在控制台输入:
java –D<key>=<value> 类名
这样我们可以在启动虚拟机加载该类的时候往系统的属性中传入一个新的键值对,
示例:
class SystemDemo {
public static void main(String[] args) {
//获取系统属性集
Properties p = System.getProperties();
//往系统属性中添加键值对
System.out.println("setProperty(): "+p.setProperty("myKey", "myValue"));
//获取mykey这个键所对应的值
System.out.println("myKey: "+p.getProperty("myKey"));
//利用高级for循环获取到系统属性
for(Object obj:p.keySet())
{
String value = (String)p.get(obj);
System.out.println(obj+":"+value);
}
}
}
五.Runtime类
1.Runtime类简介
我们的java应用程序都有一个Runtime类的实例,使得这个应用程序可以与运行的环境(操作系统)关联在一起,这个实例是每一个应用程序都具有的,他来自于每一个应用程序,所以Runtime类不能自己创建实例对象而是通过getRuntime方法来获取。
我们通过查阅API文档可以发现Runtime类没有构造函数,而且这个类中的方法并不全为静态,所以该类一定有一个方法返回本类对象,由此我们可以看出他是单例设计模式下的产物。
2. 常用方法
1>getRuntime()
返回类型Runtime类型,这个方法就是返回Runtime实例对象的方法,通过此方法我们可以拿到当前运行程序。
2>exec(String command)
在当前进程中执行一个字符串命令,例如在方法中输入一个应用程序的地址,那么此方法就会打开这个应用程序并返回一个Process对象,这个Process对象用于管理此子进程。另外此方法接收的是一个字符串命令,可能会出现IOException异常,所以要捕捉或声明一下。
例如在我们的程序中打开电脑中的扫雷程序:
class RuntimeDemo {
public static void main(String[] args) {
//获取当前的运行程序的Runtime实例
Runtime r = Runtime.getRuntime();
//打开我们电脑中的扫雷程序,此方法会抛出异常
try {
Process p = r.exec("winmine.exe");
//打开扫雷后,让线程休眠以便扫雷能存活一会。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//醒来后杀掉扫雷程序
p.destroy();
} catch (IOException e) {
e.printStackTrace();
}
}
}
六. Date类
1.Date时间类
Date类是用来描述日期时间的一个类,他可以精确到毫秒。并且Data类有构造函数可以创建建对象。我们创建一个Dae对象来看一看是什么样子。
class DateDemo {
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);
}
}
打印结果是:Fri Nov 27 17:04:46 CST 2015
他的格式是:星期 月份 日期 时:分:秒 年份。
2.格式化时间
java为我们提供了一个类SimpleDateFormat,这个类可以对这个Date对象进行格式化,我们可以按照我们想要的格式对Date对象进行格式化。
例如:
class DateDemo1 {
public static void main(String[] args) {
// 首先获取一个Date对象
Date d = new Date();
//新建一个SimpleDateFormat对日期对象进行格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月 dd日E hh:mm:ss");
System.out.println(sdf.format(d));
}
}
七.Calendar类
1.Calendar类简介
Calendar是日历对象,他可以获得天、月、年、时、分、秒等等。此类是一个抽象类,在这个类中提供了方法来获取本类对象。这个类可以看做Date类的升级版,他比Date类提供了更为精确和繁多的方法来获取时间。我们可以通过创建Calendar的子类对象来获取当前日历,但是Calendar类也为我们提供了返回本类对象的方法,两种方式都可以使用。
在Date类中有很方法都被Calendar替代了,比如Date类中的getYear()获取年份的方法被Calendar类中的Calendar.get(Calendar.YEAR)取代了。在Calendar中定义了很多字段用来标志年月日等。常用字段有:
YEAR 代表年份;DAY_OF_WEEK代表星期中的某天;DATE代表月份中的某一天;MOTH代表月份;HOUR_OF_DAY代表一天中的某个小时;SECOND代表一分钟的某一秒;MINUTE代表一小时的某一分钟。
注意点是Calendar获取的月份是从0开始计数的,也就是1月就是0月,所以我们获取到月份要加1才是现实中的月份;还有他返回的星期是以星期天作为一周的第一天,我们记录星期的方式比外国标示星期的方式要多一天,也就是我们的星期一在Calendar实例中是星期天,所以要减去1。
2.Calendar常用方法
1>get(int field)
返回int类型,field是指定的字段,我们可以通过传入指定字段来获取当前的时间
2>getInstance()方法:获取Canlendar实例
a>getInstance()
使用默认的语言与时区获取一个本类对象。
b>getInstace((Locale loca)
Locale对象代表指定的语言环境,也就是此方法会返回一个指定语言环境与默认时区的一个Calendar实例对象。
c>getInstance(TimeZone zone)
使用指定的时区(也就是TimeZone)和默认的语言环境来获取到Calendar对象。
d>getInstance(TimeZone zone,Localalocale)
使用指定时区和指定语言环境来获取到Calendar对象。
3>set()方法:设置指定的时间,无返回值
a> set(int field,int value)
给指定的字段field设置指定的值
b> set(int year,int month, int date)
设置指定的年、月、日
c> set(int year,int month, int date, int hourOfDay, int minute)
设置指定的年、月、日、时、分
d> set(int year,int month, int date, int hourOfDay, int minute,int second)
设置指定的年、月、日、时、分、秒
4>add(int field,int amount)
无返回值,此方法是Calendar类中的重要方法,他可以通过
指定字段field,给当前字段增加或者删去指定的时间。
演示一下这些方法的使用:
class CalendarDemo {
public static void main(String[] args) {
// 使用默认时区与语言环境来获取一个Canledar对象
Calendar ca = Calendar.getInstance();
//打印当前时间
showTime(ca);
/*利用set方法把当前时间设置为2012年12月12日12时12秒
注意月份要减1,这才是计算机认识的月份。
*/
ca.set(2012, 11,12,12,12,12);
showTime(ca);
//利用add方法让当前年增加3年
ca.add(Calendar.YEAR, 3);
showTime(ca);
}
//构建一个方法来打印月历中的时间
private static void showTime(Calendar ca) {
//获取年份
int year = ca.get(Calendar.YEAR);
//获取月份,月份是从0开始计数的,所以要加1.
int moth = ca.get(Calendar.MONTH)+1;
//获取日期
int date = ca.get(Calendar.DAY_OF_MONTH);
//获取星期,注意外国人是以星期天为一周的第一天,所以要减1
int week = ca.get(Calendar.DAY_OF_WEEK )-1;
//获取小时
int hour = ca.get(Calendar.HOUR_OF_DAY);
//获取分钟
int miute = ca.get(Calendar.MINUTE);
//获取秒
int second = ca.get(Calendar.SECOND);
System.out.println(year+"年"+moth+"月"+date+"号星期"+week+
" "+hour+"时"+miute+"分"+second+"秒");
}
}
/*打印:
2015年12月14号星期1 11时17分7秒
2012年12月12号星期3 12时12分12秒
2015年12月12号星期6 12时12分12秒
* */
八.Math类
Math类是一个工具类,用于一些基本的数学运算,如指数、对数、平方根和三角函数等。
1. Math类的常用方法
1> ceil(double num)
返回double类型,获取一个大于指定数字的最小整数
2> floor(double num)
返回double类型,获取一个小于指定数字的最大整数
3> round(double num)
返回long类型,对指定数字四舍五入
4> round(float num)
返回int类型,对指定数字进行四舍五入
5> pow(double a,double b)
返回double类型,获取a的b次幂,a^b
6> random()
返回一个double类型,这个方法可以返回0.0与1.0之间的伪随机任意数值,可以为0,但是不能为1。这个伪随机是因为他的底层调用了一个算法,如果了解了这个算法他就并不是随机的了。Random类也可以返回随机的数值,这个类中有一个方法nextInt(int n),这个方法可以返回一个包括0,但是不包括指定数值n之间的任意int型数值。
下面来演示一下Math类的常见方法:
class MathDemo
{
public static void main(String[] args)
{
//ceil(double)返回大于指定数据的最小整数
System.out.println(Math.ceil(-5.63));//-5.0
//floor(double)返回小于指定数据的最大整数
System.out.println(Math.floor(-3.33));//-4.0
//round(double|float a)返回最接近参数的long|int,四舍五入
System.out.println(Math.round(3.54));//4
//pow(double a,double b)返回a的b次方
System.out.println(Math.pow(2.0,3));//8.0
//random() 返回大于等于0或者小于1之间随机的double值
for(int i =0;i<5;i++)
{
//返回1-10之间的数值(包括1不包括10)
int num = (int)(Math.random()*10+1);
System.out.print(num+" ");
}
System.out.println();
//Radom类可以完成返回伪随机数的各种操作,以nextInt为例:
Random r = new Random();
for(int i=0;i<5;i++)
{
//返回包含0不包含6之间的随机int数值
System.out.print(r.nextInt(6)+" ");
}
}
}