第十章 数字与静态
静态方法与非静态方法的区别
Java是面向对象的,但若处于某种特殊情况下,通常是使用方法,则不需要类的实例。static这个关键字可以标记出不需要类实例的方法。一个静态的方法代表说“一种不依靠实例变量也就不需要对象的行为”。
当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用。语法:类名.静态成员。
Math.random(); //直接用类名调用
static特点:1. 随着类的加载而加载,随着类的消失而消失(说明生命周期最长)
2. 优先于对象存在(静态先存在,对象后存在)
3. 被所有对象所共享
4. 可以直接被类名所调用
静态的使用注意事项:1. 静态方法只能访问静态成员,因为非静态成员是对象创建后才存在的,而静态成员是优先 于对象存在的。
2. 静态方法中不可以定义this、super等关键字,因为静态优先于对象存在,静态优先于对象 存在,静态优先于对象存在。
静态的使用有利有弊:静态是对对象的共享数据进行单独空间的存储,节省空间。还可以被类名直接调用;但是对象的生命周期过长,因为与对象共生共存。而且静态只能访问静态。
主函数main()也是静态的。
final(最终)
public static final double PI = 3.1415926;
此变量被标记为public,因此可供各方读取。
Math方法
来看一下Math类,这是一个数学类,里面有很多可以进行计算的方法,它们都是静态的,所以我们可以直接用类名来调用。
Math.random()
//返回介于0.0~1.0之间的双精度浮点数,比如想获取1-5之间的随机整数可以这样做
int r = (int)(Math.random()*5);
Math.abs()
//返回双精度浮点数类型参数的绝对值。这个方法有覆盖版本,因此传入整型会返回整型,传入双精度浮点数就会返回双精度浮点数
Math.round()
//根据参数是浮点型或双精度浮点数返回四舍五入之后的整型或长整型值。
int x = Math.round(-24.8f); //返回-25
int y = Math.round(24.45f); //返回24
Math.min();
//返回两参数中较小的那一个。这有int、long、float或double的覆盖版本
int x = Math.min(24,240); 返回24
Math.max();
//返回两参数中较大的那一个。也有int、long、float和double的重载版本
int x = Math.max(24,240); //返回240
当然还有更多的方法,具体请自行查阅API。
数字的格式化
//将数字以带逗号的形式格式化
String s = String.format("%,d",1000000000);
System.out.println(s);
//打印结果为 1,000,000,000
解析上面格式化的结构。
format("I have %.2f bugs to fix",476578.09876);
//输出结果为 I have 476578.10 bugs to fix
此例的%符号是第二个参数会放置的位置,“.2f”代表该参数要使用的格式,其他的字都会以原来的方式输出。
格式化说明的格式
%[argument number][flags][width][.precision]type
依次分析上面的格式:
format("%,6.1f",42.000);
//除了[argument number]之外其他的项目都用到了
唯一必填项目是类型
//%d decimal(十进制)
format("%d",42); //%d的参数必须能够与int相容。输出结果为42
//%f floating point(浮点)
format("%.3f",42.000000);//.3配上f会强制输出3位的小数,参数必须是浮点数类型,输出结果为42.000
//%x hexadecimal(十六进制)
format("%x",42);//参数必须是byte、short、int、long、BigInteger。输出结果为2a
//%c character(字符)
format("%c",42);//参数同上,但不包括BigInteger。输出结果为*,因为在ASCII中42代表"*"号
超过一个以上参数是,会按顺序进行格式化,第二个参数会应用到第一个百分号上面,第二个参数会应用到第二个百分号上面,以此类推。
format("The rank is %,d out of %,.2f",one,two);
时间的格式化
//完整的日期与时间:%tc
String.format("%tc",new Date());
//输出格式为 Sun Nov28 14:52:41 Mst 2004
//只有时间:%tr
String.format("%tr",new Date());
//输出格式为 03:01:47 PM
//周,月,日:%tA%tB%td
//因为没有刚好符合我们要求的输出格式,所以得组合三种形式来产生出所需要的格式:
Date today = new Date();
String.format("%tA %tB %td",today,today,today);
//这样就得把Data对象传进去三次,输出格式为 Sunday November 28
//同上,但不用从重复给参数
Date today = new Date();
String.format("%tA% <tB% <td",today);
//"<"这个符号是一个特殊的指示,用来告诉格式化程序重复利用之前用过的参数
Calendar这个API的设计者打算要做全球化的思考。基本的想法是当你要操作日期时,你会要求一个Calendar,然后Java虚拟机会赏你一个Calendar的子类实例(实际上Calendar是一个抽象类,所以你能用到的是它具体的子类)。
Calendar cal = new Calendar()
//这是无法通过编译的,要用下面的静态方法
Calendar cal = Calendar.getInstance();
你无法取得Calendar的实例,但是你可以取得它的具体子类的实例。
add(int field,int amount) //加减时间值
get(int field) //取出指定字段的值
getInstance() //返回Caledar,可指定地区
getTimeInMillis() //以毫秒返回时间
roll(int field,boolean up) //加减时间值,不进位
set(int field,int value) //设定指定字段的值
set(year,month,day,hour,minute) //设定完整的时间
setTimeInMillis(long millis) //以毫秒指定时间
//更多方法查阅API
关键字段
DATE/DAY_OF_MONTH //每月的几号
HOUR/HOUR_OF_DAY //小时
MILLISECOND //毫秒
MINUTE //分钟
MONTH //月份
YEAR //年份
ZONE_OFFSET //时区位移
//更多关键字段查阅API文档....