概述

在java中,一个类能够包括的元素有变量,方法,代码块。这当中变量能够分为普通变量和静态变量,代码块也有静态代码块和普通代码块。在创建一个对象的时候,这个对象是怎么初始化的呢。这里我们就開始来解说一下,由于方法仅仅有在调用的时候才会用到。因此这里不将方法的初始化。而主要讲的是变量。代码块以及构造函数的初始化顺序

单个类的初始化

当一个类中包括静态变量。静态代码块,普通变量,普通代码块,以及构造函数时;(注意这里单个类是差别于有继承关系的类来说的,之后会讲到当有继承关系的时候类的初始化顺序)单个类的初始化顺序例如以下所看到的

静态变量。静态代码块 –>普通变量。普通代码块 –>构造函数

这当中静态变量与静态代码块的初始化顺序根据在代码中的先后顺序决定,普通变量与普通代码块相同根据在代码中的先后顺序决定。

代码例如以下。

当中为了方便演示变量的初始化,创建了4个类:ParentStaticFieldAParentStaticFieldBParentNormalFieldCParentNormalFieldD这4个类的作用是表示变量的初始化,其代码例如以下所看到的:

ParentStaticFieldA.java

  1. public class ParentStaticFieldA {
  2. public ParentStaticFieldA() {
  3. System.out.println("ParentStaticFieldA initial");
  4. }
  5. }

ParentStaticFieldB.java

  1. public class ParentStaticFieldB{
  2. public ParentStaticFieldB() {
  3. System.out.println("ParentStaticFieldB initial");
  4. }
  5. }

ParentNormalFieldC.java

  1. public class ParentNormalFieldC{
  2. public ParentNormalFieldC() {
  3. System.out.println("ParentNormalFieldC initial");
  4. }
  5. }

ParentNormalFieldD.java

  1. public class ParentNormalFieldD{
  2. public ParentNormalFieldD() {
  3. System.out.println("ParentNormalFieldD initial");
  4. }
  5. }

測试类ParentClass例如以下:

ParentClass.java

  1. public class ParentClass {
  2. static ParentStaticFieldA a=new ParentStaticFieldA();
  3. ParentNormalFieldC c=new ParentNormalFieldC();
  4. static{
  5. System.out.println("ParentClass static block initial");
  6. }
  7. {
  8. System.out.println("ParentClass normal block initial");
  9. }
  10. public ParentClass() {
  11. System.out.println("ParentClass constructor");
  12. }
  13. static ParentStaticFieldB b=new ParentStaticFieldB();
  14. ParentNormalFieldD d=new ParentNormalFieldD();
  15. public static void main(String[] args) {
  16. ParentClass pc=new ParentClass();
  17. }
  18. }

測试结果例如以下:



这里对測试类进行说明一下:

1.測试结果前3行说明了,静态代码块与静态变量之间是根据代码的先后顺序初始化的

2.測试结果第1~3行与4~6行以及第7行之间进行比較,说明了静态数据 –> 普通数据 –> 构造函数的初始化顺序

继承关系的类的初始化

当一个类继承某个父类,而父类与子类中相同拥有静态变量,静态代码块,普通变量,普通代码块。以及构造函数时,这样的初始化顺序是怎么样的呢?总的来说呢。有静态变量优先静态变量,之后是优先父类初始化,再是子类的初始化。也就是例如以下的顺序

父类静态变量,代码块 –>子类静态变量,代码块 –>父类普通变量。代码块 –>父类构造函数 –>子类普通变量。代码块–>子类构造函数。

这当中静态变量与静态代码块的初始化顺序根据在代码中的先后顺序决定,普通变量与普通代码块相同根据在代码中的先后顺序决定。

代码例如以下。当中为了方便演示变量的初始化。创建了4个类:ChildStaticFieldAChildStaticFieldBChildNormalFieldCChildNormalFieldD其代码例如以下所看到的:

ChildStaticFieldA.java

  1. public class ChildStaticFieldA {
  2. public ChildStaticFieldA() {
  3. System.out.println("ChildStaticFieldA initial");
  4. }
  5. }

ChildStaticFieldB.java

  1. public class ChildStaticFieldB{
  2. public ChildStaticFieldB() {
  3. System.out.println("ChildStaticFieldB initial");
  4. }
  5. }

ChildNormalFieldC.java

  1. public class ChildNormalFieldC{
  2. public ChildNormalFieldC() {
  3. System.out.println("ChildNormalFieldC initial");
  4. }
  5. }

ChildNormalFieldD.java

  1. public class ChildNormalFieldD{
  2. public ChildNormalFieldD() {
  3. System.out.println("ChildNormalFieldD initial");
  4. }
  5. }

