- 浏览: 169569 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
静夜独窗:
有体会才真正明白
java break -
流浪若相惜:
你说的是在html文件吧?
如何在jsp文件中引入css和js文件 -
copyday:
really girl ??
showModalDialog用法 -
发呆的驴:
...
js中的push和join方法 -
itway:
thanks
JSP向后台传递参数的四种方式
java中类/对象的初始化顺序以及静态代码块的使用
- 博客分类:
- JAVA
一、对象的初始化顺序:
(1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的)
1.为父类的静态属性分配空间并赋于初值
1.执行父类静态初始化块;
(2)加载子类
2.为子类的静态属性分配空间并赋于初值
2.执行子类的静态的内容;
(3)加载父类构造器
3.初始化父类的非静态属性并赋于初值
3.执行父类的非静态代码块;
4.执行父类的构造方法;
(4)加载子类构造器
5.初始化子类的非静态属性并赋于初值
5.执行子类的非静态代码块;
6.执行子类的构造方法.
总之一句话,静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
二、静态变量和静态代码块的初始化顺序:
谁在前面先初始化谁(这个也比较容易理解,初始化的时候,不可能跳着去初始化吧,比如说静态代码块在静态变量的前面,不可能先跳过静态代码块的初始化先去执行静态变量的初始化吧。)
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用
父类带参数的构造方法,否则编译不能通过,并且此语句必须置于子类构造方法的首句。
三、类装载步骤
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
对象的初始化顺序测试代码:
运行结果:
parent static block
child static block
parent block
parent constructor
child block
child constructor
静态变量和静态代码块的初始化顺序测试代码:
运行结果:
Test--A
静态初始化块
Test--B
再加一个经典的测试代码
运行结果:
static block first,because it's begin of the static variable
static insect x1 initialized
static wps x2 initialized
initialized constructor
=============================================
insect initialized
i= 9 j=0
the member k in wps be initialized
wps initialized
k=63
j=39
测试代码:
运行结果:
wawo
把注释解除的运行结果如下:
wawo
liminsss 按照从上到下的顺序,先初始化非静态属性,然后是非静态块,然后是构造方法
haha
(1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的)
1.为父类的静态属性分配空间并赋于初值
1.执行父类静态初始化块;
(2)加载子类
2.为子类的静态属性分配空间并赋于初值
2.执行子类的静态的内容;
(3)加载父类构造器
3.初始化父类的非静态属性并赋于初值
3.执行父类的非静态代码块;
4.执行父类的构造方法;
(4)加载子类构造器
5.初始化子类的非静态属性并赋于初值
5.执行子类的非静态代码块;
6.执行子类的构造方法.
总之一句话,静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
二、静态变量和静态代码块的初始化顺序:
谁在前面先初始化谁(这个也比较容易理解,初始化的时候,不可能跳着去初始化吧,比如说静态代码块在静态变量的前面,不可能先跳过静态代码块的初始化先去执行静态变量的初始化吧。)
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用
父类带参数的构造方法,否则编译不能通过,并且此语句必须置于子类构造方法的首句。
三、类装载步骤
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
对象的初始化顺序测试代码:
class Parent { static String name = "hello"; { System.out.println("parent block"); } static { System.out.println("parent static block"); } public Parent() { System.out.println("parent constructor"); } } class Child extends Parent { static String childName = "hello"; { System.out.println("child block"); } static { System.out.println("child static block"); } public Child() { System.out.println("child constructor"); } } public class StaticIniBlockOrderTest { public static void main(String[] args) { new Child();// 语句(*) } }
运行结果:
parent static block
child static block
parent block
parent constructor
child block
child constructor
静态变量和静态代码块的初始化顺序测试代码:
TestOrder public class TestOrder { //静态变量 public static TestA a = new TestA(); //静态初始化块 static { System.out.println("静态初始化块"); } //静态变量 public static TestB b = new TestB(); public static void main(String[] args) { new TestOrder(); } } class TestA { public TestA() { System.out.println("Test--A"); } } class TestB { public TestB() { System.out.println("Test--B"); } }
运行结果:
Test--A
静态初始化块
Test--B
再加一个经典的测试代码
class insect{ int i=9; int j; static { prt("static block first,because it's begin of the static variable"); } insect(){ System.out.println("insect initialized"); prt("i= "+i+" j="+j); j=39; } static int x1=prt("static insect x1 initialized"); static int prt(String s){ System.out.println(s); return 47; } } public class Wps extends insect{ Wps(){ System.out.println("wps initialized"); prt("k="+k); prt("j="+j); } int k=prt("the member k in wps be initialized"); static int x2=prt("static wps x2 initialized"); static int prt(String s){ System.out.println(s); return 63; } public static void main(String[] args){ //程序的入口,开始加载父类,然后开始加载子类,然后是父类构造方法,然后是子类构造方法 insect.prt("initialized constructor"); System.out.println("========================="); Wps w=new Wps(); } }
运行结果:
static block first,because it's begin of the static variable
static insect x1 initialized
static wps x2 initialized
initialized constructor
=============================================
insect initialized
i= 9 j=0
the member k in wps be initialized
wps initialized
k=63
j=39
测试代码:
public class Limin { Limin1 lm = new Limin1(); static { System.out.println("wawo"); } { System.out.println("haha"); } public static void main(String[] args) { //Limin l =new Limin(); 此行注释掉,代表并没有调用默认不带参数的构造方法,当运行的时候只是加载了父类和子类,并没有加载父类和子类的构造器 } } public class Limin1 { Limin1(){ System.out.println("liminsss"); } }
运行结果:
wawo
把注释解除的运行结果如下:
wawo
liminsss 按照从上到下的顺序,先初始化非静态属性,然后是非静态块,然后是构造方法
haha
发表评论
-
数组的创建方式
2013-07-20 22:28 682数组的声明: 类型标识符 数组名[ ] 或者 类型标识符[] ... -
多线程
2013-02-20 18:30 827线程: 是一个程序内部的顺序控制流(一个程序里面,不同的执行路 ... -
序列化 关键字transient
2013-02-20 11:12 821在java的类中,进行序列化时,如果某个成员变量被transi ... -
java容器
2013-02-01 16:26 767import java.util.*; public cla ... -
java.lang.Enum
2013-02-01 11:45 889枚举类型在java中是作为一个类封装起来的 枚举类型: 只能 ... -
java异常处理
2013-01-30 13:09 759java程序的执行过程中如 ... -
接口特性
2013-01-29 17:16 684接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而 ... -
final关键字
2013-01-29 15:35 636final 的变量的值不能够被改变 (final的成员变量,f ... -
抽象类
2013-01-29 15:12 6301.用abstract关键字来修饰一个类时,这个类叫做抽象类, ... -
动态绑定
2013-01-29 14:29 713动态绑定/多态: 动态绑定是指在执行期间(而非编译期间)判断 ... -
对象转型
2013-01-29 11:38 688一个基类的引用类型变量可以“指向”其子类的对象 一个基类的引 ... -
方法的重写
2013-01-28 13:42 613在子类中可以根据需要对从基类中继承来的方法进行重写 重写方法必 ... -
java.lang
2013-01-25 16:41 611jdk 自动封装的包中 只有java.lang 这个包不需要引 ... -
java中重载
2013-01-25 14:18 734方法重载: 是指一个类中可以定义有相同的方法的名字,但是参数不 ... -
java 构造方法
2013-01-25 10:47 685当没有指定构造函数时,编译器为类自动添加形如 类名() {} ... -
内存分析
2013-01-25 10:27 667同一个类的每个对象有不同的成员变量存储空间 同一个类的每个对象 ... -
成员变量 和局部变量
2013-01-25 09:55 720成员变量 不赋予初值可以使用 默认会有初值 局部变量 必须赋 ... -
类和类之间的关系
2013-01-24 17:41 1417类和类之间的关系 1.泛化(继承)表示为 is-a 关系 表 ... -
java switch
2013-01-24 10:46 464多个case可以合并到一起,代笔或者的意思 java中Swit ... -
java break
2013-01-24 10:32 692breank 只能跳出一层循环
相关推荐
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
静态代码块(static block ),不包含在任何方法体中当类被载入时,自动执行静态代码块,且只被执行一次经常用于类属性的初始化。 这是网上通行的关于静态代码块的定义。 在Java中,类装载器把一个类装入Java虚拟机...
了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识。不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println...
静态变量显式赋值代码以及静态代码块的执行顺序,由它们的先后顺序执行,先声明的先执行 ()方法只会执行一次 如以下代码: //静态变量显式赋值代码 private static int j=method(); //静态代码块 static { System....
errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...
主要介绍了简单了解java中静态初始化块的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 5.10 本章小结 165 本章练习 165 第6章 面向对象(下) 166 6.1 基本数据类型的包装类 167 6.2 处理对象 170 6.2.1 打印对象和...
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1(); Inc inc=tt.new Inc(); ...
类加载,同时初始化类中静态的属性(赋默认值) 2.执行静态代码块 3.分配内存空间,同时初始化非静态的属性(赋默认值) 4.调用父类构造器(注意调用父类构造器之前已经给父类的非静态的属性显示赋值,如果有显示赋值的话...
1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...
静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...
1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...
包含通用对象类的库叫作类库。 2.2.7 多态型 面向对象程序的最后一个概念是多态性。凭借多态性,你可以创建一个新的对象,它具 有与基对象相同的功能,但是这些功能中的一个或多个是通过不同的方式完成...
对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以...
15.4.3 匿名内部类的初始化 337 15.4.4 匿名内部类作用的体现 337 15.5 理解内部类 339 15.6 内部接口 340 15.6.1 定义在类中的内部接口 340 15.6.2 定义在接口中的内部接口 341 15.7 小结 342 第16...
3.10.2数组初始化器以及匿名数组 3.10.3数组拷贝 3.10.4命令行参数 3.10.5数组排序 3.10.6多维数组 3.10.7不规则数组 第4章对象与类 4.1面向对象程序设计概述 4.1.1 OOP词汇表 4.1.2对象 ...
在这一章的最后,我们将更贴近地观察初始化过程:自动成员初始化、指定成员初始化、初始化的顺序、static(静态)初始化以及数组初始化等等。 <br>(5) 第5章:隐藏实现过程 本章要探讨将代码封装到一起的方式...