java继承体系下的类加载顺序与过程详解
我们知道,java是⼀种单继承语⾔,那么,在继承结构下类的加载顺序是怎么样的呢?本⽂详细介绍了继承体系下类的加载顺序与过程详解。
⾸先,根据java的JVM虚拟机类加载机制,⼀个类在使⽤时如果引⽤或使⽤了另⼀个尚未加载的类,此时JVM⾸先会加载被引⽤的那个类。然后,假设类Son继承类Father时,我们通过三种情况来考虑在继承关系下JVM的类加载顺序如何:
假设当前有两个类,第⼀个是⽗类Father,Father中有静态变量j、静态代码块、构造器、成员变量、成员代码块等,代码如下:
class Father{
static{print("加载⽗类静态代码块");}
static int j =print("加载⽗类静态变量");
int i=3;
Father(){
print("加载⽗类构造器");
}
void print(){
System.out.println("Father:"+i);
}
static int print(String str){
System.out.println(str);
return2;
};
{
print("加载⽗类普通代码块");
}
java下载过程}
第⼆个类是⼦类Son,Son继承与⽗类Father,Son中有静态代码块、静态变量k、成员变量、构造⽅法、成员代码块等,代码如下:
编程教学反思class Son extends Father{
static{print("加载⼦类静态代码块");}
int i=print("加载⼦类成员变量");
public Son(){
print("加载⼦类构造器");
}
{
print("加载⼦类普通代码块");
}
}
第⼀种情况,单独使⽤⽗类的静态变量j:(此时仅使⽤⽗类的静态资源,因此只会加载⽗类,并执⾏JVM类加载机制中的初始化阶段,执⾏所有静态语句组合起来得到的Cinit⽅法)
public class TestExtend {
public static void main(String[] args){
System.out.println(Son.j);
}
}
输出:
加载⽗类静态代码块
加载⽗类静态变量
2
第⼆种情况,单独使⽤⼦类类的静态变量k:(此时虽然仅使⽤⼦类的静态变量,但⼦类的加载会依赖⽗类的加载,因此会先后加载⽗类和⼦类)
public class TestExtend {
public static void main(String[] args){
System.out.println(Son.k);
}
}
输出:
加载⽗类静态代码块
加载⽗类静态变量
mysql安装后怎么配置环境变量⼦类静态代码块
加载⼦类静态变量
2
第三种情况,对⼦类初始化,并调⽤⼦类的成员变量i:(因为要使⽤成员变量,所以必须实例化⼦类,此时JVM不仅会先后加载⽗类和⼦类的,同时在⽗类和⼦类加载完后会调⽤⼦类的构造⽅法实例化⼦类,⽽⼦类的构造⽅法会默认先调⽤⽗类的构造器),因此结果如下:
public class TestExtend {
public static void main(String[] args){
System.out.println(new Son().i);
}
springbootapplication}
输出:
加载⽗类静态代码块
加载⽗类静态变量
⼦类静态代码块
加载⼦类静态变量
加载⽗类普通代码块
strcpy函数是原来的字吗css导航条制作教程加载⽗类构造器
⼦类成员变量
⼦类普通代码块
⼦类构造器
2
总结:
⾸先会在初始化过程会按顺序执⾏⽗类中所有静态变量和静态代码块合成的初始化⽅法。
然后执⾏本⾝类中所有的静态代码块⽅法。
然后如果对该类执⾏了实例化⽅法,则先执⾏⽗类中所有成员变量的初始化,然后执⾏⽗类的构造器⽅法。
最后执⾏该类的成员变量初始化和构造器⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论