文档章节

JAVA对象的初始化顺序

ted123
 ted123
发布于 2016/02/16 10:19
字数 326
阅读 24
收藏 0

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

复制代码

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-------

复制代码

 

© 著作权归作者所有

共有 人打赏支持
ted123
粉丝 0
博文 14
码字总数 6236
作品 0
南京
两道面试题带你解析 Java 类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ } class Father extends Grandpa{ }class Son extends Father{ }public class Initialization...

06/13
0
0
两道面试题,带你解析Java类加载机制

文章首发于【博客园-陈树义】,点击跳转到原文《两道面试题,带你解析Java类加载机制》 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: 请写出最后的输出字符...

陈树义
06/12
0
0
Java的初始化机制、垃圾回收机制和内存分配机制

刚才在网上看到一篇关于java初始化、垃圾回收机制和内存分配机制的文章,感觉不错,就拿来转发了,以后有空可以再看看,应该会有新的认识和新的收获。 文章: 2.1初始化顺序: [java]view p...

java_T
2013/03/17
0
0
java中类的加载顺序介绍(ClassLoader) 

java中类的加载顺序介绍(ClassLoader) 1、ClassNotFoundExcetpion   我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异常,今天我就来总结一下这个问题。对于这个异常,它...

DemonsI
09/02
0
0
Java 语言中的实例初始化块 ( IIB) 详解

在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB )。不过我觉得介绍的有点简单了,于是,再写一篇文章详细介绍下吧。 Java 语言中,存在三种操作:方法 ...

beves
10/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL SQL 常见用法

某字段重复记录 select a.fieldA from tableA a group by a.fieldA having count(a.fieldA)>1;==select * from (select a.fieldA, count(1) as faCount from tableA a group......

园领T
57分钟前
1
0
如何使用 iptables 和 firewalld 工具来管理 Linux 防火墙规则

以下是如何使用 iptables 和 firewalld 工具来管理 Linux 防火墙规则。 防火墙 防火墙是一组规则。当数据包进出受保护的网络区域时,进出内容(特别是关于其来源、目标和使用的协议等信息)会...

linuxprobe16
今天
1
0
发生系统错误 5 拒绝访问

1、使用命令net start *开启一个服务的时候,出现发生系统错误5,拒绝访问。 解决:切换到管理员模式执行此命令即可。

fang_faye
今天
1
0
devops 成长路线

https://36kr.com/p/5157249.html

swingcoder
今天
1
0
Java内存区域的划分和异常

行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域。 程序计数器 线程私有。可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通过改变这个计数值来读...

架构师springboot
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部