10 数字与静态重要

目录

页码:273-313
10 数字很重要


Math的方法

像round()、abs()、max()等数学运算其实不需要实例变量值。
在Math 这个累类中的所有方法都不需要实例变量。因为这些方法都是静态的, 所以你无需Math的实例。你会用到的只有它的类本身。

Java是面向对象的,但若处于某种特殊的情况下,通常是实用方法, 则不需要类的实例。static这个关键词可以标记出不需要类实例的方法。

静态方法

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

以类的名称调用静态的方法
Math.min(88,86)

以引用变量的名称调用非静态的方法
Song t2 = new Song();
t2.paly();

可以将Math的构造函数标记为private防止被初始化。

事实上,只要有main()的类都算有静态的方法。

  • 静态的方法不能调用非静态的变量(该类的任何实例变量)。
  • 静态的方法也不能调用非静态的方法。
    静态变量:它的值对所有的实例变量来说都相同。

静态项目的初始化有两项保证:
1. 静态变量会在该类的任何对象创建之前就完成初始化
2. 静态变量会在该类的任何方法执行之前就初始化


静态final常数

静态的final变量是常数
一个被标记为final的变量代表它一旦被初始化之后就不会改动。也就是说类加载之后静态final变量就一直会维持原值。
以Mathp.PI为例:

public static final double PI = 3.141592653589793

此变量被标记为public,因此可供各方读取。
此变量被标记为static,所以你不需要Math的实例。
此变量被标记为final,所以圆周率是不变的的。
此外没有别的方法可以识别变量为不变的常数(constant),
常数变量的名称应该要都是大写字母!

静态final变量的初始化:
1. 声明的时候:

public class Foo{
    public static final int FOO_X = 25;
}
  1. 在静态初始化程序中:
public class Bar{
    public static final double BAT_SIGN;
    static{//这段程序会在类被加载时执行
        BAR_SIGN=(double)Math.random();
    }
}

final不只用在静态变量上…
你也可以用final关键字来修饰非静态的变量,这包括了实例变量、局部变量甚或是方法的参数。不管哪一种,这都代表它的值不能变动。但你也可以用final来防止方法的覆盖或创建子类
1. final的变量代表你不能改变它的值。
2. final的method代表你不能覆盖掉该method。
3. final的类代表你不能继承该类(也就是创建它的子类)。

**重点内容**primitive主数据类型的包装
有时你会想哟把primitive主数据类型当作对象来处理,每一个primitive主数据类型都有个包装用的类,且因为这些包装类都在java.lang这个包中,所以你无需去import它们。
包装类:Boolean、Character、Byte、Short、Integer、Long、Float、Double

问:为什么不直接声明ArrayList?
答: generic类型的规则是你只能指定类或借口类型。因此ArrayList 将无法通过变异。但你也可以直接把该包装所对应的primitive主数据类型放进ArrayList中。

JAVA集合只能存放引用类型的的数据,不能存放基本数据类型

ArrayList<int> 出错
ArrayList<Integer> a = new ArrayList<Integer>();

//泛型...ArrayList里放的是对象.也就是引用.int并不是对象,是JAVA的8大基本类型.

包装类型的方法

包装也有静态的实用方法
1. 将String转换成primitive主数据类型值是很容易的:

String s = "2";
int x = Integer.parseInt(s); 
double d = Double.parseDouble("420.24");
boolean b = new Boolean("true").booleanValue();
//注意最下面一句,没有Boolean.parseBoolean()。
  1. 反过来将primitive主数据类型值转换成String
double d = 42.5;
String doubleString = ""+d;     //"+"这个操作数是Java中唯一有重载过得运算符

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

数字的格式化

“格式化说明”的格式
跟在百分号后面包括类型指示(像是d或f)的每个东西都是格式化命令。
格式化说明最多会有5个部分(不包括%符号)下面[]符号里面都是选择性的项目,因此只有%与type是必要的。格式化说明的顺序是有规定的,必须要以这个规定来指定。

唯一必填项目是类型

那日期呢?
完整的日期与时间:%tc

String.format("%tc",new Date());

周二 7月 24 15:37:18 CST 2018
只有时间:%tr

String.format("%tr",new Date());

03:37:51 下午
周、月、日:%tA %tB %td
因为没有刚好符合我们要求的输出格式,所以得组合3中形式来产生出所需的格式:

Date today = new Date();
String s = String.format("%tA, %tB %td", today,today,today);

星期二, 七月 24
同上,但不用重复给参数

Date today = new Date();
String s = String.format("%tA, %<tB %<td", today);

“<”这个符号是个特殊的指示,用来告诉格式化程序重复利用之前用过的参数

操作日期

要取得当前日期就用Date,其余功能可以从Calendar上面找。
用java.util.Calender来操作日期吧!

取得继承过的Calendar的对象
要用这个静态的方法:

Calendar cal = Calendar.getInstance();
//这个语法是个对静态方法的调用

运用Calendar对象
要运用Calendar对象你得先了解几个关键的概念:
- 字段会保存状态—Calendar对象使用许多字段来表示某些事物的最终状态,也就是日期和时间。比如说你可以读取和设定它的year或month字段。
- 日期和时间可以运算—Calendar的方法能够让你对不同的字段作加法或减法的运算,比如说对month字段加一个月或对year减去三年
- 日期与实践可以用millisecond来表示—Calendar可以让你将日期转换成微秒的表示法,或将微秒转换成日期。因此你可以执行精确的相对时间计算。

静态的方法不能存取“this”所引用的对象,这是错误的
解释:

this 表示这个类的当前实例,而静态方法不依赖于该类的任何实例,因此方法内不能引用 this。
确实是基础问题:
(1) 非静态方法参数传递时,有一个隐式参数this,这个this就是调用该方法的对象本身。
比如, Object o=new Object();
o.toString(); //实际上是有参数传递的toString(Object this),且o==this
这样在非静态方法中就可以通过this来得到调用对象的其他域和方法,私有域的也行。
(2) 静态方法是属于类的,而并不属于某个对象。所以没有隐式参数this,自然也就不能通过this调用对象本身了。
但这并不意味这不能调用非静态域。

Head First Java(第二版·中文版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值