java笔记一:类成员的初始化顺序

  最近一直在看《thinking in java》一书,感觉里面东西讲的很细,很多东西都没有接触过,是值得各位java程序员仔细品味的一本好书。

  今天看了关于类成员初始化那节,以前对于成员初始化顺序没有考虑那么多,没有在意初始化的顺序。今天特意仔细研究了一番。

  一个类中,最首先被初始化的是静态成员,也就是有关键字static修饰的成员。只要一个类被使用也就是创建对象或者调用了该类的某个静态方法时静态成员就都会被初始化,并且静态数据在内存中只占用一份存储区域,无论创建多少个对象,静态数据被所有对象共享。

  初始化静态成员后再初始化非静态成员。对于非静态成员之间,也是有初始化顺序的,变量定义的顺序决定了初始化的顺序(无论成员变量在哪里定义,都会在函数调用之前得到初始化)

  直接定义成员初始化完成后才会执行构造函数初始化。

具体看例子:

 1 public class House {
 2     //对于非静态成员变量,谁先定义谁就先被初始化。顺序为w1、w2、w3
 3     Window w1 = new Window(1);
 4     public House() {
 5         System.out.println(“House()”);
 6         w3 = new Window(33);
 7     }
 8     Window w2 = new Window(2);
 9     void f(){
10         System.out.println(“f()”);
11     }
12     static void f1(){
13         System.out.println(“static f1()”);
14     }
15     Window w3 = new Window(3); //在函数f后面,但是在f调用之前得到了初始化
16     static Window w4 = new Window(4);  //静态成员变量最先被初始化
17     /*
18       @param args
19      */
20     public static void main(String[] args) {
21         House h = new House();
22         h.f();
23         House.f1();
24     }
25
26 }
27 class Window{
28     public Window(int maker) {
29         System.out.println(“Window(“+maker+”)”);
30     }
31 }

执行结果如下:

1 Window(4)
2 Window(1)
3 Window(2)
4 Window(3)
5 House()
6 Window(33)
7 f()
8 static f1()

这样很明显就能看出成员的初始化顺序了。

时间: 2024-09-11 13:27:32

java笔记一:类成员的初始化顺序的相关文章

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

复制代码 代码如下: public class Test4 {    @Test    public void test(){        child child = new child();    }} class parent{    public static String parentStaticField = "父类静态变量";    public String parentNormalField ="父类普通变量";    static {      

C++:类的成员变量 声明顺序 与 初始化顺序 相同

类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行; 否则, 在变量之间交替赋值时, 会产生, 未初始化的变量去赋值其他变量; 同时GCC, 也会发出警告, 如: 'class::m_xxx' will be initialized after [-Wreorder] 代码: /* * BInsertSort.cpp * * Created on: 2014年4月15日 * Author: Spike */ #include <ios

C#小测试(一):类成员初始化与构造函数执行的顺序

看看下面这段代码,你觉得它会输出什么呢? class Foo { public Foo(string s) { Console.WriteLine("Foo constructor: {0}", s); } public void Bar(){} } class Base { readonly Foo baseFoo = new Foo("Base initializer"); public Base() { Console.WriteLine("Base

关于初始化C++类成员

在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种: 第一种方法: CMYClass::CSomeClass() { x=0; y=1; } 第二种方法: CSomeClass::CSomeClass() : x(0), y(1) { } 本文将要探讨这两种方法的异同以及如何使用这两种方法. 从技术上说,第二种方法比较好,但是在大多数情况下,两者实际上没有什么区别.第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑

C#基础知识-对象初始化顺序

本文章转载:http://blog.csdn.net/forever_wind/article/details/7442503 不错的文章:http://www.cnblogs.com/McJeremy/archive/2009/04/23/1442163.html   C#语言里类变量初始化的顺序是 1   类成员变量初始化先于类的构造函数 2   静态成员变量先于实例变量 3   父类成员变量先于子类成员变量 C#相反 4   父类构造函数先于子类构造函数  

string-java中String类两种初始化的区别

问题描述 java中String类两种初始化的区别 解决方案 首先,你得理解下JAVA的存储区主要有三个:栈.堆.静态区.这三个的生命周期不一样,分配方式也不一样,存储内容也不一样 String a="aaa"这里的aaa存放就是在静态区,如果还有后头又定义一个string b="aaa",那么java里头会把它也指向a指向的地方.整个aaa会一直等到你程序退出了才释放空间 而String a1=new String("aaa").这里aaa是放

Java 类中类属性和对象属性的初始化顺序

对象 边城狂人 Java 类中类属性 (static 变量) 和对象属性 (非 static 变量) 的初始化顺序可以用如下程序测试: /** * @(#) Test.java * @author fancy */ public class Test { static String a = "string-a"; static String b; String c = "stirng-c"; String d; static { printStatic("

java 初始化-Java类的初始化顺序问题

问题描述 Java类的初始化顺序问题 一般在Java对象能够调用方法之前,此类中的成员变量就已经初始化完毕,那如果这个成员是匿名内部类呢?也会等到这个匿名内部类中的代码全部跑完吗? 解决方案 Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)4,装载子类B后,完成静态动作类装载完成,

java代码-java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

问题描述 java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的? class Demo03 { public static void main(String[] args) { A.show(); } } class A { //构造方法 A(){ System.out.println("构造方法执行"); System.out.println(b); System.out.println(c); } static A a=new A(); sta