10.2 数字与静态

来源:互联网 发布:航空公司订票系统java 编辑:程序博客网 时间:2024/06/06 23:21

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对象,改为如下形式

String.format("%tA,%<tB %<td",today); //<表示格式化程序重复利用之前用过的参数

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 16c.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变量即可

原创粉丝点击