这几天在学习javaWeb,学到框架后看了点源码,发现自己java的基础实在薄弱!特此恶补了Java基础,今天看了些类的继承方面的内容,感受颇深!记录下来以免以后忘记
首先一个类中的成员变量或者方法被调用的时候就已经加载了这个类,但是如果此类有父类,那么便会先去加载父类
那么Z继承了X,在new Z()的时候究竟做了什么呢?
首先,我们明确
1.加载类的时候,会先扫一遍所有的static变量或者staitc代码块。如果有,会在类加载的时候把这些static的先载入,此时还没有加载任何的方法,或者普通的成员变量。
也就是说new Z(),首先要知道什么是class Z吧!但是很不巧class X是Z的父类,此时就要先去加载X,查看X中是否有静态变量或者静态代码块。有的话加载
2.一个类在初始化的时候,首先要是成员变量的初始化。
3.子父类的初始化顺序是,父类先初始化,然后是子类的初始化
那么new Z()的时候,根据上面所说的1,本是想加载Z的,但是要先加载X,而X中若是存在一些static关键字,则要把这些也加载好,然后再加载Z(如果Z中也有一些static关键字的话)。
而想要通过构造函数实例化一个对象,就要初始化这个类,然后根据3得到,要先按照2初始化父类,然后初始化子类,整个过程就完美的结束了
附上一个有意思的代码
public class X {
public int a=method();
public static int t=method();
static{
System.out.println("X的静态代码块");
}
{
System.out.println("X的构造代码块");
}
public X() {
System.out.println("X");
}
public static int method(){
System.out.println("初始化静态代码method");
return 10;
}
}
public class Z extends X{
public int t=method();
static{
System.out.println("Z的静态代码块");
}
{
System.out.println("Z的构造代码块");
}
Z(){
System.out.println("Z");
}
public static int method(){
System.out.println("Z的静态method");
return 10;
}
public static void main(String[] args) {
Z z=new Z();
}
}
初始化静态代码method2
X的静态代码块
Z的静态代码块
初始化静态代码method2
X的构造代码块
X
Z的静态method
Z的构造代码块
Z