本帖最后由 刘树弘 于 2014-10-15 12:19 编辑
- public class Static_ extends BS{
- static {
- new BS(0);
- }
- static BS bs1= new BS(1);
- {
- new BS(3);
- }
- BS bs3 = new BS(4);
- public Static_(Object o){
- System.out.println("构造 Static_ Object");
- }
- public Static_(String s){
- System.out.println("构造 Static_ String");
- }
-
- {
- new BS(5);
- }
- static {
- new BS(2);
- }
- public static void main(String[] arge){
- new Static_(null);
- new Static_(new Object());
- }
-
- }
- class BS {
- static{
- System.out.println("BS 静态代码块");
- }
- public BS(int i ){
- System.out.println("构造B"+i);
- }
- public BS(){
- this(-1);
- }
- }
复制代码
输出:
BS 静态代码块
构造B0
构造B1
构造B2
构造B-1
构造B3
构造B4
构造B5
构造 Static_ String
构造B-1
构造B3
构造B4
构造B5
构造 Static_ Object
结论:
静态赋值语句和静态代码块总是先于构造相关的代码执行。
父类代码先与子类代码执行。
同样是静态的代码,写在前面的代码先于后面的执行。构造的代码相似。
构造赋值语句和构造代码块总是先于构造函数执行。
总是调用参数类型完全一致的构造函数。
静态代码只执行一次。
能用赋值语句解决的就用赋值语句解决。否则用代码块解决(比如初始化某值可能抛异常,或某方法应当调用却没有返回值);
初始化某个类型的对象时,每个对象都要调用的代码放构造赋值语句和构造代码块,否则构造函数。
|