Java常见问题之初始化过程

假设有个名为Dog的类

对于静态字段:

1. 当首次创建类型为Dog的对象时,或者Dog类的静态字段/静态方法首次被访问时,Java解释器会查找类路径,以定位Dog.class文件。

2. 载入Dog.class,此时初始化所有静态字段,如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null。

对于非静态字段:

1. 当创建类型为Dog的对象时,首先将在堆上为该对象分配存储空间,且存储空间会被清零,这就将所有基本类型字段都设置成了标准初值,而引用字段被设置成了null。

2. 执行所有出现于字段定义处的初始化动作。

3. 执行构造器。

假设类Dog有一个父类Animal

对于静态字段:

1. 当首次创建类型为Dog的对象时,或者Dog类的静态字段/静态方法首次被访问时,Java解释器会查找类路径,以定位Dog.class文件。

2. 当载入Dog.class时,编译器注意到它有一个父类Animal,于是继续加载Animal.class,此时首先初始化类Animal的所有静态字段,然后初始化类Dog的所有静态字段。如果没有对静态字段进行显示初始化,则默认将所有基本类型字段都设置成标准初值,而引用字段被设置成null。

对于非静态字段:

1. 当创建类型为Dog的对象时,首先将在堆上为该对象分配存储空间,且存储空间会被清零,这就将所有基本类型字段都设置成了标准初值,而引用字段被设置成了null。

2. 执行父类Animal中所有出现于字段定义处的初始化动作。

3. 执行父类Animal的构造器。

4. 执行子类Dog中所有出现于字段定义处的初始化动作。

5. 执行子类Dog的构造器。

注意:

静态字段只会进行一次初始化操作。

每次创建类型为Dog的对象时,都会对非静态字段进行初始化操作。

静态字段由Dog类的所有对象共享,只占用一份存储区域。

非静态字段是与Dog类的对象相关联的,每个对象都有自己独立的存储区域。

当首次创建类型为Dog的对象时,会先初始化静态字段,再初始化非静态字段。

Dog类的静态字段/静态方法首次被访问时,只会初始化静态字段,不会初始化非静态字段。

Java常见问题之初始化过程,码迷,mamicode.com

时间: 2025-01-02 14:19:03

Java常见问题之初始化过程的相关文章

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的类初始化过程: 1. 父类的static成员变量,static语句块. 2. 子类的static成员变量,static语句块. 3. 父类的普通成员变量,构造函数. 4. 子类的普通成员变量,构造函数. 注意:如果下面一句话没看懂,没关系,看下面的一个例子就明白了~ 如果子类覆盖了父类的成员函数,该成员函数又在上面过程3中的构造函数中被调用,则此时调用的是子类的那个成员函数,如果成员函数中还含有子类中没有被初始化的普通成员变量,则若是int类型,默认初始化为0,若为对象类型,默认初始化

java代码的初始化过程研究

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

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对象的初始化过程【看完这篇,你爸爸再也不用担心你不会实例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

Java类的初始化过程及清理

一.类的数据成员初始化 Java中类的数据成员初试化可能有两种形式. 在定义类成员变量的地方直接提供初始化值(这是C++中不允许的) 在构造器中初试化.(Java中不存在类似C++中的初始化列表) 两者的区别是,第一种方式是数据成员直接初试化为提供的初始化值,而在构造器中初始化,其实在数据成员已经初试化为默认值(比如基本类型如int 初始化为0,引用类型初试为null,其实在在构造器已经不能称为初始化了,应该是赋值) 初始化顺序 如果有静态变量则先初始化静态变量,如果基类中也有静态变量且之前没有

java对象的初始化过程和创建对象的几种方式

1.加载父类,加载父类的静态属性和静态代码块 2.加载子类,加载子类的静态属性和静态代码块 3.初始化父类中的非静态属性并赋初值,执行父类非静态代码块,执行父类构造. 4.初始化子类中的非静态属性并赋初值,执行代码块,执行构造 总之一句话,静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法. 静态属性和静态代码块的加载顺序:就是他们的编译顺序. 对象实例化的几种方式: 1.new对象: 2.通过工厂方法返回对象,如:String str =