类加载程序分析题
程序员文章站
2022-10-03 16:19:12
类加载程序分析题请写出以上代码的执行结果:所需知识点父类优于子类(儿子肯定干不过爸爸)静态优于非静态:静态中(静态变量、静态代码块、静态方法【不运行只加载】):根据你编码顺序,从上至下运行非静态(非静态常量、普通代码块、构造器):非静态变量和普通代码块,优于构造器PS1:构造器最后执行非静态变量和普通代码块按照编码顺序执行。PS2:父类的静态属性加载完会加载子类的静态属性子父静态加载完——>加载父类解题思路:先找主方法main public static vo...
类加载程序分析题
请写出以上代码的执行结果:
所需知识点
- 父类优于子类(儿子肯定干不过爸爸)
- 静态优于非静态:
静态中(静态变量、静态代码块、静态方法【不运行只加载】):
根据你编码顺序,从上至下运行
非静态(非静态常量、普通代码块、构造器):
非静态变量和普通代码块,优于构造器
PS1:
构造器最后执行非静态变量和普通代码块按照编码顺序执行。
PS2:
父类的静态属性加载完会加载子类的静态属性
子父静态加载完——>加载父类
解题思路:
- 先找主方法main
public static void main(String[] args) {
System.out.println("1");//输出1;
new D();
}
运行输出1
- 其中D为C的子类,C为B的子类,所以C的优先级高于D,B的优先级高于C
class D extends C
class C extends B
- 故先执行B,其中静态优于非静态故先执行static静态属性
class B {
E e = new E();
static F f = new F();//先执行等号右边,创建一个F类,构造器执行输出4
public String sb = getSb();
static {
System.out.println("6");//然后执行输出6
f.funcOff();//F类中funcoff构造方法输出5
}
{
System.out.println("7");
}
B() {
System.out.println("8");
e.funcOff();
}
public String getSb() {
System.out.println("9");
return "sb";
}
}
- B的静态执行完,接着执行C当中的静态
class C extends B {
static {System.out.println("10");} //输出10
{System.out.println("11");}
C() {System.out.println("12");}
}
- C的静态执行完,最后执行D的静态
class D extends C {
public String sd1 = getSd1();
public static String sd = getSd();//等号右边先执行,getSd()当中的值返回给sd,输出16
static {System.out.println("13");}//输出13
{System.out.println("14");}
D() {System.out.println("15");}
static public String getSd() {
System.out.println("16");
return "sd";
}
public String getSd1(){
System.out.println("17");
return "sd1";}
}
父类的静态属性加载完会加载子类的静态属性
子父静态加载完——>加载父类
- 加载B
class B {
E e = new E();//E类中E构造器执行输出2
static F f = new F();////静态已执行
public String sb = getSb();//getsb()构造器输出9
static {
System.out.println("6");
f.funcOff();
}//静态已执行
{
System.out.println("7");
}//输出7
B() {
System.out.println("8");//输出8
e.funcOff();//E类中,funcOff()构造器执行输出3
}
public String getSb() {
System.out.println("9");
return "sb";
}
}
- 加载C
class C extends B {
static {
System.out.println("10");
}////静态已执行
{
System.out.println("11");
}//输出11
C() {
System.out.println("12");
}//输出12
}
7.加载D
class D extends C {
public String sd1 = getSd1();//gerSd1()构造器输出17
public static String sd = getSd();//静态已执行
static {System.out.println("13");}//静态已执行
{System.out.println("14");}//输出14
D() {System.out.println("15")}
static public String getSd() {
System.out.println("16");
return "sd";
}//静态已执行
public String getSd1(){
System.out.println("17");
return "sd1";
}
}
- 最后执行main方法
public static void main(String[] args) {
System.out.println("1");//已经执行
new D();//输出D类中D()构造器执行输出15
}
最后结果1 4 6 5 10 16 13 2 9 7 8 3 11 12 17 14 15
本文地址:https://blog.csdn.net/qq_42455310/article/details/107691012
推荐阅读
-
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
-
Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常
-
SQL Server中调用C#类中的方法实例(使用.NET程序集)
-
微信小程序如何实现全局重新加载
-
Java语言中的自定义类加载器实例解析
-
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
-
基于android示例程序(bitmapfun) 高效加载图片让人无语地方
-
微信小程序image图片加载完成监听
-
Python程序设计入门(5)类的使用简介
-
第十二节 类的自动加载 [12]