HeadFirstJava——10_数字与静态

一、静态方法

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类型的ArrayList
	ArrayList<Integer> listOfNumbers = new ArrayList<Integer>();
	// 虽然ArrayList没有add(int)方法,但编译器会自动包装
	listOfNumbers.add(3);
	// 编译器自动解开Integer对象的包装,可直接赋值给int
	int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值