Java基礎-面向物件
一、Java中的成員變數和區域性變數
定義:成員變數直接定義在類中;區域性變數定義在方法中,引數上,語句中。
範圍:成員變數在這個類中有效;區域性變數只在自己所屬的大括號內有效,大括號結束,區域性變數失去作用域。
生命週期:成員變數存在於堆記憶體中,隨著物件的產生而存在、消失而消失;區域性變數存在於棧記憶體中,隨著所屬區域的執行而存在,結束而釋放。
二、類的建構函式
建構函式:用於給物件進行初始化,是給與之對應的物件進行初始化,它具有針對性,函式的一種。所有物件建立時,都需要初始化才可以用。
一個類在定義時,如果沒有定義過建構函式,那麼該類中會自動生成一個空引數的建構函式,為了方便該類建立物件,完成初始化。如果該類中自定義了建構函式,那麼預設的建構函式就沒有了。
特點:
-
- 該函式的名稱和所在類的名稱相同
- 不需要定義返回值型別
- 該函式沒有具體的返回值
三、面向物件的三大特徵
1、繼承
繼承是面向物件程式設計能夠提高軟體開發效率的重要原因之一;
繼承是具有傳遞性的;
繼承來的屬性和方法是隱式的,也就是在本類裡面是看不見的;
一個類只能有一個父類,也就是類只能是單繼承;
一個介面可以有多個父類,也就是介面可以是多繼承。
2、封裝
物件資料和操作該物件的指令都是物件自身的一部分,能夠實現儘可能對外部隱藏資料;
實際專案開發中,使用封裝最多的就是實體類,常常和JavaBean(類必須是具體的和公共的,並且有無需引數的構造器)一起使用;
那麼,實體類通常包含:私有的成員變數、五引數的建構函式、有引數的建構函式、setter和getters方法、重寫tostring方法、重寫hashCode和equals方法。
3、多型
多型就是物件擁有多種形態:應用多型和方法多型。
引用多型:父類的引用可以指向本類物件、父類的引用可以指向子類的物件
方法多型:建立本類物件時,呼叫的方法為本類的方法;建立子類物件時,呼叫的方法為子類重寫的方法或者繼承的方法。
存在多型的必要條件:繼承、重寫
多型的作用是消除型別之間的耦合關係
在實際專案開發中,A類繼承B類,如果在A類中不重寫B類中的方法時,輸出的仍舊是B類方法裡面的資訊;如果在A類中重寫B類的方法的時候,輸出的是A類方法裡面的資訊。
四、Java中抽象類
定義:在不斷抽取過程中,將共性內容中的方法生命抽取,但是方法不一樣,沒有抽取,這樣抽取到的方法,並不具體,需要被指定關鍵字abstract鎖標示,生命為抽象方法。
抽象方法所在的類一定要標示為抽象類,也就是說該類需要被abstract關鍵字鎖修飾
特點:抽象方法只能定義在抽象類中,抽象類和抽象方法必須由abstract關鍵字修飾(可以描述類和方法,不可以描述變數)。
抽象方法只定義方法生命,並不定義方法實現。
抽象類不可以被建立物件(不可以例項化)
只有通過子類繼承抽象類並覆蓋抽象類中的所有抽象方法後,該類才可以例項化。否則,該子類還是一個抽象類。
注意:
抽象類中是否有建構函式?有,用於給子類物件進行初始化抽象類是否可以定義非抽象類?可以。其實,抽象類和一般的類沒有太大的區別,都是在描述事物,只不過抽象類在描述事物時,有些功能不具體。所以抽象類和一般類在定義上,都是需要定義屬性和行為的。只不過,比一般類多了一個抽象函式。而且比一般類少了一個建立物件的部分抽象關鍵字abstract和哪些不可以共存final,private,static抽象類可不可以不定義抽象方法?可以。抽象方法目的僅僅為了不讓該類建立物件
五、Java中抽象類和介面的區別
1、抽象類只能被繼承,而且只能單繼承;介面需要被實現。而且是多實現
2、抽象類中可以定義抽象方法和非抽象方法,子類可以直接繼承使用;介面中方法只有方法體沒有方法的實現,需要子類實現。
3、抽象類使用的是 is-a關係;介面使用的是 like-a關係
4、抽象類的陳孤雁修飾符可以自定義;介面中的成員修飾符是固定的,全部是public的
六、static、final、this、supper關鍵字總結
1、final關鍵字
final關鍵字主要用在三個地方:變數、方法、類
-
- 對於一個final變數,如果是進本資料型別的變數,則其數值一旦在初始化後便不能更改;如果是引用型別的變數,則在其初始化之後不能再讓其指向另一個物件。
- 當用final修飾一個類時,表明這個類不能被繼承。final類中的所有成員方法都會被隱式的指定為final方法
- 使用final方法的原因有兩個:第一個原因就是把方法鎖定,以防止任何類繼承修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final方法轉為內嵌呼叫,但是如果方法過於龐大,可能看不到內嵌呼叫帶來的額任何效能的提升(現在的Java版本已經不需要使用final放阿飛進行這些優化了)。類中所有的private方法都隱式的指定為final。
2、static關鍵字
static關鍵字主要有以下四種使用場景
- 修飾成員變數和成員方法
被static修飾的成員屬於類,不屬於單個這個類的某個物件,被類中所有物件共享,可以並且建議通過類名呼叫。被static宣告的成員變數屬於靜態成員變數,靜態變數存放在Java記憶體區域的方法區。呼叫格式:類名.靜態變數名;;類名.靜態方法名()。
- 靜態程式碼塊
靜態程式碼塊定義在類中方法外,靜態程式碼塊在非靜態程式碼塊之前執行(靜態程式碼塊—>非靜態程式碼塊—>構造方法)。該類不管建立多少物件,靜態程式碼塊只執行一次。
- 靜態內部類(static修飾類的話只能修飾內部類)
靜態內部類與非靜態內部類之間存在一個最大的區別:非靜態內部類在編譯完成之後會隱含地儲存一個引用,該引用是指向建立它的外圍類,但是靜態內部類卻沒有。沒有這個引用就意味著:1、它的建立時不需要依賴外圍類的建立。2、它不能使用任何外圍類的非static成員變數和方法。
- 靜態導包(用來匯入類中的靜態資源,1.5之後的新特性)
格式為:import static
這兩個關鍵字連用可以指定匯入某個類中的指定靜態資源,並且不需要使用類名呼叫類中的靜態成員,可以直接使用類中靜態成員變數和成員方法。
3、this關鍵字
this關鍵字用於引用類的當前例項。例如:
class Manager{
Employees[] employees;
void manageEmployees(){
int totalEmp=this.employees.length;
System.err.println("total emploees:"+totalEmp);
this.report();
}
void report(){}
}
在上面的示例中,this關鍵字用於兩個地方:
this.employees.length;訪問Manager的當前例項的變數
this.report();呼叫Manager的當前例項的方法。
此關鍵字是可選的,這意味著如果使用上面的示例在不使用此關鍵字的情況下表現相同。但是,使用此關鍵字可能會使程式碼更易讀或易懂。
4、supper關鍵字
supper關鍵字用於子類訪問父類的變數和方法。例如:
public class Super { protected int num; protected void showNUmber(){ System.err.println("number="+num); } } public class sub extends Super{ void bar(){ super.num=10; super.showNUmber(); } }
在上面的例子中,sub類訪問父類成員變數number並呼叫其父類super的showNumber()方法。
使用this和super要注意的問題:
super呼叫父類中的其他構造方法時,呼叫時要放在建構函式的首行。this呼叫奔雷中的其他構造方法是,也要放在首行。
this。super不能用在static方法中
簡單解釋一下:
被static修飾的成員屬於類,不屬於單個這個類的某個物件,被所有物件共享。而this代表對本類物件的引用,指向本類物件;而super代表父類物件的引用,指向父類物件。所以,this和super是屬於物件範疇的東西,而靜態方法數屬於類範疇的東西。