`
mjj192837
  • 浏览: 24595 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java的初始化与构造器

阅读更多
当Java创建一个对象时,系统先为该对象的所有实例属性分配内存(前提是该类已经被加载过了),接着程序开始对这些实例属性执行初始化,其初始化顺序是:先执行初始化块或声明属性时制定的初始值,再执行构造器里制定的初始值。

从某种程度上来看,初始化是一段固定执行的代码,它不能接受任何参数。因此初始化块对同一个类所有对象所进行的初始化处理完全相同。基于这个原因,不难发现初始化块的基本用法,如果有一段初始化处理代码对所有对象完全相同,且无须接受任何参数,就可以把这段初始化处理代码提取到初始化块中。

与构造器类似的,创建一个Java对象时,不仅会执行该类的普通初始化块和构造器,系统会一直上溯到java.lang.object类,依次向下执行其父类的初始化块。

当JVM第一个主动使用某个类时,系统会再类准备阶段为该类的所有静态属性分配内存;在初始化阶段则负责初始化这些静态属性,初始化静态属性的就是执行类初始化代码或者声明类属性时指定的初始值,他们的执行顺序与源代码中的排列顺序相同。

class Root
{
   Static
   {
     System.out.printIn("Root的静态初始化块");
   }
   {
     System.out.printIn("Root的普通初始化块");
   }
   public Root
   {
     System.out.printIn("Root的无参数构造器");
   }
}
class Mid extends Root
{
   static
   {
     System.out.printIn("Mid 的静态初始化块");
   }
   {
     System.out.printIn("Mid 的普通初始化块");
   }
   public Mid()
   {
     System.out.printIn("Mid 的无参数的构造器");
   }
   public Mid(String msg)
   {
     //通过this调用同一类中重载的构造器
     this();
     System.out.printIn("Mid 的带参数的构造器,其参数值:"+msg);
   }
}

class Leaf extends Mid
{
   static
   {
     System.out.printIn("Leaf 的静态初始化块")
   }
   {
     System.out.printIn("Leaf 的普通初始化块");
   }
   public Leaf()
   {
     //通过super调用父类中有一个字符串参数的构造器
     super("权威指南")
     System.out.printIn("执行Leaf的构造器");
   }
}

public class Test
{
   public static void main(String[] args)
   {
    new Leaf();
    new Leaf();
   }
}

执行结果:

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块

Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:权威指南
Leaf的普通初始化块
执行Leaf的构造器

Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:权威指南
Leaf的普通初始化块
执行Leaf的构造器

创建了两次Leaf对象。第一次创建一个Leaf对象时,因为系统还不存在Leaf类,因此需要先加载并初始化Leaf类,一旦Leaf类初始化成功后,Leaf类在该虚拟机里巷一直存在,因此当第二次创建Leaf实例时无须再次对Leaf类进行初始化。


分享到:
评论

相关推荐

    java 构造器的调用

    java 构造器初始化成员变量 是否提供默认构造器 继承中构造器的调用

    深入理解java构造器机理

    java构造方法是java类中最重要的一个概念,这篇文档涵盖了,java对象初始化过程中构造器调用的顺序,及作用。

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    java面试题-类的初始化顺序.doc

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

    实例解析Java中的构造器初始化

    主要通过实例解析Java中的构造器初始化,代码很简单,叙述很明确,需要的朋友可以了解下。

    【Java语言基础】初始化块

    当多个构造器中有重复的语句,可以将这些重复的语句往上提取到初始化块中,提高代码的重用性 语法格式: class 类名1{ [修饰符]{ //初始化块的可执行代码 } } 注意:修饰符只能是static! 一个类种可以有多个

    JAVA经典继承与父类调用 geter、seter访问器 构造器

    代码中设计了各个类的基类,设置私有成员变量,利用构造器对成员变量初始化,用geter、seter访问器设置、获取成员变量的值。继承基类并创建对象,在子类中调用父类方法。

    Java初始化对象的工具 – 构造器

    本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术...

    java类中元素初始化顺序详解

    对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器

    java基础补足和thinking In Java学习.rar

    5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造方法或者无参构造器。在没有其他构造方法的时候可以省略不写 需要注意的是...

    JAVA面试题解惑系列

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

    Thinking in java4(中文高清版)-java的'圣经'

    5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 ...

    Scala进阶_构造器

    类的构造器 当创建类对象的时候,会自动调用类的构造器。之前使用的都是默认构造器,我们接下来要学习如何自定义构造器。 主构造器 我们学习过,Java的构造... // 初始化成员变量 this.name = name; this.age = age;

    Java编程思想?初始化与清理

    学习内容:  1.初始化  2.清理  1.初始化  虽然自己的Java基础还是比较良好的.....首先是需要一个默认的构造器,然后其他的构造器需要通过在重载构造器的方式来构造不同的构造器(针对不同的参

    php 静态变量的初始化

    } } 但是php中并没有一个类似java中的静态构造器/静态块的东西,就没有合适的时机对其进行初始化了。 对于共有的成员还有办法解决,例如: class A { static public $child; } A::$child = new B()

    java源码包---java 源码 大量 实例

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Java基础教程之构造器与方法重载

    主要介绍了Java基础教程之构造器与方法重载,构造器可以初始化数据成员,还可以规定特定的操作,本文还对方法重载做了介绍,需要的朋友可以参考下

    类初始化和实例初始化1

    实例初始化过程:实例初始化就是执行()方法:()方法可能重载有多个,有几个构造器就有几个方法()方法由非静态实例

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    构造器初始化 15 初始化顺序 16 this 和 super 16 访问控制权限 16 继承 17 多态 17 代理 17 Static 17 Final 17 接⼝和抽象类 18 接⼝ 18 抽象类 18 异常 18 认识 Exception 18 什么是 Throwable 18 常⻅的 ...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics