Java中常常有一些静态块,这是用来在生成类以前进行的初始化,不管java还C++语言中的static,都是最早初始化好的。结构以下:
static {
静态语句代码块
}
{
非静态语句代码块
}
异同点
相同点:都是在JVM加载类时且在构造方法执行以前执行,在类中均可以定义多个,通常在代码块中对一些static变量进行赋值。
不一样点:静态代码块在非静态代码块以前执行(静态代码块-->非静态代码块-->构造函数)。
静态代码块只在第一次new(或者只要访问了就)执行一次,以后不在执行,而非静态代码块在每new一次都会执行一次,跟构造函数同样。非静态代码块能够在普通方法中定义(我的感受做用不大);而静态代码块不行。
Java代码 java
public class TestStatic { static { System.out.println("基类 Static 静态语句块"); } public TestStatic() { System.out.println("基类 默认无参构造器"); } { System.out.println("基类 非静态语句块"); } public static void Iint() { System.out.println("基类 Static Iint"); } }
public class User extends TestStatic { private static final long serialVersionUID = 1L; public final double i = Math.random();// 每次获得的结果不同 private final static int finalID; private static int finalID2; private int finalID3; static { System.out.println("派生类 Static 静态语句块"); finalID=1000; } { System.out.println("派生类 非静态语句块"); finalID2+=1; finalID3+=1; } /** full constructor */ public User() { System.out.println("派生类 默认无参构造器"); } public static void IintTest() { System.out.println("派生类 Static Iint"); } }
测试语句1 dom
public static void main(String[] args) {
TestStatic.Iint();//User.Iint();
}
} 函数
输出结果以下:测试
基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iintspa
测试说明了静态代码块无论怎么样都会被执行,调用基类的静态方法,派生类的静态语句块也都执行了,调用这个User.Iint(); 也是同样的结果 。code
测试语句2 对象
public static void main(String[] args) {
TestStatic.Iint();//User.Iint();
User.IintTest();
}
} blog
输出结果以下:io
基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iintclass
测试说明了 静态语句块执行一次,只是调用了派生类的静态方法被执行了
测试语句3
public static void main(String[] args) {
TestStatic.Iint();//User.Iint();
User.IintTest();
System.out.println(User.finalID);
TestStatic user = new User();
}
}
执行结果以下:
基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iint
1000
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器
测试说明了 非静态代码块在每new一次都会执行一次,跟构造函数同样的次数
测试语句4
public static void main(String[] args) {
TestStatic.Iint();//User.Iint();
User.IintTest();
System.out.println(User.finalID);
TestStatic user = new User();
System.out.println();
System.out.println("第二次初始化派生类");
User user2 = new User();
System.out.println();
System.out.println("第三次次初始化基类");
TestStatic user3 = new TestStatic ();
}
执行结果以下:
基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iint
1000
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器
第二次初始化派生类
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器
第三次次初始化基类
基类 非静态语句块
基类 默认无参构造器
测试说明了静态代码块在非静态代码块以前执行(静态代码块-->非静态代码块-->构造函数)。
静态代码块只在第一次new(或者只要访问了就)执行一次,以后不在执行,而非静态代码块在每new一次都会执行一次,跟构造函数同样.
小结:
一、静态代码块是在类加载时自动执行的,非静态代码块在建立对象自动执行的代码,不建立对象不执行该类的非静态代码块。 顺序: 静态代码块--》非静态代码块--》类构造函数。
二、在静态方法里面只能直接调用同类中其余的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。由于对于非静态的方法和变量,须要先建立类的实例对象后方可以使用,而静态方法在使用前不用建立任何对象。
三、若是某些代码必需要在项目启动时候就执行的时候,咱们能够采用静态代码块,这种代码是主动执行的;须要在项目启动的时候就初始化,
在不建立对象的状况下,其余程序来调用的时候,须要使用静态方法,此时代码是被动执行的。 区别:静态代码块是自动执行的; 静态方法是被调用的时候才执行的; 做用:静态代码块能够用来初始化一些项目最经常使用的变量和对象;静态方法能够用做不建立对象也能够能须要执行的代码。