static
当某个事物是静态时,就意味着该字段或方法不依赖于任何特定的对象实例。即使我们从未创建过该类的对象,也可以调用其静态方法或访问其静态字段,这样就不需要实例化新对象,产生开销。。
相反,对于普通的非静态字段和方法,我们必须要先创建一个对象并使用该对象来访问字段或方法,因为非静态字段和方法必须与特定对象关联。
static 变量和方法
class Util {
public final int num = 100;
public static int staticNum = 100;
public int getAbs(int num) {
return Math.abs(num);
}
public static int getSum(int a, int b) {
// 错误,不能静态方法不能访问非静态变量。
System.out.println(c);
// 错误,不能静态方法不能访问非静态变量。
getAbs(-10);
return a + b;
}
}
class Main {
public static void main(String[] args) {
// 正确,通过类访问静态方法
System.out.println(Util.getSum(1, 2));
// 正确,通过类访问静态变量
System.out.println(Util.staticNum);
// 警告,通过类的实例调用静态方法,相当于Util.getSum(1, 2)。
// 此处虽然不会保存,但可能会产生一系列问题,不推荐使用、
System.out.println(new Util().getSum(1, 2));
}
}
当使用static
修饰的某个方法 | 变量时候,我们称其为静态方法|变量。
静态方法|变量不属于任何对象,因此不可以通过this
关键字调用该方法|变量,只可以通过类名来访问。
在静态方法中不能访问该类的非静态成员变量和非静态成员方法,因为类的非静态成员变量和非静态成员方法都必须依赖具体的对象才能够被调用。
static代码块
class Test {
static {
System.out.println("static block!");
}
public Test() {
System.out.println("constructor!");
}
}
public class Main {
public static void main(String[] args) {
/**
* 运行结果
* static block!
* constructor!
* constructor!
*/
new Test();
new Test();
}
}
静态代码块只会在类加载的时候只会执行一次,接下的类加载都不会执行。因此初始化操作可以放到静态代码块中执行,可以大大提升效率。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。