构造器初始化
在类的内部,变量定义的先后顺序决定了初始化的先后顺序,即使多个变量定义被方法所隔开,他们依旧会先于所有方法(包括构造器,构造器实际上也是一种静态方法)得到初始化。
静态数据初始化
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();//输出只剩下匿名代码块和构造器,静态方法块只会执行一次,匿名代码块用来赋初始值
}
}
补充
-
静态方法和类一起加载出来,时间片早,所以静态方法不可以调用非静态方法,但非静态方法可以调用静态方法
-
静态属性和静态方法一样可以直接调用,但是非静态属性不可以,非静态方法需要实例化对象只会才可以调用
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不是静态属性
}
}
-
静态导入包,可以让操作更加方便
//静态导入包,不加static会报错,这样在用随机数方法时不用Math.random(),可以直接random()
import static java.lang.Math.random;
?
public class Test {
public static void main(String[] args) {
System.out.println(random());
}
}