HeadFirstJava——10_数字与静态

来源:互联网 发布:绝对中立知乎 编辑:程序博客网 时间:2024/06/03 01:20

一、静态方法

1 概念

静态方法不需要实例变量,用static关键词标记方法即为静态方法;

以类的名称调用静态的方法,以实例变量调用非静态的方法;

如下是非静态方法:

public class Song{// 实例变量的值会影响play()方法的行为String title;public Song(String t){title = t;}public void play(){SoundPlayer player = new SoundPlayer();player.playSound(title);}}

如下是静态方法,没有实例变量,直接用类的名字调用方法Math.min(1988, 1991);

public static int min(int a, int b){// 返回a和b中较小的值}

2 静态/非静态方法对静态/非静态变量的调用

2.1 静态方法不能直接调用非静态变量;

public class Duck{private int size;public static void main(String[] args){// 编译器报错,无法确定是哪个实例的变量System.out.println(size);/*但可new一个对象,来对其非静态的变量进行访问Duck duck = new Duck();System.out.println(duck.size);*/}public void setSize(int s){size = s;}public int getSize(){return size;}}

2.2 静态方法不能直接调用非静态方法;

public class Duck{private int size;public static void main(String[] args){// 编译器报错,无法确定是哪个实例的方法System.out.println(getSize());/*但可new一个对象,来对其非静态的变量进行访问Duck duck = new Duck();System.out.println(duck.getSize());*/}public void setSize(int s){size = s;}public int getSize(){return size;}}

2.3 静态方法可调用静态变量;

2.4 非静态方法可调用静态变量和静态方法;


二、静态变量

静态变量是共享的,同一类所有的实力共享一个静态变量;

静态变量只在类第一次载入的时候被初始化;

每个实例一个实例变量,每个类一个静态变量;

以类的名称调用静态变量,以实例变量调用非静态变量;

静态变量在该类的任何对象创建之前就完成初始化,在该类的任何静态方法执行之前初始化;


三、静态final常数

1 概念

静态的final变量是常数,即常数是把变量同时标记为static和final的;

常数变量的名称应该都是大写字母,并以下划线将字符隔开;

一旦被初始化就不会改动;

2 静态final变量的初始化方法:

2.1 声明的时候

public class Foo{public static final int FOO_X = 5;}

2.2 在静态初始化程序中

public calss Bar{public static final double BAR_SIGN;static{BAR_SIGN = (double)Math.random();}}

3 final修饰变量、方法、类

final的变量一旦复制就不能更改;

final的方法不能被覆盖;

final的类不能被继承;

注意:若一个类不能被子类化,则其方法根本无法被覆盖;若只是想要限制部分的方法不能被覆盖,则单独标记其为final;


四、Math的方法

1 Math.random()

返回介于0.0~1.0之间的双精度浮点数;

double r1 = Math.random();int r2 = (int)(Math.random()*5);

2 Math.abs()

返回双精度浮点数类型参数的绝对值;

该方法有覆盖版本,传入整型返回整型,传入双精度浮点数返回双精度浮点数;

int x = Math.abs(-325);double d = Math.abs(325.829);

3 Math.round()

根据参数是浮点数或双精度浮点数,返回四舍五入后的整型或长整型值;

int x = Math.round(-3.25f);long y = Math.round(8.29);

4 Math.min()

返回两个参数中较小的一个;

该方法有int、long、float或double的覆盖版本;

int x = Math.min(325, 829);double y = Math.min(3.25, 8.29);

5 Math.max()

返回两个参数中较大的一个;

该方法有int、long、float或double的覆盖版本;


五、包装类

1 概念

每个primitive主数据类型都有一个包装用的类,且因为这些包装类都在java.lang包中,因此无需import它们;

包装类包括Boolean、Character、Byte、Short、Integer、Long、Float、Double;

1.1 包装值

int i = 829;Integer iWrap = new Integer(i);

1.2 解开包装

int unWrapped = iWrap.intValue();

2 自动打包autoboxing

不必把primitive主数据类型与对象分得太清楚;

public void doNumsNewWay(){// 创建Integer类型的ArrayListArrayList<Integer> listOfNumbers = new ArrayList<Integer>();// 虽然ArrayList没有add(int)方法,但编译器会自动包装listOfNumbers.add(3);// 编译器自动解开Integer对象的包装,可直接赋值给intint num = listOfNumbers.get(0);}

注意:ArrayList<int>无法通过编译,因为generic类型的规则是只能指定类或接口类型;

2.1 方法的参数

若参数是某种包装类型,可传入相对应的primitive主数据类型,反之亦然;

// 可传入int类型或Integer对象void takeNumber(Integer i){}

2.2 返回值

若方法声明为返回某种primitive主数据类型,可返回兼容的primitive主数据类型或该primitive主数据类型的包装类型;

int giveNumber(){// x可以是int类型或Integer对象return x;}

2.3 boolean表达式

任何预期boolean值得为之都可用求出boolean的表达式代替;

// bool可以是boolean类型或Boolean对象if(bool){System.out.println("true");}

2.4 数值运算

可在使用primitive主数据类型作为运算子的操作中以包装类型代替;

Integer i = new Integer(29);i++;Integer k = i + 3;

2.5 赋值

可将包装类型或primitive主数据类型赋值给声明成相对应的包装或primitive主数据类型;

// x可以是int类型或Integer对象Double d = x;

3 包装类型的方法

3.1 将String转换成primitive主数据类型值

String str = "520";int num = Integer.parseInt(str);

3.2 将primitive主数据类型转换成String

方法1 "+"操作数

double d = 3.25;String doubleString = "" + d;

方法2 使用Double包装类的静态方法

double d = 8.29;String doubleString = Double.toString(d);


六、数字格式化

1 导入类

import java.util.Formatter;

2 静态方法

String s = String.format(<格式指令>, <要格式化的值>);

3 格式化说明

格式化说明最多有5个部分(不包括%),以下[]都是可选项,因此只有%和type是必须的;

格式化说明的顺序是有规定的,必须要以这个顺序来指定;

"% [argument number] [flags] [width] [.precision] type"

其中,[argument number]——若要格式化的参数超过一个以上,可在此处指定哪一个;

[flags]——特定类型的特定选项,如数字要加逗号或正负号;

[width]——最小的字符数,但不是总数,输出可以超过次宽度,若不足则自动补零;

[.precision]——精确度,注意前面有个圆点符号;

type——一定要指定的类型标识,d表示参数与int相容,f表示参数是浮点型,x表示参数必须是byte/short/int/long/BigInteger,c表示参数必须是byte/short/int/long;

int one = 19880325;double two = 19910829.00000;String s = String.format("The rank is %,d out of %,.2f", one, two);// The rank is 19,880,325 out of 19,910,829.00


0 0