JAVA基礎之構造函數

class Person //構造函數。 
{
	public static void main(String[] args) 
	{
		/*構造函數:
		特點:函數名與類名相同
			  不用定義返回值類型。
			  沒有具體的返回值
		作用:給對象進行初始化
		*/
	people p =new people();//構造函數:構建創造對象時調用的函數。作用就是給對象初始化。
	//在創建對象的時候,構建函數就會運行。也就是會執行函數裏的執行語句。
	p.speak();//這個P叫類類型變量,和類變量是兩回事。
	people p1=new people("Jack",18);
	p1.speak();
	System.out.println(people.age);//定義了靜態成員變量,不用創建對象都可以調用。
	}
}

我們定義一個構造函數,還是以人舉例。

class	People
{
	static  int age=18;//被static修飾過的變量不能叫成員變量。叫靜態變量,也叫類變量。
	private String name;//成員變量,也叫實例變量。
	People()//這就是一個構造函數,而且是空參數。
	{
		System.out.println("people run");
	}
	//people {}  這就是默認的構造函數,如果類中沒有定義的話,它會默認初始化。
	People(String n,int a)//這也是構造函數。
	{
		name=n;
		age=a;
	}
	public void speak()
	{
		System.out.println(name+":"+age);
	}
	/*創建對象都必須要通過構造函數初始化。
	
	一個類中如果沒有定義過構造函數,那麼該類中會有一個默認的空參數構造函數。
	如果類中定義了指定的構造函數,那麼類中的默認構造函數就沒有了。
	
	構造函數和一般函數的區別:
	構造函數:對象創建時,就會調用與之對應的構造函數,對對象進行初始化。
			  對象創建時,只會被調用一次。
	一般函數:對象創建後,需要函數功能時才調用。
			  對象創建後,可以被多次調用。
			  
	什麼時候定義構造函數呢?
	在描述事物時,該事物已存在具備的一些內容,這些內容都定義在構造函數中。*/
}
構造函數中的一個關鍵字:this。
當成員變量和局部變量重名時,可以用關鍵字this來區分。
比如上面的對象people。

class	people
{
	private	int age;
	private String name;
	people(String n,int a)
	{
		name=n;
		age=a;
	}
	public void speak()
	{
		System.out.println(name+":"+age);
	}
}
這是對象在類中的描述,我們注意構造函數部分,也就是

people(String n,int a)
	{
		name=n;
		age=a;
	}
構造函數中,我們將n賦值給name,a賦值給age。但是定義成n和a的閱讀性不強,在代碼很多的時候會給我們造成障礙。
爲了增強閱讀性,我們將n和a改會原來的變量名,但是這樣就會造成局部變量和成員變量重名
也就是這種情況。

people(String name,int age)
	{
		name=name;
		age=age;
	}
這樣就會導致:函數定義的局部變量在棧內存中,而賦值的時候底層還是會使用棧內存中的局部變量,而不是堆內存
中的成員變量,輸出的結果就會是錯誤的,或者不是我們所需要的。
這時候我們就需要用到this關鍵字。將構造函數改爲:

