java中类的初始化顺序

来源:互联网 发布:知乎注册不了为什么 编辑:程序博客网 时间:2024/06/07 23:34

1、成员变量

成员变量分为静态变量和实例变量,静态变量属于某个类,该类没有实例化之前就可以调用,通过类.静态变量就可以调用,而实例变量属于某个实例对象,必须通过new关键字来创建该类的实例对象才能调用该类的实例变量(没有被static关键字修饰的变量,称为实例变量)。

2、函数(方法)

在类中方法分为静态方法和实例方法(普通方法),它们的区别:

*外部调用静态方法或者本类的Main主方法中调用时,静态方法可以通过类. 静态方法就能完成调用,所以类中的静态方法无需创建该类的对象就可以实现调用,而实例(普通)方法必须要通过new关键字创建该类的实例对象才能调用该类的实例对象。

*静态方法只能访问该类的静态成员变量,不能访问非静态的成员变量,原因是生命周期不一样,被static关键字修饰的属性和方法是随着类的加载而存在的,而非静态的实例变量则是在该类被创建时才会初始化。如果该类只加载而没有创建实例对象,则无法直接访问非静态的实例变量。反之,实例(普通)方法没有限制可以访问静态的实例变量。

3、静态代码块

在类中被static关键字声明为代码段的叫做静态初始化块。

如下:

static{

//代码块

}

(1)一个类中可以声明多个静态代码块,而执行的顺序是根据所定义的顺序进行的。

(2)静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面。

(3)静态代码块在该类被加载时自动执行。

(4)静态代码块只能访问类的静态成员变量,而不能访问实例变量,同理,只要被static关键字声明的代码都不允许访问实例(普通)成员变量。

4、静态成员变量

Java允许以类作为静态成员的变量,那么静态成员变量相当于一个对象。如果是基本数据类型的静态成员变量,在外部或本类的main方法中可以直接通过类名.静态成员变量就可以完成调用。但是,以类名作为静态成员变量的类型这里就要注意了。因为该静态成员变量的类,类中有静态变量和非静态(实例)变量,而非静态(实例)变量必须要在类实例化之后才能成功调用。而JVM不会自动给静态的类变量创建实例。所以程序会报java.lang.NullPointerException,普通方法也是如此。

5、Java中类初始化顺序:

1、对于(静态变量)(静态初始化块)(变量)(初始化块)(构造函数)来实现初始化顺序,两种情况存在它们依次初始化顺序是:

该类没有父类时:

  (静态变量、静态初始化块)>(变量、初始化块)>(构造函数)


该类有父类存在时:

  父(静态变量)(静态初始化块)>子(静态变量)(静态初始化块)>父(变量)(初始化块)(构造函数)>子(变量)(初始化块)(构造函数)


由此我们得出结论:

当java首次加载类时,如果该类有父类首先初始化父类的变量和初始化块,但静态方法在没有被调用的情况下时不会执行的,而非静态的方法或变量必须实例化该类的对象下在被调用的情况下才能被执行。静态变量和静态初始化块的级别是一样的,而非静态的变量和非静态的初始化块的级别是一样的。


1 0