构造器初始化

构造器初始化

在类的内部,变量定义的先后顺序决定了初始化的先后顺序,即使多个变量定义被方法所隔开,他们依旧会先于所有方法(包括构造器,构造器实际上也是一种静态方法)得到初始化。

静态数据初始化

public class StaticInitialization {
   public static void main(String[] args) {
       System.out.println("Creating new Cupboard() in main");
       new Cupboard();
       System.out.println("Creating new Cupboard() in main");
       new Cupboard();
       table.f2(1);
       cupboard.f3(1);
  }
   static Table table =  new Table();
   static Cupboard cupboard =  new Cupboard();
}
class Bowl{
   Bowl(int marker){
       System.out.println("Bowl("+marker+")");
  }
   void f1(int marker){
       System.out.println("f1("+marker+")");
  }
}
class Table{
   static Bowl bowl1 = new Bowl(1);
   Table(){
       System.out.println("Table()");
       bowl2.f1(1);
  }
   void f2(int marker){
       System.out.println("f2("+marker+")");
  }
   static Bowl bowl2 = new Bowl(2);
}
class Cupboard{
   Bowl bowl3 = new Bowl(3);
   static  Bowl bowl4 = new Bowl(4);
   Cupboard(){
       System.out.println("Cupboard()");
       bowl4.f1(2);
  }
   void f3(int marker){
       System.out.println("f3("+marker+")");
  }
   static Bowl bowl5 = new Bowl(5);
}
//Onput:
//Bowl(1)
//Bowl(2)
//Table()
//f1(1)
//Bowl(4)
//Bowl(5)
//Bowl(3)
//Cupboard()
//f1(2)
//Creating new Cupboard() in main
//Bowl(3)
//Cupboard()
//f1(2)
//Creating new Cupboard() in main
//Bowl(3)
//Cupboard()
//f1(2)
//f2(1)
//f3(1)

根据输出结果可见,只有在第一次访问静态数据的时候才会初始化,并且静态对象只会被初始化一次。初始化顺序是先静态对象(第一次访问),再是非静态对象。

静态代码块和匿名代码块

public class Person {
   //第二个输出
  {
       System.out.println("匿名代码块");
  }
   //第一个输出
   static{
       System.out.println("静态代码块");
  }
   //第三个输出
   public Person(){
       System.out.println("构造器");
  }
?
   public static void main(String[] args) {
       Person person = new Person();
       System.out.println("--------------------------");
       Person person1 = new Person();//输出只剩下匿名代码块和构造器,静态方法块只会执行一次,匿名代码块用来赋初始值
  }
}

补充

  1. 静态方法和类一起加载出来,时间片早,所以静态方法不可以调用非静态方法,但非静态方法可以调用静态方法

  2. 静态属性和静态方法一样可以直接调用,但是非静态属性不可以,非静态方法需要实例化对象只会才可以调用

public class Student {
   private static int age;
   private double score;
   public static void main(String[] args) {
       Student s1= new Student();
       System.out.println(s1.score);
       System.out.println(s1.age);
       System.out.println(Student.age);
       //System.out.println(Student.score); 编译报错,score不是静态属性
  }
}
  1. 静态导入包,可以让操作更加方便

//静态导入包,不加static会报错,这样在用随机数方法时不用Math.random(),可以直接random()
import static java.lang.Math.random;
?
public class Test {
   public static void main(String[] args) {
       System.out.println(random());
  }
}

 

构造器初始化

上一篇:查找一个整数


下一篇:go goroutine 怎样更好的进行错误处理