不管是静态变量,还是非静态变量,都是先初始化变量之后再执行构造方法
类中的变量分为3大类:局部变量、实例变量(成员变量)、类变量(静态变量)
public class App {
public static void main(String[] args) {
A c = new A(3);
System.out.println(c.a);
System.out.println(A.b);
}
}
class A {
public int a;//实例变量
static{
System.out.println("初始化a");
}
public static int b =9 ;//类变量
public A(int data){
System.out.println("A被初始化");
} //一旦类自己写了构造方法,不管是带参或不带参的构造方法,系统将不再使用自带的无参构造器。如果只写了有参构造函数,却要调用无参构造方法,编辑器会报错。
}
初始化顺序:走到A c = new A(3)时,先把A类的相关信息加载进来,静态变量赋予默认值,然后执行(类变量)静态变量或静态代码块赋初值,如果没有初始值将不执行这部(静态变量和静态代码块两者之间没有顺序,谁在前谁先执行)--》然后给实例变量赋默认值--》初始化实例变量(如果有初始值)--》执行构造方法;
public class App {
public static void main(String[] args) {
A c = new A(3);
System.out.println(c.a);
System.out.println(A.b);
}
}
class A extends B{
public int a =10;
static{
System.out.println("初始化a");
}
public static int b =9;
public A(int data){
//super(3);
this.b = data;
System.out.println("A被初始化");
}
}
class B{
int b1 = 9;
static int b2=90;
public B(){
System.out.println("初始化B");
}
public B(int data){
System.out.println(data);
}
}
有继承关系的类的初始化跟单个类有点不同:
A c = new A(3);先执行加载,把子类和基类的信息全部加载到方法区(静态变量赋予默认值)-》执行基类的静态变量初始化(如果有初始值)和静态代码块--》子类的基类的静态变量初始化(如果有初始值)和静态代码块--》加载子类和父类的实例变量,并赋予默认值--》执行父类的实例变量初始化(如果有初始值)和父类的构造方法--》执行子类实例变量初始化(如果有初始值)和子类构造方法;
对于构造方法来说,有以下注意点:
1、子类不重写构造方法,采用默认的构造方法,默认会去调用父类的默认无参构造方法,如果父类一旦重写了构造方法,一定要重写无参构造方法;
2、子类重写了构造方法(不管是否带参),如果没有显示调用父类的某个构造方法,默认还是调用父类的无参构造方法,此时同样,如果父类一旦重写了构造方法,一定要重写无参构造方法;
3、子类重写了构造方法(不管是否带参),如果显示调用父类的某个带参构造方法,此时父类可以没有无参构造方法,只要含有子类调用的有参构造方法即可。