測试类ChildClass继承上面的ParentClass代码例如以下:

  1. public class ChildClass extends ParentClass{
  2. static ChildStaticFieldA a=new ChildStaticFieldA();
  3. ChildNormalFieldC c=new ChildNormalFieldC();
  4. static{
  5. System.out.println("ChildClass static block initial");
  6. }
  7. {
  8. System.out.println("ChildClass normal block initial");
  9. }
  10. public ChildClass() {
  11. System.out.println("ChildClass constructor");
  12. }
  13. static ChildStaticFieldB b=new ChildStaticFieldB();
  14. ChildNormalFieldD d=new ChildNormalFieldD();
  15. public static void main(String[] args) {
  16. ChildClass pc=new ChildClass();
  17. }
  18. }

測试结果:



这里对測试类进行说明一下:

1.測试结果前1~3行与4~6说明了,最先初始化的各自是父类的静态数据。之后是子类的静态数据

2.測试结果第7~9行与10行,说明了在初始化父类的与子类的静态数据后。就是初始父类的其它数据,接下来在初始化子类的其它数据

java之类的初始化的更多相关文章

  1. Java继承的初始化

    /** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...

  2. JAVA字段的初始化规律

    JAVA字段的初始化规律 1.类的构造方法 (1)“构造方法”,也称为“构造函数”,当创建一个对象时,它的构造方法会被自动调用.构造方法与类名相同,没有返回值. (2)如果类没有定义构造函数,Java ...

  3. Java 类加载与初始化

    Java系列笔记(1) - Java 类加载与初始化 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理 ...

  4. java类的初始化

    转载:http://blog.csdn.net/moreevan/article/details/6968718 我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程.下面先对这三 ...

  5. [转]java static final 初始化

    http://tanbing1986411.blog.163.com/blog/static/7259798220103610224434/ java static final 初始化 1.stati ...

  6. 【转载】Java系列笔记(1) - Java 类加载与初始化

    Java系列笔记(1) - Java 类加载与初始化 原文地址:http://www.cnblogs.com/zhguang/p/3154584.html 目录 类加载器 动态加载 链接 初始化 示例 ...

  7. 图示Java类的初始化顺序

    Java类的初始化顺序   在开发中,知道Java类的初始化顺序才能让我们更加清楚地掌握程序的执行流程.先把结论贴出来,Java里,从图里的1~6,分别按顺序执行.   以下为代码验证阶段,一共三个类 ...

  8. 【软件构造】-<笔记>-浅谈java中类的初始化过程

    编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...

  9. java创建对象 的初始化顺序

    java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...

  10. Java类的初始化与实例对象的初始化

    Java对象初始化详解 2013/04/10 · 开发 · 1 评论· java 分享到:43 与<YII框架>不得不说的故事—扩展篇 sass进阶篇 Spring事务管理 Android ...

随机推荐

  1. Golang 处理 Json(一):编码

    JSON 是一种数据格式描述语言.以 key 和 value 构成的哈系结构,类似 Javascript 中的对象,python 中的字典.通常 json 格式的 key 是字符串,其值可以是任意类型 ...

  2. android编译错误“OnClickListener cannot be resolved to a type”

    在android代码编译时可能会出现如下错误: 部分代码: <span style="font-size:18px;">public void onCreate(Bun ...

  3. <c:otherwise>

    <c:if>没有<c:else>可以用<c:choose>来取代结构:<c:choose> <c:when test=""&g ...

  4. C++类静态数据成员与类静态成员函数

    from:://http://blog.csdn.net/taina2008/article/details/1684834 把类中的函数都定义成静态函数,这样相当于在编译时就分配了空间,这样不需要实 ...

  5. Tomcat服务器集群与负载均衡实现

    一.前言 在单一的服务器上执行WEB应用程序有一些重大的问题,当网站成功建成并开始接受大量请求时,单一服务器终究无法满足需要处理的负荷量,所以就有点显得有 点力不从心了.另外一个常见的问题是会产生单点 ...

  6. ios之网络异常与正常视图的切换

    1. xib中创建两个View 2. View的视图大概如下第一个:View View 第二个:View 3. 代码切换: [self.view addSubview:_redView];  // 会 ...

  7. [Web 前端] CSS篇之 4. position 和 display 的取值和各自的意思和用法

    讲一讲CSS的position/float/display都有哪些取值,它们相互叠加时的行为都是什么?  列出display的值,说明他们的作用.position的值, relative和absolu ...

  8. .NET零基础入门之01:开篇及CSharp程序、解决方案的结构

    一:为什么选择C# 每个人都有梦想,有些人的梦想就是:成为程序员.最课程(www.zuikc.com)的<零基础c#入门>是试图帮助我们实现这个梦想. 也许你要问:我基础很差怎么办?最课程 ...

  9. 使用samba进行共享文件操作步骤

    使用samba进行共享文件操作步骤 1.验证方式 设置用户访问samba server的验证方式,一共有四种验证方式. a. share:用户访问samba server不需要提供用户名和密码,安全性 ...

  10. Django model 中设置联合约束和联合索引

    来自:https://blog.csdn.net/ding_312/article/details/81264910 class Cart(models.Model): user = models.F ...