Java類(lèi)變量和成員變量初始化過(guò)程
昨天看了一本叫做《突破程序員基本功的16課》的書(shū),個(gè)人感覺(jué)還可以,主要對(duì)Java的技巧進(jìn)行了一些深入的講解,讓我對(duì)類(lèi)的初始化和對(duì)象的創(chuàng)建有了新的認(rèn)識(shí)。
一、類(lèi)的初始化
對(duì)于類(lèi)的初始化:類(lèi)的初始化一般只初始化一次,類(lèi)的初始化主要是初始化靜態(tài)成員變量。
類(lèi)的編譯決定了類(lèi)的初始化過(guò)程。
編譯器生成的class文件主要對(duì)定義在源文件中的類(lèi)進(jìn)行了如下的更改:
1) 先按照靜態(tài)成員變量的定義順序在類(lèi)內(nèi)部聲明成員變量。
2) 再按照原java類(lèi)中對(duì)成員變量的初始化順序進(jìn)行初始化。
一個(gè)java類(lèi)和編譯后的class對(duì)應(yīng)的轉(zhuǎn)換如下:
源文件:
- public class Person{
- public static String name="張三";
- public static int age;
- static{
- age=20;
- System.out.println("初始化age");
- }
- public static String address;
- static{
- address="北京市";
- age=34;
- }
- public static void main(String[] args) {
- System.out.println(name);
- System.out.println(age);
- System.out.println(address);
- }
- }
當(dāng)java源代碼轉(zhuǎn)換成一個(gè)class文件后,其轉(zhuǎn)換成類(lèi)似下面的代碼:
- public class Person{
- public static String name;
- public static int age;
- public static String address;
- static{
- name="張三";
- age=20;
- System.out.println("初始化age");
- address="北京市";
- age=34;
- }
- public static void main(String[] args) {
- System.out.println(name);
- System.out.println(age);
- System.out.println(address);
- }
- }
初始化順序依據(jù)轉(zhuǎn)換后對(duì)應(yīng)的class類(lèi)成員變量的初始化順序依次執(zhí)行,所以所有的靜態(tài)成員變量都是先聲明,后執(zhí)行賦值的,而且賦值的順序也是依照源代碼對(duì)靜態(tài)成員變量初始化的順序進(jìn)行的,注意:定義一個(gè)成員變量并直接初始化與在靜態(tài)代碼塊中進(jìn)行初始化是等價(jià)的,都是依據(jù)它們?cè)谠创a中定義的順序進(jìn)行的。
二、對(duì)象的生成
對(duì)于對(duì)象的生成其初始化過(guò)程與類(lèi)的初始化過(guò)程類(lèi)似,但會(huì)增加構(gòu)造函數(shù)階段,源代碼如下:
- public class Person{
- {
- name="李四";
- age=56;
- System.out.println("初始化age");
- address="上海";
- }
- public String name="張三";
- public int age=29;
- public String address="北京市";
- public Person(){
- name="趙六";
- age=23;
- address="上海市";
- }
- }
編譯器轉(zhuǎn)換成class文件后,會(huì)轉(zhuǎn)換成類(lèi)似下面的代碼:
- public class Person{
- public String name;
- public int age;
- public String address;
- public Person(){
- name="李四";
- age=56;
- System.out.println("初始化age");
- address="上海";
- name="張三";
- age=29;
- address="北京市";
- name="趙六";
- age=23;
- address="上海市";
- }
- }
可以看到,對(duì)于類(lèi)中對(duì)成員變量的初始化和代碼塊中的代碼全部都挪到了構(gòu)造函數(shù)中,并且是按照java源文件的初始化順序依次對(duì)成員變量進(jìn)行初始化的,而原構(gòu)造函數(shù)中的代碼則移到了構(gòu)造函數(shù)的***執(zhí)行。本人以前一直對(duì)類(lèi)初始化過(guò)程一直沒(méi)有一個(gè)深刻的理解,就是搞不清到底是怎么初始化的,只能按照書(shū)上所說(shuō)的記住了初始化順序,但是過(guò)一段時(shí)間有給忘了,所以這次總算給弄清楚了,還是按照一個(gè)模型來(lái)解釋初始化機(jī)制比較好啊,不用再背了,只有理解了才能不易忘。
原文鏈接:http://www.cnblogs.com/lmtoo/archive/2012/04/08/2437918.html
【編輯推薦】