首页 > 试题广场 >

下面java程序的运行结果是 class A {

[单选题]
下面java程序的运行结果是
class A {
    static {
        System.out.print("A");
    }
    public A() {
        System.out.print("a");
    }
    void say() {
        System.out.print("1");
    }
}
class B extends A {
    static {
        System.out.print("B");
    }
    public B() {
        System.out.print("b");
    }
    void say() {
        System.out.print("2");
    }
}
public class Hello {
    public static void main(String[] args) {
        A ab = new B();
        ab.say();
        ab = new B();
        ab.say();
    }
}
  • ABab2ABab2
  • AaBb1AaBb2
  • ABab1ab2
  • ABab2ab2
1.实例化B B所在类未加载 首先加载B所在类B B有父类A  所以类加载顺序 A,B 打印AB
2.实例化B 调用父类构造方法 再调用自身构造方法 打印ab
3.B中重写了父类say 直接调用本身类的say 打印2
4.第二次实例化B 类加载只会执行一次 1中已完成 直接重复2 3步骤 打印ab2
ABab2ab2
编辑于 2018-03-28 11:38:53 回复(0)
加载顺序  父类静态成员->父类静态代码块->子类静态成员->子类静态代码块->父类普通成员->父类代码块->父类构造函数->子类普通成员->子类代码块->子类构造函数
只有类第一次加载的时候加载静态成员与代码块
编辑于 2018-03-26 13:28:39 回复(2)
先执行父类和子类的静态方法,再执行父类和子类的构造函数,父类的say方法已经被重写了,所以执行子类的say方法
发表于 2018-04-07 11:22:50 回复(0)
先有父 再有儿子,所有先得构造父亲,在构造儿子
发表于 2018-03-26 20:58:13 回复(0)