首页 > 试题广场 >

下列程序执行后输出结果为( ) c...

[单选题]
下列程序执行后输出结果为(      )
class BaseClass {
    public BaseClass() {}

    {
        System.out.println("I’m BaseClass class");
    }

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

 public class Base extends BaseClass {
     public Base() {}

     {
         System.out.println("I’m Base class");
     }

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

     public static void main(String[] args) {
         new Base();
     }
 }

  • static BaseClass
    I’m BaseClass class
    static Base
    I’m Base class
  • I’m BaseClass class
    I’m Base class
    static BaseClass
    static Base
  • I’m BaseClass class
    static BaseClass
    I’m Base class
    static Base
  • static BaseClass
    static Base
    I’m BaseClass class
    I’m Base class
补充一下完整版的,执行顺序从左到右:
    父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数。

案例代码如下:
public class Father {  static {
        System.out.println("父类静态代码块");    }

    {
        System.out.println("父类非静态代码块");    }  public Father(){
        System.out.println("父类构造函数");    }   }
public class Son extends Father{  static {
        System.out.println("子类静态代码块");    }

    {
        System.out.println("子类非静态代码块");    }  public Son(){
        System.out.println("子类构造函数");    }  public static void main(String[] args) {
        Son son = new Son();    }
}

结果为:   父类静态代码块
    子类静态代码块
    父类非静态代码块
    父类构造函数
    子类非静态代码块
    子类构造函数 


发表于 2019-09-23 17:23:56 回复(8)
父类的静态代码块
子类的静态代码块
父类的构造方法
子类的构造方法
发表于 2019-06-11 16:53:37 回复(7)
1、静态优先,构造随后 2、无论静态还是构造,先父再子
发表于 2019-09-09 15:05:27 回复(4)

执行Grandpa的静态快
执行Parent的静态快
执行Child的静态快
执行Grandpa的普通块
(如果有显示调用父类构造super(),则执行,否则执行默认构造)
执行Parent的普通块
(如果有显示调用父类构造super(),则执行,否则执行默认构造)
执行Child的普通块
执行Child的构造方法(被调用:new Child();)

发表于 2019-06-10 15:44:23 回复(2)
  • Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
  • 非静态代码块是在类new一个实例的时候执行,而且是每次new对象实例都会执行。
        静态代码块服务于类,非静态代码块和构造器都是服务于对象。
        这样一来,就很容易记住以下这个顺序了:
        父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数
发表于 2020-05-02 23:15:25 回复(0)
1. 都遵循父类优先原则
2. JVM在加载字节码文件时会就会执行对应类的静态代码块,由于1,先执行父类静态代码块代码,再执行子类静态代码块
3. 创建对象:由于1,先执行父类的构造函数,再执行子类的构造函数
发表于 2019-10-03 00:05:38 回复(0)
1.静态优先,构造随后。那么为什么呢? 首先static修饰的成员变量和方法是从属于类的, 而普通变量和方法是从属于对象的,在调用某个类的构造方法之前,应该先加载类信息,包括静态初始化块!之后才能创建对象! 2.先父再子!为什么? 由于子类继承了父类,就拥有了父类的所有属性和方法(除了构造方法),但不一定可以直接访问(私有属性和方法) 子类去创建对象的时候,构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后在依次向下执行类的初始化块和构造方法,直到当前子类为止。 然后静态初始化块调用顺序,与构造方法调用顺序一样。
发表于 2019-10-31 11:12:09 回复(0)
先执行父类 static代码块,在执行子类static代码块,再执行父类普通代码块
发表于 2022-02-10 14:11:49 回复(0)
行顺序从左到右: 父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数。
发表于 2021-06-23 17:03:15 回复(0)
发表于 2020-01-11 16:45:06 回复(1)
1、静态域在类加载时就会被初始化,所以是静态域优先初始化,再是构造器初始化;
2、若加载某类时继承了父类,则无论静态域还是构造器,都是先初始化父类再初始化子类。
发表于 2019-09-18 21:13:50 回复(0)
由父及子,静态先行
发表于 2021-04-06 22:20:33 回复(0)
发表于 2020-07-05 10:32:07 回复(0)

父类优先子类,静态优先构造

发表于 2019-08-20 23:50:57 回复(0)
父子静,父非构,子非构。
发表于 2023-11-09 13:40:34 回复(0)
父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数。
发表于 2022-10-25 14:15:42 回复(0)
由父及子,静态先行。
发表于 2022-09-19 22:01:32 回复(0)
父子静,父非构,子非构。
发表于 2022-08-22 14:33:13 回复(0)
执行顺序: 1.  父类静态代码块
                   2. 子类的静态代码块
                    3. 父类非静态代码块
                    4. 父类无参构造方法
                    5. 子类的非静态代码块
                    6. 子类的无参构造方法
代码测试:
public class Father { static {
        System.out.println("父类静态代码块");  }
    {
        System.out.println("父类非静态代码块");  } public Father(){
        System.out.println("父类无参构造方法");  } public static void main(String[] args) {
        Son son = new Son();  }
} class Son extends Father{
    {
        System.out.println("子类的非静态代码块");  } static {
        System.out.println("子类的静态代码块");  } public Son(){
        System.out.println("子类的无参构造方法");  }
}

发表于 2022-08-20 21:27:47 回复(0)
静态优先。
编译时要先加载类对象,而此时优先加载的就是静态方法或者变量
也就是说对于这题,顺序应该是:父类静态->子类静态->父类构造->子类构造
发表于 2022-07-30 23:39:01 回复(0)