Java個人筆記之物件與函式
對於面向過程思想,強調的是過程(動作).
對於面向物件思想,強調的是物件(實體)。
特點:
1,面向物件就是一種常見的思想。符合人們的思考習慣。
2,面向物件的出現,將複雜的問題簡單化。
3,面向物件的出現,讓曾經在過程中的執行者,變成了物件中的指揮者。
建構函式:構建創造物件時呼叫的函式。
作用:可以給物件進行初始化。
建立物件都必須要通過建構函式初始化。
建構函式:物件建立時,就會呼叫與之對應的建構函式,對物件進行初始化。
一般函式:物件建立後,需要函式功能時才呼叫。
建構函式:物件建立時,會呼叫只調用一次。
一般函式:物件建立後,可以被呼叫多次。
什麼時候定義建構函式呢?
在描述事物時,該事物一存在就具備的一些內容,這些內容都定義在建構函式中。
建構函式可以有多個,用於對不同的物件進行鍼對性的初始化.
多個建構函式在類中是以過載的形式來體現的。
細節:
1,建構函式如果完成了set功能。set方法是否需要。
2,一般函式不能直接呼叫建構函式。
3,建構函式如果前面加了void就變成了一般函式。
4,建構函式中是有return語句的。
this
當成員變數和區域性變數重名,可以用關鍵字this來區分。
this : 代表物件。代表哪個物件呢?當前物件。
this就是所在函式所屬物件的引用。
簡單說:哪個物件呼叫了this所在的函式,this就代表哪個物件。
this也可以用於在建構函式中呼叫其他建構函式。(一般函式調用不了)
**注意:**只能定義在建構函式的第一行。(因為初始化動作要先執行)
class Person { private String name; private int age; Person() { name = "baby"; age = 1; System.out.println("person run"); } Person(String name) { this();//**呼叫Person();建構函式**二次初始化 this.name = name; } Person(String name,int age) { this.name = name; this.age = age; } /* 判斷是否是同齡人。 */ public boolean compare(Person p) { /* if(this.age == p.age) return true; else return false; */ return this.age==p.age; }` }
static
特點:
1,static是一個修飾符,用於修飾成員。
2,static修飾的成員被所有的物件所共享。
3,static優先於物件存在,因為static的成員隨著類的載入就已經存在了。
4,static修飾的成員多了一種呼叫方式,就可以直接被類名所呼叫 。 類名.靜態成員 。
5,static修飾的資料是共享資料,物件中的儲存的是特有資料。
成員變數和靜態變數的區別?
1,兩個變數的生命週期不同。
成員變數隨著物件的建立而存在,隨著物件的被回收而釋放。
靜態變數隨著類的載入而存在,隨著類的消失而消失。
2,呼叫方式不同。
成員變數只能被物件呼叫。
靜態變數可以被物件呼叫,還可以被類名呼叫。
3,別名不同。
成員變數也稱為例項變數。
靜態變數稱為類變數。
4,資料儲存位置不同。
成員變數資料儲存在堆記憶體的物件中,所以也叫物件的特有資料.
靜態變數資料儲存在方法區(共享資料區)的靜態區,所以也叫物件的共享資料.
靜態使用的注意事項:
1,靜態方法只能訪問靜態成員。(非靜態既可以訪問靜態,又可以訪問非靜態)
2,靜態方法中不可以使用this或者super關鍵字。
3,主函式是靜態的。
靜態什麼時候用?
1,靜態變數。
當分析物件中所具備的成員變數的值都是相同的 。
這時這個成員就可以被靜態修飾。
只要資料在物件中都是不同的,就是物件的特有資料,必須儲存在物件中,是非靜態的。
如果是相同的資料,物件不需要做修改,只需要使用即可,不需要儲存在物件中,定義成靜態的。
2,靜態函式。
函式是否用靜態修飾,就參考一點,就是該函式功能是否有訪問到物件中的特有資料。
簡單點說,從原始碼看,該功能是否需要訪問非靜態的成員變數,如果需要,該功能就是非靜態的。
如果不需要,就可以將該功能定義成靜態的。當然,也可以定義成非靜態,
但是非靜態需要被物件呼叫,而僅建立物件呼叫非靜態的
沒有訪問特有資料的方法,該物件的建立是沒有意義。
靜態程式碼塊。
隨著類的載入而執行。而且只執行一次。
作用:
用於給類進行初始化。
class Person
{
private String name;
{//構造程式碼塊。可以給所有物件進行初始化的。
System.out.println("constructor code ");
// cry();
}
static //用於給類進行初始化。
{
name= "sd";//初始時可以操作多次name
System.out.println("hahahah");
}
Person()//是給對應的物件進行鍼對性的初始化。
{
name = "baby";
// cry();
}
Person(String name)
{
this.name = name;
// cry();
}
static void show()
{
System.out.println("show run");
}
public void cry()
{
System.out.println("哇哇");
}
}