为了账号安全,请及时绑定邮箱和手机立即绑定

请问这个题执行顺序是什么

请问这个题执行顺序是什么

杨魅力 2019-04-23 15:07:02
》》》》》》问题1package java_study;/**请说出下列代码的输出结果*/public class A {private static A a = new A();private C c = new C();static {System.out.println("3");}public A() {System.out.println("4");}public static void main(String[] args) {System.out.println("Hello");}}//定义一个父类Bclass B{B(){     System.out.println("B的构造方法"); }}//定义一个子类C 继承 Bclass C extends B{static {     System.out.println("1"); } public C(){     super();     System.out.println("2"); }}》》》》》》》》问题2如果该父类引用所调用的方法参数列表未定义,就调用该父类的父类中查找,如果还没找到就强制向上类型转换参数列表中的参数类型,具体优先级高到低依次如下:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。能给我解释一下这方面的问题吗??
查看完整描述

2 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

执行结果:
1
B的构造方法
2
4
3
Hello

虚拟机首先,会加载类的信息,如果类中有静态方法,则会执行静态方法,有多个静态方法,则按顺序执行,构造方法则是在实例化该类(创建对象)时才调用。
虚拟机首先,优先加载含有main函数的主类,所以先加载A类,发现A类中有一个静态代码成员,所以先执行

private static A a = new A();

new A()则是创建对象了,就会执行A的构造函数,实例化A的时候,会初始化A的成员变量,也就是:

private C c = new C();

这时,虚拟机会先去加载C的类信息,发现其中也有静态方法,则会执行:

static {
    System.out.println("1");
}

加载完后,会接着刚刚的程序,接着实例化C:

public C(){
    super();
    System.out.println("2");
}

这个spuer();则是构造父类了,然后就会去构造B:

B(){
    System.out.println("B的构造方法");
}

执行完后,接着刚刚的C的构造方法执行:

System.out.println("2");

此时,A类的成员变量已经初始化完毕了,可以构造A类了,执行A的构造函数:

public A() {
System.out.println("4");
}

此时,A的第一个静态方法执行完毕,执行第二个静态方法:

static {
            System.out.println("3");
        }

执行完后,所有的类信息都加载完毕了,然后执行主函数:

public static void main(String[] args) {

System.out.println("Hello");
}

希望对你有帮助


查看完整回答
反对 回复 2019-05-14
?
UYOU

TA贡献1878条经验 获得超4个赞

1B的构造方法243hello
关键点在于new方法发生了什么.
虚拟机加载类信息->虚拟机初始化对象-->对象在虚拟机中初始化完成->执行java中new方法
可以看到 自己写的new方法(构造器)尚未执行时对象就已经初始化完成了

查看完整回答
反对 回复 2019-05-14
  • 2 回答
  • 0 关注
  • 453 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信