- 1、static修饰变量
- 2、static修饰方法
- 3、static修饰代码块
- 4、静态导包
对比:
static变量属于类,通过类名调用,存放在内存区域中的方法区中。
非static变量属于对象,通过对象的引用调用,存放在内存区域中的堆中。
代码:
public class Main {
public static void main(String[] args) {
System.out.println(Number.num1);
System.out.println(new Number().num1); //可以通过对象引用调用静态变量,但是编译器会给出警告
System.out.println(new Number().num2);
}
}
class Number {
public static int num1 = 10;
public int num2 = 20;
}
结果:
2、static修饰方法10
10
20
对比:
static方法属于类,通过类名调用,存放在内存区域中的方法区中。
非static方法属于对象,通过对象的引用调用,存放在内存区域中的堆中。
static方法和变量几乎一样,static方法也可以通过对象引用调用,但是编译器会给出警告。
代码略。
对于类的初始化块,static和非static初始化块的区别主要体现在它们的执行时机上。静态初始化块在jvm加载类时就会被执行,而非静态初始化块只有在创建对象时才会被执行。因此,静态初始化块只会被执行一次,而非静态初始化块可以执行多次。
通过下面的代码可以简单体会静态初始化块和初始化块的加载时机的区别。
代码:
public class Main {
public static void main(String[] args) {
System.out.println("现在未创建Test类的实例");
Test test1 = new Test();
System.out.println("现在已经创建Test类的实例");
Test test2 =new Test();
System.out.println("现在创建了Test类的第二个实例");
}
}
class Test {
static {
System.out.println("执行静态初始化块");
}
{
System.out.println("执行非静态初始化块");
}
public Test() {
System.out.println("执行构造函数");
}
}
结果:
现在未创建Test类的实例
执行静态初始化块
执行非静态初始化块
执行构造函数
现在已经创建Test类的实例
执行非静态初始化块
执行构造函数
现在创建了Test类的第二个实例
由此可见,在第一次用到某个类的时候,jvm会先加载这个类的信息,并执行静态初始化块,此后这个代码块不会再被执行。
4、静态导包这种用法比较少见,这里举一个简单的例子。
代码一:
public class Main {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
}
}
结果:
2147483647
代码二:
import static java.lang.System.*;
import static java.lang.Integer.*;
public class Main {
public static void main(String[] args) {
out.println(MAX_VALUE); // 静态导包后,这里可以不必写全
}
}
结果:
2147483647
这种写法会降低代码的可读性,最好不要使用。



