Java面向物件的三大特性
Java面向物件的三大特性分別為:封裝、繼承、多型,下面我們一起來詳細瞭解一下!
1.封裝:
說得通俗一點,就是把細節隱藏起來,把該公開的公開,把該私有的私有。
那如何封裝一個類?
類中含屬性和方法, 屬性可有可無,並且應該設定為private.
方法可有可無,對外的方法的應該公開,對內的方法應該私有.
一個類的方法,大致有:
構造方法 -> 可以生成
存/取 屬性值的方法,也就是 getter/setter 屬性方法. -> 可以生成
業務方法,實現此類物件的真正業務功能,是程式設計師真正需要花心思考慮的。
針對類中的方法,有以下兩種封裝策略:
1).把存/取屬性方法、構造方法、業務方法全部封裝到同個類中。
2).把業務方法單獨獨立出來,形成一個業務類,這個類用來操作與它所相關的實體物件。它一般由介面與實現類組成.
實體(Entity)物件,就是指含業務屬性和屬性存/取 方法的物件.
如:封裝策略一:
public class Account {
private long id;
private String name;
private double balance;
private String pwd;
....
// getter/setter方法
// 構造方法
....
// 業務方法
public void withdraw(double money) {
if(balance < money) {
tln("餘額不足");
return ;
}
balance -= money;
}
public void deposit(double money) { }
}
//採用封裝策略二:
首先是實體類
public class Account {
private long id;
private String name;
private double balance;
private String pwd;
....
// getter/setter方法
// 構造方法
}
//再定義一個業務類,操作Account
public class AccountService {
// 業務方法
public void withdraw(Account a,double money) {
if(alance() < money) {
tln("餘額不足");
return ;
}
alance(alance - money);
}
public void deposit(Account a, double money) { }
}
注:此處在真實的場景中應該由介面與實現類組成。
2.繼承
關鍵字: extends
類繼承的語法:
public class 子類名 extends 父類名 {
//屬性定義
//方法定義
}
注:一個類A繼承了另一個類B,那麼類A中就繼承(得到)了類B中所有的非私有成員.
繼承的特點:
1).傳遞性,如果A繼承B,C又繼承A, 那麼C也繼承B。
2)是單繼承的。
JAVA中有一個頂級父類,就是ct 類如果一個類沒有繼承任何父類,那麼它將會自動繼承於Object類.
單繼承的特點,可以保證JAVA的整個類層次結構一顆“倒置樹”狀結構
如:
//父類
public class Super {
private String name;
//
//..
}
// 子類
public class Sub extends Super {
//...
}
繼承所產生的幾個概念:
父類,也叫超類,或叫 基類。
子類,也叫派生類。
何時使用繼承?
當兩個類之間具備“ IS A "的關係時,才應該採用繼承關係. 否則,不要濫用繼承.
如:
Apple IS A Fruiut
Cat is a Animal
...
繼承是一種程式碼複用技術,但是提出這個“IS A”的參考要求是為了更好地“限制”繼承,因為,程式碼複用技術除了繼承外,還有其它的設計思想,比如 組合/聚合設計思想.
-- ----------------------------------------------------------
物件建立的過程:
a).分配空間
b).賦初始值
c).呼叫構造方法
如果有了父類,則應該是:
第一步:遞迴地按以上三步建立 父類物件.
## ############################################
建立子類物件時,一定會遞迴地建立父類物件
## ############################################
super關鍵字:
作用:
a).在構造方法中使用,呼叫父類構造方法,必需放在第一條語句
b).當子類的屬性與父類屬性同名時,並且父類的屬性不是private的這種情況下,在子類中,存在2個同名的屬性,那麼子類的屬性會掩蓋(shadow)掉父類的同名屬性,這時,可以通過super.屬性名來區別。
-- -------------------------------------------------------
有了繼承關係,父類型別的引用可以指向任意的子類物件。
編譯時型別
就是指變數在編譯時的型別,也就是申明變數時它的型別
執行時型別
就是指程式碼執行時變數的`真正型別,也就是new操作符後面所跟的物件型別.
如:
Animal c2;
c2 = new Cat(); //可以指向 Cat的例項
Object c3 = new Cat(); //Object型別的引用可以指向任意物件。
hMouse(); // error, 此處不能呼叫此方法。
所以,Object型別可以成為任意物件的編譯時型別.
但是,編譯時型別只能看到編譯時型別所擁有的成員.[這就是為什麼hMouse() 會報錯,因為c3的編譯時型別是Object,並沒有catchMouse()方法]
-- ------------------------------------------------------
共性與個性
共性儘可能寫在父類之中,這樣所有子類都可以共享.
個性儘可能寫在子類之中,每種子類都具備不同的個性.
-- ------------------------------------------------------
instanceof 操作符
作用:用來判斷一個物件是否屬於某個型別
語法:
變數名 instanceof 型別
以上表達式返回的是 boolean型別.
當instanceof後面的型別是變數的執行時型別或可以是做為它編譯時型別的型別時,返回true.
如:
Animal a = new Dog();
if(a instanceof Dog) { //成立
...
}
if(a instanceof Animal){ //成立
...
}
if(a instanceof Cat){ //不成立
...
}
3.多型.
具備同一種編譯時型別的物件引用,呼叫同一個方法,而在執行時具備不同的形為. 這就是多型.
多型的條件
1).要有繼承關係
2).要有方法重寫(override)
方法的組成部份:
修飾符 返回型別 方法名([引數列表]) 丟擲異常 { }
方法重寫的條件
a).修飾符要一樣,或者子類方法的修飾符要比父類寬
b).返回型別一致,或者子類方法的返回型別是父類方法返回型別的子類。
c).方法名一樣
d).引數列表要一模一樣。
e).丟擲的異常只能比父類要小。
-- ------------------------------------------------------
多型的應用
面向父類程式設計,這是一種程式設計思想,具體在程式碼上可以有如下三種體現:
a).物件的編譯時型別儘可能地寫 父類型別
如:Animal c = new Cat();
b).方法的引數儘可能寫父類
試想,如果要寫義一個功能,這個功能儘可以用小貓做引數,也可以用小狗做引數,則:
public void m(Cat c) { (); }
public void m(Dog c) { (); }
即然Cat類和Dog類有共同的父類,為什麼不考慮如下的方式:
public void m(Animal a) { (); } //顯然,此方法更好,可以有效地減少方法的過載。
c).方法返回型別儘可能地寫 父類.
如:
public Animal createAnimal() { .... } //這樣的好處是這個方法有更多的可選擇性,也就是並不只是返回一種型別。
增強for迴圈,只能用迴圈迭代陣列和集合. 它是JDK5.0後才有的.
語法:
for(型別 變數名 : 陣列或集合物件) {
//程式碼
}
注:型別 指的是陣列元素的型別或集合元素的型別.
-- -----------------------------------------------------
toString方法
列印一個物件時,會自動呼叫該物件的 toString方法。因為toString()方法是 Object類中的方法,所以,每個物件都有toString()方法。但是,Object的toString方法的預設實現只是返回物件的”記憶體地址“,所以,如果你想要輸出你自己定義的物件字串格式,請 重寫 toString方法.
-- --------------------------------------------------------
練習:
設計一個形狀類Shape, 沒有任何的屬性。
含如下方法:
public double area() { return 0.0;}
public double girth() { return 0.0; }
再寫一個子類:圓形(Circle) 繼承於 形狀類.自行設計屬性,並重寫父類的 area和girth方法.
靜態[static]與常量[final]
靜態域與靜態方法,關鍵字:static
ic用來修飾屬性(成員變數)
static修飾的屬性叫靜態屬性,也稱為 類變數.
語法:
訪問控制修飾符 static 變數型別 變數名 [=初始值];
我們知道,普通屬性是物件所擁有的,而類變數(靜態屬性)則是類所擁有的,是所有物件所共享的。
ic用來修飾方法(成員方法)
就是在方法的修飾符中加入 static關鍵字,這個方法就成為了靜態方法。
靜態方法的特點:
a).靜態方法無需建立物件來呼叫。直接通過類名.方法名 來呼叫.
b).靜態方法中不能直接訪問非靜態成員,只能建立物件來訪問非靜態成員
c).在靜態方法中不能使用this關鍵字.
-- 再次回顧物件建立的過程
-- 以下三步,都是在類載入時被呼叫,並且只會被執行一次.
a).分配靜態屬性的空間
b).給靜態屬性賦初始值
c).如果靜態程式碼塊的話,則呼叫靜態程式碼塊.
-- 以下四步,都是在建立物件時被呼叫,並且每建立一個物件就執行一次
c).分配非靜態屬性的空間
d).給非靜態屬性賦初始值
e).如果有程式碼塊的話,先呼叫程式碼塊
f).呼叫構造方法
ic 用來修飾程式碼塊.
注:靜態程式碼塊在類載入時只被執行一次。它的這個特性,我們可以利用靜態程式碼做一些特殊的事情
a).載入本地/遠端的大檔案到記憶體中。
b).獲取資料庫連線池
總之一句話,就是需要費時費力,而且需要長駐記憶體的資源,這種情況,可以考慮採用靜態程式碼塊來負頁載入。
-
Java中如何獲取Spring中配置的bean
Spring是一個分層的JavaSE/EEfull-stack(一站式)輕量級開源框架。在Java中如何獲取Spring中配置的'bean?下面本站小編帶大家一起來看看詳細操作,希望對大家有所幫助!想了解更多相關資訊請持續關注我們應屆畢業生考試網!一、什麼是Spring?Spring是一個輕量級的控...
-
全國計算機等級《二級JAVA》命題預測試卷
以下是本站小編帶來的全國計算機等級《二級JAVA》命題預測試卷,歡迎學習!更多內容請關注應屆畢業生考試網!1、軟體生命週期是指()。A.軟體產品從提出、實現、使用維護到停止使用退役的過程B.軟體從需求分析、設計、實現到測試完成的過程,C.軟體的開發過程D.軟體...
-
Java語法基礎for語句練習
本文是本站小編搜尋整理的關於Java語法基礎for語句練習,供參考學習,希望對大家有所幫助!想了解更多相關資訊請持續關注我們應屆畢業生考試網!控制語句——for練習語句的巢狀應用累加求和,計數器迴圈巢狀一、語句的巢狀應用語句巢狀形式。其實就是語句中...
-
計算機二級JAVA考試構建JAVA程式2017
很多人一見到說要程式設計就以為很難,其實只有一點一滴學知識點也不難,下面是小編整理的計算機二級JAVA考試構建JAVA程式介紹,歡迎閱讀!第一個javaapplicationjava程式分為javaapplication(java應用程式)和javaapplet(java小應用程式)兩種。下面讓我們編寫一個java應...