final关键字
静态的final变量是常数,标记为final代表一旦被初始化就不会改动,即类加载后静态final变量一直会维持原值,如
public static final double PI=3.14
static代表不需要math实例,注意常数变量名称为大写字母
静态初始化程序是一段在加载类时会执行的程序代码,会在其他程序使用该类之前就执行,很适合final静态变量的初始程序。如下所示:
class Foo{
final static int x;
static{ //该段程序在类被加载时执行
x=42;
}
}
静态变量除了上述的初始化方法还有声明时候初始化
public class Foo{
public static final int x=42;
}
final可修饰非静态的变量,包括实例变量,局部变量甚至方法参数,都代表方法值不可改变。final也可以用来防止方法的覆盖(修饰方法)或创建子类,即被继承(当修饰类时)。
Math方法
Math.random()
返回介于0.0-1.0之间的双精度浮点数
Math.abs()
返回双精度浮点数类型或整型参数的绝对值
Math.round()
根据参数是浮点型或双精度浮点型返回四舍五入的整型或长整型值
Math.min()
返回较小的
Math.max()
返回较大的
主数据类型的包装
1)包装与解包装过程
当把主数据类型放入ArrayList或HashMap时,需要把主数据类型当作对象来处理,每一个主数据类型都有个包装用的类,包装类均在lang包里,无需去import。包装类的名称按照包装的类型设定,将第一个字母改为大写,但有特殊的存在。所有的包装类如下:
Boolean Character Byte Short Integer Long Float Double
包装值
int i=288;
Interger iWarp = new Integer(i); //传入主数据类型给包装类的构造函数
解开包装
int unWrapped=iWarp.intValue();
以上介绍在JAVA5.0以前得这么做,主数据类型就是原始类型,对象引用就是对象引用,二者无交换使用的方法,唯一的方式就是包装和解开包装,没有方法能将主数据类型直接传入期待对象引用的方法,也没有方法能把回传对象参考的method值赋值给主数据类型变量。只是Integer带有一个int类型的实例变量(保存integer包装的主数据类型)。
2)自动与无自动包装
无自动包装
public void doNumsOldWay(){
ArrayList list1 = new ArrayList(); //创建对象
list1.add(new Integer(3)); //包装
Integer one = (Integer) list1.get(0);
int intOne = one.intValue(); //解包装
}
自动包装
public void doNumsNewWay(){
ArrayList<Integer> list1 = new ArrayList<Integer>()//创建int类型ArrayList
list1.add(3); //ArrayList没有add(int)方法但会自动包装
int num=list1.get(0); //自动解开包装
}
关于不声明为ArrrayList<int>的原因是只能指定包装类类型
自动包装不只是包装与解开主数据类型给collection使用,还可以交换地运用主数据类型和其包装类型
1)方法的参数
若参数为某包装类型,可传入相对应的主数据类型,反之,亦然。
void take(Integer i)
2)返回值
返回类型为某主数据类型,则也可返回对应的包装类型
3)任何布尔类型同样可以用对应的包装类型替代
4)数值运算
可在主数据类型作为运算子的操作中用包装类型来替代,即可对Integer对象进行递增运算,如 Integer i = new Integer(42);i++;
Integer j=new Integer(5);
Integer k=j+3;
5)赋值,如Double d = x;//x可为int类型或Integer对象
包装的静态方法
Integer.parseInt() //将string转化为主数据类型的值
String s="2";
int x = Integer.parseInt(s);
double d =Double.parseDouble("420.24");
boolean b = new Boolean("true").booleanValue();
下述代码错误
String s="two";
int x = Integer.parseInt(s); //解析String的方法或构造函数会抛出NumberFormatException异常
将主数据类型转换为string
double d=42.5;
String doubleString = ""+d;
double d=42.5;
String doubleString = Double.toString(d);//double类的静态方法
数字的格式化
JAVA5.0把功能加到部分的输入输出类和string上,如
String.format("%,d",1000);//逗号不是分隔作用,只是表示数字用逗号分开
1,000
上例表示将1000以带有逗号的整数方式表示。第一个参数为格式化串,%代表要表示的参数
%,d:以十进制整数带有逗号的方式表示
%.2f:小数部分以两位格式化
%,.2f:代表整数部分以逗号输出,小数部分以两位格式化
1)格式化说明的格式
format("%,6.1f",42.000);
逗号表示数字要加逗号,6代表最小的字符数,不是总数,输出可以超过此宽度,若不足会自动补零,1表示精确度,前面有圆点符号,f即类型一定要指定
%d参数必须与int相容
%f参数是浮点型
%x参数是byte,short,int,long,BigInteger
%c参数同上,但不包括BigInteger
多个参数:
String s=String.format("I have %,d pencils in %.2f",one,two);//依序对应
日期格式化
1)Date类获取当前日期
Date类型是用于时间表示,日期格式的类型用‘t’开头的两个字符表示,范例如下
完整的日期与时间: %tc
String.format("%tc",new Date());
Fri Nov 24 15:16:21 MST 2017
只有时间: %tr
String.format("%tr",new Date());
03:16:21 PM
周,月,日:%tA %tB %td (通过格式的组合)
Date today = new Date();
String.format("%tA,%tB %td",today,today,today); //%tA后面的逗号直接输出
Friday,Nov 24
为了避免上述传入3次Date对象,改为如下形式
2)Calendar类用于操作日期
操作日期基本思想是首先通过静态方法请求一个calendar,然后产生calendar的子类实例(calendar是抽象类,所以用具体子类),
取得calendar的子类实例(new创建无法通过编译)
Calendar cal = Calendar.getInstance();//调用静态方法,返回子类的实例
calendar是抽象类,无法取得calendar实例,但可以取得其具体子类的实例,不受限地调用calendar的静态方法,因为静态方法是在类上的,不依赖于具体实例
运用calendar对象
calendar对象的关键概念
1)字段保存状态:calendar对象使用字段保存状态,即日期及时间,可通过此读取与设定year以及month字段
2)日期时间的运算:对不同字段加减法
3)日期与时间可以用millisecond表示:calendar可以将日期转化为微秒(相当于1970.1.1的微秒数)的表示法,或将微秒表示为日期,通过此进行相对时间计算。
Calendar c = Calendar.getInstance();
c.set(2004,1,7,15,40);//设定时间,月份为零基
long day1=c.getTimeInMillis(); //以毫秒表示
day1+=1000*60*60; //加一个小时
c.setTimeInMillis(day1);
System.out.printIn("new hour" +c.get(c.HOUR_OF_DAY)); //结果为new hour 16
c.add(c.DATE,35); //加上35天
System.out.printIn("add 35 days"+c.getTime());
c.roll(c.DATE,35); //滚动35天,日期字段会动,月份不变
System.out.printIn("roll 35 days"+c.getTime());
c.set(c.DATE,1); //直接设定DATE的值
System.out.printIn("set to 1"+c.getTime());
calendar的精华
1)主要方法
add(int field,int amount):加减时间值
get(int field):取出指定字段的值
getInstance():返回calendar,可指定时区
getTimeMillis():以毫秒返回时间
roll(int field,boolean up):加减时间值,不进位
set(int field,int value):设定指定字段的值
set(year,month,day,hour,minute):设定完整的时间
setTimeMillis(long millis):以毫秒指定时间
2)关键字段
DATE/DAY_OF_MONTH:每月的几号
HOUR/HOUR_OF_DAY:小时
MILLISECOND:毫秒
MINUTE:分钟
MONTH:月份
YEAR:年份
ZONE_OFFSET:时区位移
使用static import
import静态的类,变量或enum,少打代码,但容易使程序混淆,如
import static java.lang.Math.*
Math.sqrt(2.0);可简写为sqrt(2.0);
import static java.lang.System.out;
System.out.printIn("1");简写为out.printIn("1");
书海拾荒
1.类标记为final,则方法不需要标记为final(根本无法被覆盖)。
2.静态方法不能存取(调用)非静态的变量,调用非静态的方法,可存取静态变量,但非静态的方法可以读取静态的变量,不能调用该类的静态方法。
3.静态方法通过类的名称调用,而不是对象引用变量
4.静态方法可以直接调用,而不需要堆上的实例或实例变量值。
5.如果类只是静态的方法,则可以将构造函数标记为private以避免初始化
6.文字直接表示的浮点数都会被当作双精度浮点型,除非后面加上f
7.把主数据类型当作对象处理,就要将其包装起来。
8.不存在Boolean.parseBoolean(),但布尔类型的构造函数可以取string来创建对象
9.format方法的参数个数可变是通过可变参数列表设定的。
10.SwingConstants整个类专门存放常数值
11.System.out是system类的一个静态变量,不必创建system的实例,从该类调用out变量即可