用 static 修饰符修饰,可以是变量、方法或代码块
- 类中的静态变量、方法或代码块属于类,而不属于某个特定的对象。
- 类的静态成员可以直接与类的名称一起使用,而无需创建类的对象。
- 静态变量或方法也称为类变量或类方法
User:
public class User {
// 多个代码块执行是顺序执行, 代码块在创建对象之前由 JVM 自动调用
{
System.out.println("代码块1...");
}
{
System.out.println("代码块2...");
}
// 在调用静态变量和静态方法之前由JVM自动调用,顺序调用
static {
System.out.println("静态代码块1...");
}
static {
System.out.println("静态代码块2...");
}
// 静态变量、类变量
static String WORD = "静态变量word...";
// 静态方法、类方法
public static void show() {
System.out.println("静态方法show()...");
}
//成员方法
public void eat() {
System.out.println("成员方法eat()...");
}
//构造方法
public User() {
System.out.println("构造方法...");
}
}
Test:
public class Test {
public static void main(String[] args) {
new User();
}
}
结果:
静态代码块1...
静态代码块2...
代码块1...
代码块2...
构造方法...
如果Test为:
public class Test {
public static void main(String[] args) {
System.out.println(User.WORD);
User.show();
}
}
则结果为:
静态代码块1...
静态代码块2...
静态变量word...
静态方法show()...
执行顺序
- 静态代码块->代码块->构造函数
- 当类被加载的时候JVM会初始化所有的 static 修饰的属性、方法、代码块(自动顺序执行)
- 在调用构造函数之前JVM会初始化所有的成员属性、方法、代码块(自动顺序执行)
由于初始化顺序:静态方法中只能访问静态变量和静态方法
final 关键字
public final static String SURNAME="CAO";
final 修饰符可应用于类、方法和变量。
- final 在应用于类、方法和变量时意义是不同的,但本质是一样的: final 表示不可改变。
- 声明为 final 的类不能被继承。
- 声明的方法不能被重写, 如果一个类是 final 类,那么它的所有方法都隐式的是 final 方法;
- 声明的变量必须赋初值。 它实质上就是一个常量;
- final的常见类:String System 包装类(Integer,Short,Byte,Long…)