》》》》》》问题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"); }
希望对你有帮助
UYOU
TA贡献1878条经验 获得超4个赞
1B的构造方法243hello
关键点在于new方法发生了什么.
虚拟机加载类信息->虚拟机初始化对象-->对象在虚拟机中初始化完成->执行java中new方法
可以看到 自己写的new方法(构造器)尚未执行时对象就已经初始化完成了
添加回答
举报
0/150
提交
取消