satic可以修饰变量,方法和代码块
静态变量:
1.static方法可以调用本类的static变量,但不能直接调用非static变量,调用非static变量必须使用对象调用。
1 public class testFunction { 2 static String HOBBY = "阅读"; 3 String ordinaryVal = "睡觉"; 4 5 public static void updateStaticValue(){ 6 System.out.println(HOBBY); 7 System.out.println(ordinaryVal); (报错了,不能直接调用,对象才可以调用非static变量) 8 }
1 public class testFunction { 2 static String HOBBY = "阅读"; 3 String ordinaryVal = "睡觉"; 4 5 public static void updateStaticValue(){ 6 System.out.println(HOBBY); 7 testFunction tf = new testFunction(); 8 System.out.println(tf.ordinaryVal); #(正确) 9 }
静态方法:
1.静态方法可以被继承但是不能被重写;
public class Second { public static void eat(){ System.out.println("Secode_eat!!!"); } public void drink(){ System.out.println("Secode_drink!!!"); } }
不可以重写:
可以继承,t.eat()的结果是Second类eat()的结果:
静态代码块:
1.静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
public class testFunction { int num1; int num2; static int num3; public testFunction() {// 构造方法 num1 = 11; System.out.println("通过构造方法为变量num1赋值"); } { // 初始化块 num2 = 22; System.out.println("通过初始化块为变量num2赋值"); } static {// 静态初始化块 num3 = 33; System.out.println("通过静态初始化块为静态变量num3赋值"); } public static void main(String[] args) { testFunction s = new testFunction();
testFunction t = new testFunction();
} }
结果:
通过静态初始化块为静态变量num3赋值
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。类是在第一次使用的时候才加载,加载之后就不会移除