第10章:数字与静态性
Math 有什么特点?
在 Java 中没有东西是全局(global)的。但,Math 方法是接近全局的方法。Math不能用来创建实例变量。因为Math是用来执行数据计算的,所以没有必要创建对象来进行数学计算,创建对象是浪费内存空间的做法。Math中所有方法都静态方法。
Long a = Math.round(46.25);
int b = Math.max(2, 3);
int c = Math.abs(-500);
非静态方法与静态方法,有哪些差别?
静态方法,使用 static 关键字声明,以类的名称进行调用。
非静态方法,以实例对象进行调用,没有 static修饰。
Math类是如何阻止被实例化的?
Math类阻止被实例化,采取的策略是使用 private 修饰了其构造函数。
在静态方法中,为什么不能使用非静态的变量?为什么也不能调用非静态的方法?
静态变量有哪些特点?静态变量与非静态变量有哪些区别?
静态变量,会被同类的所有实例共享,因为它隶属于类。静态变量,在类第一次载入时初始化。静态变量,会在所有对象创建之前进行初始化,也会在任何静态方法执行之前就初始化。静态变量,只能由类来调用。
非静态变量,只被单个对象独有,它隶属于实例。非静态变量,在类实例化时进行初始化。
实例对象不会维护静态变量的拷贝,静态变量由类进行维护。非静态变量由实例对象进行维护。
class Duck {
// 非静态变量,属于对象
private int size = 0;
// 静态变量,属于类
private static int count = 0;
public Duck() {
size++;
count++;
System.out.println("size " + size);
System.out.println("count " + count);
}
public void setSize(int s) {
size = s;
}
public int getSize() {
return size;
}
}
public class TestStatic {
public static void main(String[] args) {
Duck d1 = new Duck(); // size = 1 count = 1
Duck d2 = new Duck(); // size = 1 count = 2
Duck d3 = new Duck(); // size = 1 count = 3
}
}
如何声明一个静态常量?
public static final double PI = 3.1415926;
public 表示可供各方读取。 static 表示静态。 final 表示“固定不变”。 常量的标识符,一般建议字母大写,字母之间可以用下划线连接。
深入理解 final
final 的核心意思是,它所修饰的元素不能被改变。final 不仅可以修饰变量,还可以修饰方法和类。
// 用 final 修饰的类,不能被继承
final class Foo {
// final 修饰静态变量,得到静态常量
public static final double PI = 3.1415926;
// final 修饰非静态变量,该变量将无法再被修改
final String name = "geekxia";
void changeName() {
// 修改 final变量,失败
// name = "Evatsai";
}
// final 修饰局部变量,该局部变量也将无法再被修改
void doFoo(final int x) {
// 修改局部变量,失败
// x = 100;
}
// final 修饰的方法,子类将不能覆写
final String getName() {
return name;
}
}
什么是主数据类型的包装类?
Boolean / Character / Byte / Short / Integer / Long / Float / Double
主数据类型的包装类,都放在 java.lang 中,所以无需 import 它们。当你需要以对象的方式来处理主数据类型时,你就需要用包装类把它们包装起来,Java5.0之前必须这么做。
int a = 123;
// 包装
Integer aWrap = new Integer(a);
// 解包
int b = aWrap.intValue();
如何对数字进行格式化?
// 第二个参数,以第一个参数的格式化指令进行输出
String s = String.format("%, d", 1000000000);
String m = String.format("I have %,.2f bugs to fix.", 489369.123456);
如何对日期进行格式化?
String d = String.format("%tB", new Date());
使用 Calendar 抽象类操作日期
// 获取日历的实例对象
Calendar cal = Calendar.getInstance();
cal.set(2014, 1, 7, 15, 40);
long day1 = cal.getTimeInMillis();
day1 += 1000*60*60;
cal.setTimeInMillis(day1);
cal.add(cal.DATE, 35);