首页 > 试题广场 >

下面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
初始化时静态代码块仅执行一次
发表于 2018-08-29 11:56:16 回复(0)

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。看代码:

public class InitialOrderTest {
    // 静态变量
    public static String staticField = "静态变量";
    // 变量
    public String field = "变量";
    // 静态初始化块
    static {
        System.out.println(staticField);
        System.out.println("静态初始化块");
    }
    // 初始化块
    {
        System.out.println(field);
        System.out.println("初始化块");
    }
    // 构造器
    public InitialOrderTest() {
        System.out.println("构造器");
    }
    public static void main(String[] args) {
        new InitialOrderTest();
    }
}

结果:

1. 静态变量
2. 静态初始化块
3. 变量
4. 初始化块
5. 构造器

对于继承情况下的类的初始化是怎样的呢?看代码:

class Parent {
    // 静态变量
    public static String p_StaticField = "父类--静态变量";
    // 变量
    public String p_Field = "父类--变量";
    // 静态初始化块
    static {
        System.out.println(p_StaticField);
        System.out.println("父类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(p_Field);
        System.out.println("父类--初始化块");
    }
    // 构造器
    public Parent() {
        System.out.println("父类--构造器");
    }
}
public class SubClass extends Parent {
    // 静态变量
    public static String s_StaticField = "子类--静态变量";
    // 变量
    public String s_Field = "子类--变量";
    // 静态初始化块
    static {
        System.out.println(s_StaticField);
        System.out.println("子类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(s_Field);
        System.out.println("子类--初始化块");
    }
    // 构造器
    public SubClass() {
        System.out.println("子类--构造器");
    }
    // 程序入口
    public static void main(String[] args) {
        new SubClass();
    }
}

结果:

1. 父类--静态变量
2. 父类--静态初始化块
3. 子类--静态变量
4. 子类--静态初始化块
5. 父类--变量
6. 父类--初始化块
7. 父类--构造器
8. 子类--变量
9. 子类--初始化块
10. 子类--构造器

可以注意到一点,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。


那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。
编辑于 2019-08-25 23:23:09 回复(1)
/**  *   代码执行顺序:  *   父类静态代码块 -->  子类静态代码块 --> 父类代码块 --> 父类构造方法 --> 子类代码块 -->  子类构造方法 --> 子类覆写方法  *   注意:1,静态代码块只执行一次,但是代码块每次都执行的。  *         2,执行完父类代码块是要执行父类构造方法的,不是直接就执行子类代码块了。  *  *    下面代码执行结果:  *    AB-A-a-B-b2  *    -A-a-B-b2  */ class A{ static {
        System.out.print("A");
    }
    {
        System.out.print("-A-");
    } public A() {
        System.out.print("a");
    } public void say(){
        System.out.print("1");
    }
} class B extends A{ static {
        System.out.print("B");
    }
    {
        System.out.print("-B-");
    } public B(){
        System.out.print("b");
    } public void say(){
        System.out.print("2");
    }
} public class Hello { public static void main(String[] args) {
        A a = new B();
        a.say();
        System.out.println();
        A a1 = new B();
        a1.say();
    }
}
发表于 2018-09-22 16:06:10 回复(0)
执行顺序为:父类静态代码块 --> 子类静态代码块 --> 父类无参构造方法 --> 子类无参构造方法 
且静态代码块在初始化时仅执行一次
发表于 2018-09-02 21:37:58 回复(0)
父类--静态变量
2. 父类--静态初始化块
3. 子类--静态变量
4. 子类--静态初始化块
5. 父类--变量
6. 父类--初始化块
7. 父类--构造器
8. 子类--变量
9. 子类--初始化块
10. 子类--构造器
发表于 2020-06-20 16:34:05 回复(0)
d
发表于 2018-08-29 21:12:06 回复(0)