people(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
這裏的this代表當前對象,this.name就是代表當前對象的name,這樣就能夠區分局部變量和成員變量。
所以this的作用就是:
所在函數所屬對象的調用。通俗的意思就是哪個對象調用了this所在的函數
this就代表哪個對象。
this還可以用於在構造函數中調用其他構造函數。
注意:只能定義在構造函數的第一行,因爲初始化動作要先執行。


比如

class	people
{
	private	int age;
	private String name;
	people()
	{
		System.out.println("people run");
	}
	people(String n,int a)
	{
		name=n;
		age=a;
	}
	public void speak()
	{
		System.out.println(name+":"+age);
	}
我們想在people(String n,int a)構造函數中調用people()構造函數。
可直接寫爲:

people()
	{
		System.out.println("people run");
	}
	people(String n,int a)
	{
		this();//這就是調用上面的構造函數,如果構造函數是空參數則只帶上空括號即可,
				//如果有參數,則跟上參數。
				//我們調用上面的構造函數不能寫成people()因爲這時對象還沒被初始化是不能調用方法的。
				//寫爲this,含義就是給當前對象中空參數的構造函數進行初始化。
		name=n;
		age=a;
	}
static關鍵字:意爲靜態。特點是:
1.是一個修飾符,用於修飾成員。
2.static修飾的成員被所有對象所共享。
3.static修飾的成員優先於對象存在,因爲static成員隨着類的加載就已經存在。
4.static修飾的成員多了一種調用方式,就可以直接被類名調用。
格式爲:類名.靜態成員。
5.static修飾的數據是共享數據,對象中的存儲是特有數據。

比如:
還是上面的對象描述類舉例。

	class	people
{
	int age;
	private String name;
}
上面兩個成員變量,name和age。我們假使要多次創建對象時,年齡也就是age都是18,只有name的不同。
一個個的去賦值既佔用空間代碼複用性也不強,這時我們就需要static關鍵字來修飾age成員變量。
修飾完畢後這個變量的數據就是共享數據,可以被所有對象調用。
所以我們就可以寫成這樣
class	people
{
	static	int age=18;
	private String name;
}
成員變量和靜態變量的區別:
1.兩個變量的生命週期不同。
成員變量隨着對象的創建而存在,隨着對象的被回收而釋放。
靜態變量隨着類的加載而存在,隨着類的消失而消失。
2.調用方式不同。
成員變量只能被對象調用。
靜態變量不僅可以被對象調用,還可以被類名調用。(即不創建對象也可調用靜態變量)
3.別名不同。
成員變量也稱爲實例變量。
靜態變量也稱爲類變量。
4.數據存儲位置不同。
成員變量的數據存儲在堆內存的對象中,所以也叫對象的特有數據。
靜態變量的數據存儲在方法區(共享數據區)的靜態區中,所以也叫對象的共享數據。


靜態的用途:(即static關鍵詞在什麼時候修飾成員變量和成員函數)
1.靜態變量
當分析對象中所具備的成員變量的值是相同的,這個成員就可以被靜態修飾。
只要數據在對象中是不同的,就是對象的特有數據,必須存儲在對象中,是非靜態的。
如果是相同的數據,對象不需要做修改,只需要使用即可,不需要存儲在對象中,就定義成靜態的。
2.靜態函數。
函數是否用靜態修飾,就參考一點,就是該函數功能是否有訪問到對象中的特有數據。
簡單點說,從源代碼看,該功能是否需要訪問非靜態的成員變量,如果需要,該功能就是非靜態的。
如果不需要,就可以定義成靜態的。(定義成非靜態也可以。)
(但是此時定義非靜態是沒有意義的,因爲函數都沒有訪問到對象的特有數據,就不需要創建對象
,函數卻要定義成非靜態的就沒有必要,非靜態還要創建對象,是浪費內存空間的行爲。
爲了嚴謹,我們還是得定義成靜態的。)




靜態代碼塊:
static
{


}
這個靜態代碼塊沒有名字(static不是名字,是修飾符,修飾這個代碼塊。)
它是隨着類的加載而執行,而且只執行一次。(創建多個對象時,類其實只加載了一次。)

它的作用:
用於給類進行初始化(和構造函數類似,構造函數是給對象進行初始化的。)

靜態使用的注意事項:
1.靜態方法只能訪問靜態成員。(非靜態既可以訪問靜態,又可以訪問非靜態。)
2.靜態方法中不可以使用this或super關鍵字。
3.主函數是靜態的。


主函數的意思:
public static void main(String[] args) 


主函數的特殊之處:
1.格式是固定的。
2.被jvm所識別和調用。

public:權限必須是最大的。
static:不需要對象,直接用主函數所屬類名調用即可。
void:主函數沒有具體的返回值。
main:函數名。不是關鍵字,只是jvm識別的固定名字。
String[] args:這是主函數的參數列表,是一個數組類型的參數,而且元素都是字符串類型。


其中只有args是可以隨意更改的,因爲他只是一個數組名而已。但是現在已經被潛移默化成了規範。


函數在主函數中用函數名調用。同樣的原理,
主函數在虛擬機中,用主函數名調用,只是這一步執行我們是在控制檯(DOS命令行)進行的。
說白了主函數實際上就是一個沒有具體返回值的類型的方法,我們同樣可以在控制檯上給主函數的數組
賦予數據。

{
執行語句;
}
以上叫構造代碼塊,既沒有名字,也沒有修飾符。
它是隨着對象的創建而執行的,創建幾次對象就執行幾次。


構造代碼塊,靜態代碼塊,構造函數,在同一個類中,他們的運行順序是
先執行靜態代碼塊。
如果創建了對象就依次執行構造代碼塊,最後纔是構造函數。
如果沒有創建對象,則後兩個不執行。








發佈了47 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章