一道题反映Java的类初始化过程

Java的类初始化过程:

1. 父类的static成员变量,static语句块。

2. 子类的static成员变量,static语句块。

3. 父类的普通成员变量,构造函数。

4. 子类的普通成员变量,构造函数。

注意:如果下面一句话没看懂,没关系,看下面的一个例子就明白了~

如果子类覆盖了父类的成员函数,该成员函数又在上面过程3中的构造函数中被调用,则此时调用的是子类的那个成员函数,如果成员函数中还含有子类中没有被初始化的普通成员变量,则若是int类型,默认初始化为0,若为对象类型,默认初始化为null.

Java实例如下:

abstract class Base {
    public int age = getNumber(100);
    static int sage = getNumber(50);
    static {
        System.out.println("base static block");
    }
    public Base() {
        System.out.println(age);
        System.out.println("base start");
        draw();
        System.out.println("base end");
    }
    static int getNumber(int base) {
        System.out.println("base.getNumber int" + base);
        return base;
    }
    public void draw() {
        System.out.println("base.draw");
    }
}

public class InitializeOrder extends Base {
    public int age = getNumber(1001);
    private int _radius = getNumber(10);
    static int sage = getNumber(250);
    static {
        System.out.println("subclass static block");
    }
    public InitializeOrder(int radius) {
        _radius = radius;
        System.out.println(age);
        System.out.println("initializeOrder initialized");
    }
    public void draw() {
        System.out.println("initializeOrder.draw" + _radius);
    }

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

输出结果:

base.getNumber int50
base static block
base.getNumber int250
subclass static block
base.getNumber int100
100
base start
initializeOrder.draw0
base end
base.getNumber int1001
base.getNumber int10
1001
initializeOrder initialized

尤其注意上面输出中的加红色的部分!

时间: 2024-10-27 05:17:46

一道题反映Java的类初始化过程的相关文章

java代码的初始化过程研究

刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻--)但是博主写的不够详细具体,我想在这详细谈一下java代码的具体初始化过程. 首先要清楚,初始化分为两个过程:类初始化.对象初始化. 类初始化是指类加载器将类加载到内存时,对类成员的初始化过程,也就是有static修饰的变量.对于加载完的类,它的类变量都会赋一个默认值,即使你定义时就赋值了.比如int类型就是0

Java中的初始化过程(转)

原文:http://www.cnblogs.com/mmbo/archive/2009/10/05/1578156.html 1.类成员自动初始化,基本类型总是最先初始化为0(boolean为false,(char)0),对象的引用初始化为null:2.类成员指定初始化,可以在类成员定义或构造器(包括其他方法)中给基本类型和非基本类型对象初始化,但这并不能阻止自动初始化首先进行:3.按类成员定义的顺序决定初始化的顺序:4.静态成员只有在第一次被访问时(class对象首次加载)才会被初始化,此后不

Java虚拟机 - 类初始化

[深入Java虚拟机]之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码.虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 遇到new.getstatic.putstatic.invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化.生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时.读取或设置一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期

Java常见问题之初始化过程

假设有个名为Dog的类 对于静态字段: 1. 当首次创建类型为Dog的对象时,或者Dog类的静态字段/静态方法首次被访问时,Java解释器会查找类路径,以定位Dog.class文件. 2. 载入Dog.class,此时初始化所有静态字段,如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null. 对于非静态字段: 1. 当创建类型为Dog的对象时,首先将在堆上为该对象分配存储空间,且存储空间会被清零,这就将所有基本类型字段都设置成了标准初值,而引用字

JAVA对象的初始化过程

出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1:   编译并运行该程序会有以下输出 Static Block Employee Company:china soft Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() 下面我们来对结果做分析: 1 在代码34行实例化对象时, 先对给

java之类的初始化过程

public class Hello{ static { System.out.println("静态块"); } { System.out.println("实例块"); } public Hello(){ System.out.println("构造方法"); } public static void main(String []args){ } } 运行后是这样的: 静态块 在main方法里面实例化一下,即代码是这样的: public cl

Java 类初始化过程

     1  class X {      2     Y b = new Y();      3     X() {      4           System.out.print("X");      5     }      6  }      7         8  class Y {      9     Y() {     10           System.out.print("Y");     11     }     12  }    

深入解析Java对象的初始化过程【看完这篇,你爸爸再也不用担心你不会实例Java 对象了】

这还是从一道Java 的面试题说起.不多说直接看这道面试题: public class Base{ private String baseName = "base"; //构造方法 public Base(){callName();} //对象方法 public void callName(){ System. out. println(baseName); } //静态内部类 static class Sub extends Base{ //静态内部类的字段 private Stri

Java中创建对象初始化过程的理解

以下面程序为例: 1.源码Cars.java通过编译生成Cars.class文件: 2.执行时分为两步: 第一步将Cars类的字节码加载到内存中, 第二步是new之后自动执行的.①将属性color和price初始化内存堆,并附上初始值null和0.0(声明,赋初值):②调用有两个参数的构造方法public Cars(String color,double price),把具体值"black"和60000赋值给形式参数color和price(即执行Cars("black&quo