JAVA对象的初始化顺序
博客专区 > ted123 的博客 > 博客详情
JAVA对象的初始化顺序
ted123 发表于2年前
JAVA对象的初始化顺序
  • 发表于 2年前
  • 阅读 14
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

摘要: JAVA对象的初始化顺序:静态代码块 -->构造代码块 --> 构造函数;

 下面程序的运行结果是什么()

复制代码

clclass HelloA {
    public HelloA() {
        System.out.println("HelloA");
    }
    
    { System.out.println("I'm A class"); }
    
    static { System.out.println("static A"); }
}
public class HelloB extends HelloA {
    public HelloB() {
        System.out.println("HelloB");
    }
    
    { System.out.println("I'm B class"); }
    
    static { System.out.println("static B"); }
    
    public static void main(String[] args) { 
     new HelloB(); 
   }
}

复制代码

答案:

static Astatic B
I'm A classHelloA
I'm B class
HelloB

解析:说实话我觉得这题很好,考查静态语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序。

对象的初始化顺序:(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;(2)当static语句执行完之后,再执行main方法;(3)如果有语句new了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。

下面稍微修改下上面的代码,以便更清晰的说明情况:

package com.test;

class HelloA {

 public HelloA() {
  System.out.println("HelloA");
 }

 {
  System.out.println("I'm A class");
 }

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

}

public class HelloB extends HelloA {
 public HelloB() {
  System.out.println("HelloB");
 }

 {
  System.out.println("I'm B class");
 }

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

 public static void main(String[] args) {

  System.out.println("-------main start-------");
  new HelloB();
  new HelloB();
  System.out.println("-------main end-------");
 }
}

此时输出结果为:

复制代码

static Astatic B-------main start-------I'm A classHelloA
I'm B classHelloB
I'm A classHelloA
I'm B classHelloB-------main end-------

复制代码

 

共有 人打赏支持
粉丝 0
博文 14
码字总数 6236
×
ted123
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: