java之类的初始化
概述
在java中,一个类能够包括的元素有变量,方法,代码块。这当中变量能够分为普通变量和静态变量,代码块也有静态代码块和普通代码块。在创建一个对象的时候,这个对象是怎么初始化的呢。这里我们就開始来解说一下,由于方法仅仅有在调用的时候才会用到。因此这里不将方法的初始化。而主要讲的是变量。代码块以及构造函数的初始化顺序
单个类的初始化
当一个类中包括静态变量。静态代码块,普通变量,普通代码块,以及构造函数时;(注意这里单个类是差别于有继承关系的类来说的,之后会讲到当有继承关系的时候类的初始化顺序)单个类的初始化顺序例如以下所看到的
静态变量。静态代码块 –>普通变量。普通代码块 –>构造函数
这当中静态变量与静态代码块的初始化顺序根据在代码中的先后顺序决定,普通变量与普通代码块相同根据在代码中的先后顺序决定。
代码例如以下。
当中为了方便演示变量的初始化,创建了4个类:ParentStaticFieldA
,ParentStaticFieldB
,ParentNormalFieldC
。ParentNormalFieldD
这4个类的作用是表示变量的初始化,其代码例如以下所看到的:
ParentStaticFieldA.java
public class ParentStaticFieldA {
public ParentStaticFieldA() {
System.out.println("ParentStaticFieldA initial");
}
}
ParentStaticFieldB.java
public class ParentStaticFieldB{
public ParentStaticFieldB() {
System.out.println("ParentStaticFieldB initial");
}
}
ParentNormalFieldC.java
public class ParentNormalFieldC{
public ParentNormalFieldC() {
System.out.println("ParentNormalFieldC initial");
}
}
ParentNormalFieldD.java
public class ParentNormalFieldD{
public ParentNormalFieldD() {
System.out.println("ParentNormalFieldD initial");
}
}
測试类ParentClass
例如以下:
ParentClass.java
public class ParentClass {
static ParentStaticFieldA a=new ParentStaticFieldA();
ParentNormalFieldC c=new ParentNormalFieldC();
static{
System.out.println("ParentClass static block initial");
}
{
System.out.println("ParentClass normal block initial");
}
public ParentClass() {
System.out.println("ParentClass constructor");
}
static ParentStaticFieldB b=new ParentStaticFieldB();
ParentNormalFieldD d=new ParentNormalFieldD();
public static void main(String[] args) {
ParentClass pc=new ParentClass();
}
}
測试结果例如以下:
这里对測试类进行说明一下:
1.測试结果前3行说明了,静态代码块与静态变量之间是根据代码的先后顺序初始化的
2.測试结果第1~3行与4~6行以及第7行之间进行比較,说明了静态数据 –> 普通数据 –> 构造函数的初始化顺序
继承关系的类的初始化
当一个类继承某个父类,而父类与子类中相同拥有静态变量,静态代码块,普通变量,普通代码块。以及构造函数时,这样的初始化顺序是怎么样的呢?总的来说呢。有静态变量优先静态变量,之后是优先父类初始化,再是子类的初始化。也就是例如以下的顺序
父类静态变量,代码块 –>子类静态变量,代码块 –>父类普通变量。代码块 –>父类构造函数 –>子类普通变量。代码块–>子类构造函数。
这当中静态变量与静态代码块的初始化顺序根据在代码中的先后顺序决定,普通变量与普通代码块相同根据在代码中的先后顺序决定。
代码例如以下。当中为了方便演示变量的初始化。创建了4个类:ChildStaticFieldA
。ChildStaticFieldB
。ChildNormalFieldC
。ChildNormalFieldD
其代码例如以下所看到的:
ChildStaticFieldA.java
public class ChildStaticFieldA {
public ChildStaticFieldA() {
System.out.println("ChildStaticFieldA initial");
}
}
ChildStaticFieldB.java
public class ChildStaticFieldB{
public ChildStaticFieldB() {
System.out.println("ChildStaticFieldB initial");
}
}
ChildNormalFieldC.java
public class ChildNormalFieldC{
public ChildNormalFieldC() {
System.out.println("ChildNormalFieldC initial");
}
}
ChildNormalFieldD.java
public class ChildNormalFieldD{
public ChildNormalFieldD() {
System.out.println("ChildNormalFieldD initial");
}
}
測试类ChildClass
继承上面的ParentClass
代码例如以下:
public class ChildClass extends ParentClass{
static ChildStaticFieldA a=new ChildStaticFieldA();
ChildNormalFieldC c=new ChildNormalFieldC();
static{
System.out.println("ChildClass static block initial");
}
{
System.out.println("ChildClass normal block initial");
}
public ChildClass() {
System.out.println("ChildClass constructor");
}
static ChildStaticFieldB b=new ChildStaticFieldB();
ChildNormalFieldD d=new ChildNormalFieldD();
public static void main(String[] args) {
ChildClass pc=new ChildClass();
}
}
測试结果:
这里对測试类进行说明一下:
1.測试结果前1~3行与4~6说明了,最先初始化的各自是父类的静态数据。之后是子类的静态数据
2.測试结果第7~9行与10行,说明了在初始化父类的与子类的静态数据后。就是初始父类的其它数据,接下来在初始化子类的其它数据
java之类的初始化的更多相关文章
- Java继承的初始化
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- JAVA字段的初始化规律
JAVA字段的初始化规律 1.类的构造方法 (1)“构造方法”,也称为“构造函数”,当创建一个对象时,它的构造方法会被自动调用.构造方法与类名相同,没有返回值. (2)如果类没有定义构造函数,Java ...
- Java 类加载与初始化
Java系列笔记(1) - Java 类加载与初始化 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理 ...
- java类的初始化
转载:http://blog.csdn.net/moreevan/article/details/6968718 我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程.下面先对这三 ...
- [转]java static final 初始化
http://tanbing1986411.blog.163.com/blog/static/7259798220103610224434/ java static final 初始化 1.stati ...
- 【转载】Java系列笔记(1) - Java 类加载与初始化
Java系列笔记(1) - Java 类加载与初始化 原文地址:http://www.cnblogs.com/zhguang/p/3154584.html 目录 类加载器 动态加载 链接 初始化 示例 ...
- 图示Java类的初始化顺序
Java类的初始化顺序 在开发中,知道Java类的初始化顺序才能让我们更加清楚地掌握程序的执行流程.先把结论贴出来,Java里,从图里的1~6,分别按顺序执行. 以下为代码验证阶段,一共三个类 ...
- 【软件构造】-<笔记>-浅谈java中类的初始化过程
编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...
- java创建对象 的初始化顺序
java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...
- Java类的初始化与实例对象的初始化
Java对象初始化详解 2013/04/10 · 开发 · 1 评论· java 分享到:43 与<YII框架>不得不说的故事—扩展篇 sass进阶篇 Spring事务管理 Android ...
随机推荐
- rabbitmq的发布确认和事务 - 2207872494的个人空间
rabbitmq的发布确认和事务 - 2207872494的个人空间 https://my.oschina.net/lzhaoqiang/blog/670749
- 一种高效的序列化方式——MessagePack
最近在弄一些数据分析方面的内容,发现很多时候数据瓶颈在模块之间的数据序列化和反序列化上了,原来项目中用的是Json,找了一圈发现Json.net在Json序列化库中已经是性能的佼佼者了,便准备从序列化 ...
- MongoDB中的变更通知
MongoDb 3.6中引入了一个新特性change stream,简单的来说就是变更通知,它提供了一个接口允许应用实时获取数据库变更,这个在ETL.数据同步.数据迁移.消息通知等方面非常有用. 使用 ...
- 微信公众号 JSSDK 提示:invalid signature
要命的invalid signature.其实腾讯的文档已经写了,只能怪我自己理解能力太差,掉了好几次坑. 签名要用到的jsapi_ticket需要保存的,2小时有效期.如果在2小时内出现问题需要删除 ...
- 基于Linux的智能家居的设计(3)
2 硬件设计 本课题的硬件设计包含主控制器.传输数据设计.数据採集设计.控制驱动设计.显示设计.门禁设计. 2.1 主控制器 依据方案三选择S3C6410主控芯片,S3C6410是由Samsung ...
- ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现
在电商产品模块中必经的一个环节是:当选择某一个产品类别,动态生成该类别下的所有属性和属性项,这些属性项有些是以DropDownList的形式存在,有些是以CheckBoxList的形式存在.接着,把C ...
- 使用RemObjects Pascal Script
摘自RemObjects Wiki 本文提供RemObjects Pascal Script的整体概要并演示如何创建一些简单的脚本. Pascal Script包括两个不同部分: 编译器 (uPSCo ...
- Objective-C中的一些特殊的数据类及NSLog的输出格式
NSLog的格式如下所示: %@ 对象 %d, %i 整数 %u 无符整形 %f 浮点/双字 %x, %X 二进制整数 %o 八进制整数 %zu size_t % ...
- 使用集成SOA网关的PL / SQL中的REST
使用集成SOA网关的PL / SQL中的REST Oracle电子商务套件集成SOA网关(ISG)是一款开箱即用的模块,支持在Oracle Integration Repository中发布支持的接口 ...
- Android中的Audio播放:竞争Audio之Audio Focus的应用
from://http://blog.csdn.net/thl789/article/details/7422931 Android是多任务系统,Audio系统是竞争资源.Android2.2之前,没 ...