java类的初始化和对象的创建顺序

学习java编程思想--类的初始化p146

 类的加载顺序* 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类* 2类初始化先初始化static成员变量和static--->* 2先初始化父类的static成员变量和static* 3再初始化本类的static成员变量和static

* 类加载之后,对象创建开始* 1先加载父类的非静态成员变量(静态成员变量在类初始化的时候已经加载,非静态成员变量要随对象的创建而初始化)* 2先加载父类的构造函数* 3再加载本类的非静态成员变量* 4再加载本类的构造函数*

 总体:* -->表示顺序* 父类-->子类* 静态-->非静态* 类-->对象* static随类的加载而加载* 非static成员变量随对象的创建而加载* 成员变量先于构造器加载
 1 package com.test.java.classs;
 2
 3 /**
 4  * Created by Administrator on 2015/12/8.
 5  * 类的加载顺序
 6  * 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类
 7  * 2类初始化先初始化static成员变量和static--->
 8  * 2先初始化父类的static成员变量和static
 9  * 3再初始化本类的static成员变量和static
10  * 类加载之后,对象创建开始加载
11  * 1先加载父类的非静态成员变量(静态成员变量在类初始化的时候已经加载,非静态成员变量要随对象的创建而初始化)
12  * 2先加载父类的构造函数
13  * 3再加载本类的非静态成员变量
14  * 4再加载本类的构造函数
15  *
16  * 总体:
17  * -->表示顺序
18  * 父类-->子类
19  * 静态-->非静态
20  * 类-->对象
21  * static随类的加载而加载
22  * 非static成员变量随对象的创建而加载
23  * 成员变量先于构造器加载
24  *
25  */
26 public class ClassLoadOrder extends Father{
27     //2父类的static成员变量加载完之后 开始加载子类的static域
28     private static int k = printInt("child static k initialized");
29     //5 子类的非静态成员变量初始化
30     private int m = printInt("child 非static 变量加载");
31
32     //子类的构造器加载
33     public ClassLoadOrder() {
34         System.out.println("child constructor initialized");
35         System.out.println("k="+k);
36         System.out.println("j="+j);
37     }
38
39     static {
40         System.out.println("child static initialized");
41     }
42     static int printInt2(){
43         System.out.println("child static function initialized");
44         return 50;
45     }
46
47     public static void main(String[] args) {
48         ClassLoadOrder c = new ClassLoadOrder();
49     }
50 }
51
52 class Father{
53     private int i=9;
54     protected int j;
55     //4 父类构造器加载
56     Father(){
57         System.out.println("father constructor initialized");
58         System.out.println("i="+i+",j="+j);
59         j=39;
60     }
61     //3 对象创建时,先初始化父类的非静态成员变量
62     int n = printInt("father 非static变量加载");
63     //1先加载父类的static域
64     static {
65         System.out.println("father static initialized");
66     }
67     //1
68     private static int x1 = printInt("father static .x1 initialized");
69     static int printInt(String s ){
70         System.out.println(s);
71         return 47;
72     }
73 }

结果:

father static initialized
father static .x1 initialized
child static k initialized
child static initialized
father 非static变量加载
father constructor initialized
i=9,j=0
child 非static 变量加载
child constructor initialized
k=47
j=39

时间: 2024-10-06 08:53:25

java类的初始化和对象的创建顺序的相关文章

java中类的初始化和对象的初始化

静态的属于全局静态区,这个部分独立存在,不管是成员还是块,都是静态的,大家地位相等,先到先得. 然后是成员初始化,这个部分在类的构造函数前初始化,因为编译器(或者设计者)可能认为构造函数调用了这个成员变量,所以在其前初始化了.或者说是成员自己有自己的能力来初始化自己,不用构造函数来管,这部分属于能力比较强的,虽然没有静态的地位高,但是,还是能自给自足的一部分团体. 最后才构造函数,这个时候就开始动工来建立这个类的实例了.这个步骤相当于建大楼,终于开始建立了,前面的准备工作已经准备完了,下面就开始

