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 Class文件是什麼
Class類是在Java語言中定義一個特定類的實現。一個類的定義包含成員變量,成員方法,還有這個類實現的接口,以及這個類的父類。Class類的對象用於表示當前運行的Java應用程序中的類和接口。比如:每個數組均屬於一個Class類對象,所有具有相同元素類型和維數的數組共享...
-
編寫更好的Java單元測試的7個技巧
測試是開發的一個非常重要的方面,可以在很大程度上決定一個應用程序的命運。良好的測試可以在早期捕獲導致應用程序崩潰的問題,但較差的測試往往總是導致故障和停機。雖然有三種主要類型的軟件測試:單元測試,功能測試和集成測試,但是在這篇博文中,我們將討論開發人員...
-
Java多線程知識點
引導語;多線程是指從軟件或者硬件上實現多個線程併發執行的技術。以下是本站小編分享給大家的Java多線程知識點,歡迎閲讀!1.1多線程的概念多線程編程的含義是你可將程序任務分成幾個並行的子任務。特別是在網絡編程中,你會發現很多功能是可以併發執行的。比如網...
-
Java中嵌入式MySQL的使用方法介紹
這篇文件主要介紹在Java中嵌入式MySQL的使用,對於一些的應用項目,提供安裝版的Mysql,Oracle是必須的工作。但是有時候如果是一個小的工具,可安裝或者移植性比較強的小軟件。再去安裝數據庫可能就比較麻煩了。其實MySQL也有嵌入式的,不需要安裝,在使用的過程中,會自動...