構(gòu)造函數(shù)之初始化操作(1)

全局變量和局部變量的區(qū)別:全局變量是作用,在定義的時(shí)候可以不給于初始值;而局部變量作用于當(dāng)前的方法,在定義的是要對(duì)齊進(jìn)行設(shè)置初始值。當(dāng)你定義一個(gè)局部變量的時(shí)候,若你沒(méi)有給它進(jìn)行初始化的操作是,系統(tǒng)會(huì)給出一條提示信息,提示你定義的變量沒(méi)有進(jìn)行初始化。例:

void example(){
    int i;
    i++;
}

如上面代碼當(dāng)編譯器在執(zhí)行i++的時(shí)候,編譯器會(huì)提示你i沒(méi)有進(jìn)行初始化操作。
如果我們將一個(gè)基本數(shù)據(jù)類(lèi)型定義為成員變量,結(jié)果會(huì)有點(diǎn)小小的不同,原因是因?yàn)槿魏蔚姆椒ǘ伎梢猿跏蓟@個(gè)成員邊變量,如果要求我們?cè)谑褂们盀槠滟x予一個(gè)合適的值,那是不太現(xiàn)實(shí)的,如果我們賦予一個(gè)沒(méi)有用的值,這樣也是不安全的。所以,一個(gè)類(lèi)中的所有的基本數(shù)據(jù)類(lèi)型的成員變量都會(huì)保證獲得一個(gè)初始值。例:

class Measurement{    
    boolean t;    
    char c;    
    byte b;    
    short s;    
    int i;    
    long l;    
    float f;   
    double d;
    void print(){
        System.out.println("數(shù)據(jù)類(lèi)型 \t 值如下 \n" +
                            "boolean \t"+ t +"\n" +
                            "char \t" +c +"\n"+
                            "byte \t" +b +"\n"+
                            "short \t" +s +"\n"+
                            "int \t" +i +"\n"+ 
                           "long \t" +l +"\n"+
                            "float \t" +f +"\n"+
                            "double \t" +d +"\n");
    }
}
public class initialValues {
    public static void main(String[] args){
        Measurement d =new Measurement();
        d.print();   
   }
}

這個(gè)例子向我們顯示了基本數(shù)據(jù)類(lèi)型成員變量的默認(rèn)的初始值,其中char的值為空,沒(méi)有數(shù)據(jù)打印出來(lái)。
構(gòu)造函數(shù)的初始化:
1、初始化的順序:在一個(gè)類(lèi)里面成員變量初始化的順序是由變量在類(lèi)中 定義的順序決定的,即使變量的定義在各種方法之間,它們 仍會(huì)在這些方法調(diào)用之前進(jìn)行初始化操作。例:

    class Score{
            Score(int score){ 
               System.out.println("score("+score+")"); 
           }
        }
    class Stu{
        Score sc = new Score(1);//在構(gòu)造函數(shù)之前
        Stu(){
            //在構(gòu)造函數(shù)中
            System.out.println("Stu()");
             sc3 = new Score(33);//從新初始化sc3
        }
        Score sc2 = new Score(2);//在構(gòu)造函數(shù)之后
        void f(){
            System.out.println("f()");
        }
        Score sc3 = new Score(3);//在結(jié)束部分
    }
public class Example {
    public static void main(String[] args) {
        Stu st = new Stu();
        st.f();
    }
}

在上述代碼中我們故意在構(gòu)造函數(shù)之前、構(gòu)造函數(shù)中、構(gòu)造函數(shù)之后和結(jié)束部分定義了變量,它的輸出結(jié)果為:

score(1)
score(2)
score(3)
Stu()
score(33)
f()

先輸出的是我們定義的變量,這就證明了我們?cè)陬?lèi)里面定義的變量會(huì)在調(diào)用方法之前得到初始化的操作。
2、靜態(tài)數(shù)據(jù)的初始化:如果數(shù)據(jù)是靜態(tài)的,如果它是一個(gè)基本數(shù)據(jù)類(lèi)型的變量,而且我們沒(méi)有對(duì)它進(jìn)行初始化賦值,這樣的話(huà)他會(huì)獲得與自己數(shù)據(jù)類(lèi)型相同的標(biāo)準(zhǔn)的初始值;如果它是指向一個(gè)對(duì)象,除非新建一個(gè)對(duì)象,并將這兩個(gè)對(duì)象相連接起來(lái),否則的話(huà)它會(huì)得到一個(gè)空值。如果想在定義的時(shí)候初始化,但是由于static的值只有一個(gè)儲(chǔ)存區(qū)域,這樣的話(huà)我們就會(huì)想我們到底在什么時(shí)候?qū)@個(gè)儲(chǔ)存區(qū)域進(jìn)行初始化的操作呢?

class Queue{
    //創(chuàng)建一個(gè)隊(duì)列的類(lèi)
    Queue(int marker){
        System.out.println("marker("+marker+")");
    }
    void ming(int marker){
        System.out.println("marker("+marker+")");
    }
}
class Maidan{
    static Queue q1 =new Queue(1);
    Maidan(){
        System.out.println("Maidan()");
        q2.ming(1);
    }
    void ming2(int marker){
        System.out.println("ming2("+marker+")");
    }
    static Queue q2 = new Queue(2);
}
class Scl{
    Queue q3 =new Queue(3);
    static  Queue q4 = new Queue(4);
    Scl(){
        System.out.println("Scl()");
        q4.ming(2);
    }
    void ming3(int marker){
        System.out.println("ming3("+marker+")");
    }    
static Queue q5 =new Queue(5);
}
public class Example2 {
    public static void main(String[] args) { 
       System.out.println("在main方法中創(chuàng)建學(xué)校類(lèi)");
        new Scl();
        System.out.println("在main方法中創(chuàng)建學(xué)校類(lèi)");
        new Scl();
        maidan.ming2(1);
        scl.ming3(1);
    }    
static Maidan maidan =new Maidan();
static Scl scl = new Scl();
}

Queue允許我們檢查一個(gè)類(lèi)的創(chuàng)建過(guò)程,而Maidan和Scl可以定義位于Queue中的static成員變量。
static的初始化只有在必要的時(shí)候才會(huì)進(jìn)行,上述代碼中如果我們不定義Maidan類(lèi)或者我們不調(diào)用Maidan.q1或者M(jìn)aidan.q2的話(huà)static Queue q1和q2永遠(yuǎn)不會(huì)被創(chuàng)建;只有我們?cè)L問(wèn)了一次static之后,它們才會(huì)被創(chuàng)建并且static對(duì)象不會(huì)重新初始化。所以它們初始化的順序是首先static,然后是非static對(duì)象
3、明確進(jìn)行的靜態(tài)初始化:

class Exmple{
    static int i;
    static {
          i=47;
      }
}

java允許我們將其他的static的初始化操作劃分到類(lèi)里面的靜態(tài)塊里面處理。上述代碼中一個(gè)方法它只有一個(gè)static關(guān)鍵字,后面跟隨一個(gè)方法主體,它和其他的static初始化一樣,只會(huì)被執(zhí)行一次。
4、 非靜態(tài)實(shí)例的初始化:針對(duì)每個(gè)非靜態(tài)對(duì)象的初始化,java1.1提供一種類(lèi)似于的語(yǔ)法格式。實(shí)例化從句

{
  c1 = new Mug(1);
  c2 = new Mug(2);
  System.out.println("c1和c2是構(gòu)造函數(shù)");
}

他看起來(lái)和靜態(tài)初始化很像,只是沒(méi)有static關(guān)鍵字,匿名內(nèi)部類(lèi)的初始化的語(yǔ)法格式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容