public static final double PI = 3.141592653589793
此变量被标记为public,因此可供各方读取。
此变量被标记为static,所以你不需要Math的实例。
此变量被标记为final,因为圆周率是不变的。
常数变量的名称应该要都是大写字母!
静态初始化程序(static initializer)是一段在加载类时会执行的程序代码。它会在其他程序使用该类之前就执行。所以很适合放静态final变量的起始程序。
class Foo{
final static int x;
static{
x = 42;
}
}
静态final变量的初始化:
1、声明的时候:
public class Foo{
public static final int FOO_X = 25; // 注意这个命名惯例——应该都是大写,并以下划线字符分割。
}
2、在静态初始化程序中:
public class Bar{
public static final double BAR_DING;
static{
BAR_DING = (double)Math.random(); //这段程序会在类被加载时执行。
}
}
final不止用在静态变量上。。。。
你也可以用final关键字来修饰非静态的变量,这包括了实例变量、局部变量或是方法的参数。不管哪一种,这都代表它的值不能变动。但你也可以用final来防止方法的覆盖或创建子类。
fianl的变量代表你不能改变它的值。
final的method代表你不能覆盖掉该method。
final的类代表你不能继承该类(也就是创建它的子类)。
非静态final变量
class Foof{
fianl int size = 3; //size将无法改变
fianl int whuffle;
Foof(){
whuffle = 42; // whuffle不能改变。
}
void doStuff(final int x){
//不能改变x
}
void doMore{
final int z = 7;
//不能改变z
}
}
final的method
class Poof{
final void calcWhuffle(){
//绝对不能被覆盖过
}
}
final的class
final class MyMostPerfectClass{
//不能被继承过
}
静态(static)的方法不能调用非静态变量
静态的方法是在无关特定类的实例情况下执行的。因为静态的方法是通过类的名称来调用,所以静态的方法无法引用到该类的任何实例变量。在此情况下,静态的方法也不会知道可以使用那个实例变量值。
public class Duck {
private int size;
public static void main(String[] args) {
System.out.println("Size of duck is" + size); //哪一个Duck?此时我们无法得知堆行是否有Duck
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
静态的方法也不能调用非静态的方法
public class Duck {
private int size;
public static void main(String[] args) {
System.out.println("Size of duck is" + getSize); //调用getSize()会需要用到size实例变量,到底要谁的size?
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
静态变量它的值对所有的实例来说都相同。
静态变量是共享的。
同一类所有的实例共享一份静态变量。
实例变量:每个实例一个。
静态变量:每个类一个。
总结:
1、静态的方法应该用类的名称来调用,而不是用对象引用变量。
2、静态的方法可以直接调用而不需要堆上的实例。
3、静态的方法是一个非常实用的方法,它不需要特别的实例变量值。
4、静态的方法不能存取非静态的方法。
5、如果类只有静态方法,你可以将构造函数标记为private的以避免被初始化。
6、静态变量为该变量所属类的成员所共享。静态变量只会有一份,而不是每个实例都有自己的一份。
7、静态方法可以存取静态变量。
8、在Java中的常量是把变量同时标记为static和final的。
9、final的静态变量值必须在声明或静态初始化程序中赋值:
static{
DOG_CODE = 452;
}
10、常量的命名惯例是全部使用大写字母。
11、final值一旦被赋值就不能更改。
12、final的方法不能被覆盖。
13、final的类不能被继承。
14、静态的方法不能调用非静态变量