类的定义和对象的创建

类的定义和对象的创建 在Java中,一切都是对象.写Java程序就是定义类的过程.类是一个模板,它规定了一种数据结构的原型. 类中包含两部分:变量和方法. 类中定义的变量称为数据成员或成员变量. 类中定义的方法称为成员方法或成员函数. 定义了类之后,还不能对他进行任何操作,必须让这个模板具体化才可以.让模板具体化的过程就是实例的创建过程.根据类这个模板,可以创建一个个具体的实例,这些实例称为对象.实例化过程包括为其分配必要的内存空间.设置相应的初始值等.每个对象中,针对类定义的数据成员都允许有自

java类的初始化和构造函数

本人小白一枚,看java类的初始化的时候好晕的说,我觉着书上虽然说的对,但总觉得有些信息没说出来,没说清楚,看了好多文章博客的,现在有些感悟,来小写下总结,也算是为以后再次复习种个好果子. 先摘一下书上写的: 加载:将类的class文件读入内存,并为之创建一个java.lang.class对象. 连接:把类的二进制数据合并到JRE中,检查被加载的类是否有正确的内部结构,并和其他类协调一致.为类的静态FIELD分配内存,设置默认值,将类的二进制数据中的符号引用替换成直接引用. 初始化:主要对静态F

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

Java类的初始化

Java提供了两种不同的初始化类型,分别是类的初始化和对象的初始化.类成员都是静态的,默认会设置一个值.对象的初始化会在构造函数里面进行.但如果想要赋给静态变量非默认值,或者是初始化一类共有的对象属性(不论调用哪个构造函数),那么就需要一些特殊的方法.提供了静态初始化块和非静态初始化块来处理这两种情况. 静态初始化块 静态初始化块是通过static{}来定义的.一个简单的代码示例如下: public class CorderStatic { staticint idx; static{ Syst

java类内容初始化顺序

在java类中一般有:成员变量.静态变量.成员方法.静态方法.构造方法.那么这几个的初始化顺序是什么呢? 初始化的先后顺序是:静态变量(类load进内存就初始化)------静态代码块(类load进内存就初始化)--------成员变量(对象初始化时)------------初始化块------------构造函数 测试程序如下: package com.evan; /* * 初始化顺序测试 */ public class InitialOrderTest { public static Str

类的定义与对象的创建.

类的定义与对象的创建 1.实验目的         (1)理解并学会使用类,并创造合适的对象 (2)掌握在什么场景下需要使用 类 2.实验内容 类的定义.类成员的访问控制.对象.类的成员函数 3.实验过程 3.1类和对象 Part1.应用场景 类是面向对象程序设计方法的核心,利用类可以实现对数据的封装和隐蔽. 在面向对象程序设计中,程序模块是由类构成的.类是对逻辑上相关的函数与数据的封装,它是对问题的抽象描述. Part2.定义及代码 3.1.1类的定义 class 类名称 { public:

java类的初始化块/执行顺序,实例化对象数据赋值

java里初始化一个类的对象,通过初始化快或者构造方法进行数据赋值.与其相关的执行代码有这么几种: 静态初始化块 初始化块 构造方法 静态初始化块 静态初始化块只在类加载时执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量. 非静态初始化块 非静态初始化块在每次初始化实例对象的时候都执行一次,可以给任意变量赋值. 构造方法 在每次初始化实例对象时调用. 重点:执行顺序-> 在加载类时执行一次静态初始化块(之后不再调用). 在每次初始化实例对象时:先执行非静态初始化块,再执行构

Java虚拟机(二)对象的创建与OOP-Klass模型

相关文章 Java虚拟机系列 前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇文章会给你答案. 1.对象的创建 对象的创建通常是通过new一个对象而已,当虚拟机接收到一个new指令时,它会做如下的操作. (1)判断对象对应的类是否加载.链接.初始化 虚拟机接收到一条new指令时,首先会去检查这个指定的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被类加载