類的構造方法
簡單來說就是跟類名字一樣的無參數方法,跟類名字一樣的無參數方法就是類的構造方法,比如:
public class TryFirst {
TryFirst() {}
}
我們之前說方法名首字母小寫,這個就不用,因為這個是構造方法,要的就是跟類名一樣,大小寫也是啦。
如果變成:
public class TryFirst {
TryFirst(int a) {}
}
方法有參數的話,那就不是咯!切記!!
構造方法有什麼用嘞,它其實是在類被執行個體化(TryFirst tryFirst = new TryFirst())的時候會被調用的方法,不需要再tryFirst.TryFirst(),就可以被調用了。這個構造方法就算你不寫,系統也會自動給它弄一個構造方法的,隻是方法裡面是空的而已啦。自己寫的話,就可以在方法裡寫自己想寫的代碼了。
類裡面的成員變量和局部變量
1)介紹變量,通過例子來講吧,如下:
public class TryFirst {
//直接寫在類{}下的就是成員變量啦,如下
int a = 11;
//寫在方法裡面的就是局部變量啦,如下
void oneWay(int b) {
int a = 22;
int c = 33 ;
}
其中的a就是成員變量啦,而b和c則是局部變量,通過例子也可以看出來,隻要不是直接寫在類{}下的,都是局部變量,其中b是寫在{()}裡的,c是寫在{{}}裡的,而方法裡的a(int a = 22;)是寫在{{}}裡的,都不是直接寫在類的{}裡的啦。
差別:成員變量在類的{}裡都可以調用到,而局部變量隻能在局部被調用,并不是在整個類{}裡都可以調用。比如我想在oneWay方法之外調用c這個變量,這就做不到,但如果我想在方法oneWay裡調用a變量,隻需要在oneWay裡寫:
this.a
就可以調用了。如果不是在方法内調用,直接寫a就可以調用。
還有注意區分類的a(int a = 11;)和方法的a(int a = 22;)哦!他們兩個可不一樣,一個是成員變量一個是局部變量,也就是為了在方法裡差別兩個a,是以當在方法裡用成員變量的時候,要寫成this.a 當要用局部變量的時候,也就是方法裡面的a的時候,直接寫a就可以了。可能有人會問,那怎麼在方法外區分它們呢?不存在這種可能呢,因為局部變量隻能在相應的方法裡被調用啊,在方法之外就用不了了,是以,如果是在方法外的話,就隻有成員變量了,不需要區分,直接寫a姐可以,比如:
public class TryFirst {
int a = 11;
void oneWay(int b) {
int a = 22;
int c = 33;
//在方法裡調用局部變量的a( int a = 22;)
System.out.println(a);
//在方法裡調用成員變量的a( int a = 11;)
System.out.println(this.a);
}
//在方法之外隻能調用成員變量,下面的a就是上面的成員變量(int a = 11;)
int d = a;
需要注意一下this的用法:
a.this在static修飾的方法了是不可以用的

b.除了可以區分使用同名成員變量和局部變量外,還可以在方法中調用其它方法
package com.see;
public class TryUseThis {
String str = "成員變量";
public void one() {
this.two();
}
public void two() {
String str = "局部變量";
System.out.println("方法用this調用别的方法" + "、 " + str + "、 " + this.str);
}
public static void main(String[] args) {
TryUseThis tryUseThis = new TryUseThis();
tryUseThis.one();
}
}
c.可以通過this來調用類的有參數的構造方法,(一般類隻有一個是無參數的構造方法):
//在無參構造方法裡調用有參構造方法時,需要将"this(參數)"寫在第一行,不然會報錯的
public class TryUseThis {
TryUseThis(int a) {
System.out.println("有參構造方法"+a);
}
TryUseThis() {
this(0);//這個要寫在第一行!(注意大小寫)
System.out.println("無參構造方法"+1);
}
}
2)調用變量
成員變量又叫類變量,它在類被加載的時候,就被執行個體話了。什麼叫執行個體化呢,就是被配置設定記憶體了。如果一個變量沒有被配置設定記憶體,它就不是實際存在的。隻有程式結束運作的時候,才會釋放記憶體
而局部變量,也就是方法裡的變量,它們一開始的時候是不被配置設定記憶體的,隻有方法被調用的時候,局部變量才會配置設定記憶體,即被執行個體化。當該方法調用完畢時,局部變量配置設定的記憶體就會被釋放掉。
有時候人家會問,為什麼編輯器都已經編譯好了,當方法背調用的時候還能再配置設定記憶體呢?難道是重新編譯嗎?
其實不是的啦,方法中的變量,也就是局部變量,其實在被配置設定記憶體的全過程都是在一個棧内完成的,所用空間也是棧空間,跟成員變量的空間不同,它們是不一樣的,是以被釋放的時間也不一樣。
可能有些人還會問,曾元變量一開始就被賦予了記憶體空間,但如果成員變量在一開始并沒有指派的話,賦予空間的值又是多少呢?
細心的人會發現,就算一開始成員變量沒有被指派,比如寫成這樣
int a;
也不會報錯,也并沒有指派,當這種情況,系統會指派其的預設值,int 的預設值為0,String的預設值為null ,而boolean 的預設值為false。這些都是成員變量的指派哦!要是寫在main方法裡面,比如也寫成
int a;
這個時候就不會被指派了,畢竟main方法也是方法嘛,這不能算作是成員變量。
3)被static修飾的特殊成員變量——類成員變量
被static修飾的成員變量也是成員變量,但它在各個對象裡被調用是共同的,也就是各個對象共享這個類成員變量。舉個例子說明吧:
public class TryFirst {
int a = 1;
static int b = 3;
public static void main(String[] args) {
//執行個體化兩個對象
TryFirst tryFirst1 = new TryFirst();
TryFirst tryFirst2 = new TryFirst();
tryFirst1.a = 2;
System.out.println(tryFirst1.a);
System.out.println(tryFirst2.a);
tryFirst1.b = 4;
System.out.println(tryFirst1.b);
System.out.println(tryFirst2.b);
}
}
你會發現輸出結果是
2
1
4
4
這就是有static修飾和沒static修飾的差別。被static修飾的成員變量,在對象中是共享的,當tryFirst1改變它的值時,tryFirst2調用的就是被改變的值。
而沒有static修飾的陳冠變量,變量是單獨的,不受對象的影響,當tryFirst1改變它的值時,它的實際值并未被改變,是以當tryFirst2調用它時,它還是原先的值。
方法的重載
方法名可以一樣嗎?答案是:可以。但是是有條件的可以,條件是:必須存在不同屬性的參數或者不同數量的參數。怎麼個意思嘞,舉個例子吧:
public class TryFirst {
void oneWay() {}
void oneWay(int a) {}
void oneWay(short a) {}
void oneWay(int a,int b) {}
}
上面的四個方法都叫oneWay,你會發現編譯不會報錯,這就是方法的重載,除了名字外,它們分别都有各自的不同,第一個的參數為0個,第二個的參數為1個,而第三個的參數類型與第二個的不同,第四個的參數數量是2個,跟前幾個都不一樣。
方法的傳回值
我們都知道方法的寫法是:
void wayName(){}
那你知道void是什麼意思嗎?其實void表示的就是“傳回空”的意思,其實方法是可以傳回一個值的,隻是之前我們都沒有到而已,是以就沒有。那麼可以傳回什麼類型的值呢?又需要怎樣才能傳回呢?
能傳回所有類型的值 比如8大基本參數類型,byte,int,short,long,float,double,boolean,char 以及String類型也能傳回。還有是以類型的父類object也能傳回。
傳回方法:将void 改成你想傳回的參數類型,然後在方法後面return 一個參數即可,具體如下例:
public class TryFirst {
public static void main(String[] args) {
//執行個體化兩個對象
TryFirst tryFirst1 = new TryFirst();
int a = tryFirst1.oneWay();
System.out.println(tryFirst1.oneWay());
System.out.println(a);
}
int oneWay() {
int c = 5;
return c;
}
我的方法名叫oneWay 而我傳回的參數類型是int型,傳回的是c(return c),當我們調用這個方法的時候,這個方法無形地就變成了一個值,我可以直接這麼寫
System.out.println(tryFirst1.oneWay());
也可以通過指派給自己定義的參數然後再
int a = tryFirst1.oneWay(); System.out.println(a);
一般不建議再一次指派,因為這樣還要配置設定一個記憶體空間給它,沒必要,是以能直接寫就直接寫,不要指派。
被static修飾的方法
被static修飾的方法在一開始就被配置設定了入口位址,而沒有static修飾的方法在一開始的時候并沒有被配置設定這個入口位址,沒有入口位址,就不能直接調用該方法,而有入口位址的就可以直接通過入口位址調用方法。舉例說明吧:
public class TryFirst {
public static void main(String[] args) {
oneWay();
TryFirst tryFirst = new TryFirst();
tryFirst.twoWay();
}
static void oneWay() {
System.out.println("被static修飾的方法,一開始就有方法的入口位址");
}
void twoWay() {
System.out.println("沒被static修飾的方法,一開始沒方法的入口位址");
}
}
通過例子我們可以發現,oneWay不需要先執行個體化對象就可以使用,而twoWay則需要先執行個體化對象後才能使用,這就是被static修飾與否的差別。
----------END