美文网首页
一个关于实例对象初始化的题

一个关于实例对象初始化的题

作者: 穆木小七 | 来源:发表于2018-03-26 19:16 被阅读11次
import java.io.PrintStream;

public class App
{
    private static App a = new App();
    //如果不实例化App,那么jvm也就不会加载SubClass类
    private SubClass t = new SubClass();
    static 
    {   
        System.out.println(3);
    }
    public App()
    {
        System.out.println(4);
    }
    public static void main(String args[])
    {
        System.out.println("main");
    }
}
class SuperClass{
    SuperClass(){
        System.out.println("Constructor SuperClass");
    }
}
class SubClass extends SuperClass{
    static{
        System.out.println(1);
    }
    public SubClass(){
        System.out.println(2);
    }
}

由以上代码分析类加载过程:
jvm首先加载App类进内存(由于存在main方法,jvm调用某个类的静态方法,那么这个类会被加载),然后按照声明的顺序给static成员分配内存空间.

private static App a = new App();
编译后实际情况是:
private static App a ;
static
{
   a = new App();  
   System.out.println(3);
}

而非static的字段初始化,是在构造器内部优先完成.也就是说:

private SubClass t = new SubClass();
编译后应该是:
private SubClass t;
public App()
{
    t = new SubClass();
    System.out.println(4);
}

程序执行static代码块时候,会先执行App类的空参构造器,然后会先创建SubClass实例对象(也可以理解成创建App类字节码对象需要依赖于SubClass字节码对象,如果找不到SubClass类,那么编译失败),此时,JVM需要加载SubClass类,发现extends关键字会优先加载SuperClass,并执行相应的static代码块,执行空参构造器创建SubClass实例对象,继续在App类中执行构造器,及static剩余代码.

程序输出:

1
Constructor SuperClass
2
4
3
main

以上分析,还望各位同仁不吝赐教.

相关文章

  • 面向对象

    实例化对象 使用 类名() 可以实例化一个对象,你可以使用给这个实例化的对象起一个名字,关于对象的初始化: 对象的...

  • 一个关于实例对象初始化的题

    由以上代码分析类加载过程:jvm首先加载App类进内存(由于存在main方法,jvm调用某个类的静态方法,那么这个...

  • Java 基础

    类和对象 对象:对象是类的一个实例,有状态和行为。 创建对象:声明,new 实例化,调用构造方法初始化对象。 类:...

  • [Objective-C]1、类,对象,方法

    1、类的独特存在就是一个实例(对象),对实例执行的操作称作方法。 2、实例初始化:1.初始化方式:alloc :方...

  • 初始化(Initialization)

    初始化概念: 类、结构体、枚举需要通过初始化对应的实例对象,来完成相应的功能。每一个实例初始化有相应的初始化方法。...

  • python 标准库学习笔记《四》

    魔术方法 __ new __ 创建实例对象 __ init __ 将传入的参数用于初始化实例对象 Notes:...

  • GreekBank极客班-Objective-c 初始化器和析构

    初始化器: 初始化器主要用于初始化对象实例或者类型,是一个特殊的函数。 对象初始化器:-(id)init可以重载多...

  • swift中的可失败初始化器+反初始化器

    可失败初始化器 可能返回nil 反初始化器 当类的实例对象被释放内存时,就会调用实例对象的deinit方法

  • 初始化器与析构器

    初始化器用于初始化对象实例或者类型,是一个特殊的函数对象初始化器:-(id) init 可以重载多个 返回值是id...

  • 初始化器

    初始化器用于初始化对象实例或类型 对象初始化器: -(id)init 可以重载多个 类型初始化器:+(void)i...

网友评论

      本文标题:一个关于实例对象初始化的题

      本文链接:https://www.haomeiwen.com/subject/przrcftx.html