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(); }}
动态代码块只会在类加载的时候只会执行一次,接下的类加载都不会执行。因而初始化操作能够放到动态代码块中执行,能够大大晋升效率。