全局變量和局部變量的區(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ǔ)法格式