静态方法
Java是面向对象的,但若处于某种特殊情况下(通常是实用方法),则不需要类的实例。static这个关键词可以标记出不需类实例的方法。一个静态的方法就是不需要实例变量、不需要对象的行为。
带有静态方法的含义
带有静态方法的类通常不打算要被初始化。
想要不让类被初始化可以有两种途径:
- 用abstract标记类。抽象的类不能被初始化。
- 用私有的构造函数来限制非抽象类被初始化(Math防止被初始化的方法)。
Math类
Math方法不需要创建Math实例就可使用,我们用的是类本身。
静态变量
静态变量的值对所有实例来说都相同,静态变量是被同类的所有实例共享的变量。
静态变量会在该类的任何静态方法执行前就初始化。(默认值与实例变量相同)
public class Duck {
private int size;
public static int duckCount = 0;
public Duck() {
duckCount++;
size = 20;
}
public static void main(String[] args) {
System.out.println(Duck.duckCount);//实例创建前
Duck d1 = new Duck();
//类和类的实例共享静态变量
System.out.println(d1.duckCount);
Duck d2 = new Duck();
System.out.println(Duck.duckCount);
Duck d3= new Duck();
System.out.println(d2.duckCount);
}
}
输出:
0
1
2
3
静态的final变量是常量
一个被标记为final的变量代表它一旦被初始化之后就不会改动,也就是说类加载之后静态final变量就一直维持原值。以Math.PI为例:
public static final double PI = 3.141592653589793;
- 此变量被标记为public,因此可供各方读取。
- 此变量被标记为static,不需要Math实例。
- 此变量被标记为final,其值不可改变。
静态final变量的初始化:
静态final变量必须人工初始化。
声明的时候
public class Foo {
public static final int FOO_X = 20;
}
在静态初始化程序中
静态初始化程序是一段在加载类时会执行的程序代码,它会在其它程序可以调用该类之前就执行,所以很适合放静态final变量的起始程序。
public class Foo {
public static final int FOO_X;
static {//这段程序在类被加载时执行
FOO_X = 20;
}
}
非静态final变量
- final的变量代表不能改变它的值。
- final的方法不能被覆盖。
- final的类不能被继承。