封裝:隐藏,封裝資料實體
要求:
1. 屬性是私有的(在其他類中不可見)
2. 提供一套get/set的公用方法
3. 根據需要可以在方法中添加其他邏輯
Java中的特殊函數:
1. 構造函數:用于建立對象,和初始化對象資料
特點:
1) 函數名必須和類名一緻
2) 構造函數沒有傳回值,連void都不能有
3) 構造函數可以有0個或多個,多個構造函數參數清單必須不同
4) 構造函數必須跟着new關鍵字一起使用
new 關鍵字在計算機中用于開辟空間
public Users(){} :預設構造函數,如果在,類中沒有顯式的定義任何構造函數,那麼計算機會在建立對象時,隐式的添加預設構造函數,但是如果類中顯式的定義了構造函數,那麼計算機就不會隐式建立預設構造函數。
建議:一般的實體類至少有2個構造函數(預設和全體初始化)
2.toString 函數:用于在輸出對象時的資料字元串格式
在程式中列印輸出對象時,計算機會隐式的去調用對象的toString方法
2. 靜态函數:使用static修飾的函數,可以直接使用類名調用(放在靜态域裡面,普通函數放在堆棧裡面的)
文法:類名.函數名();
靜态函數一般放在工具類
單例模式:讓一個類隻能建立一個對象
設計模式:設計經驗,是一套固定的設計代碼經驗
步驟:
1)讓構造函數私有
2)提供static 修飾的函數傳回一個對象
固定模式:
public class OOTest {
private OOTest(){}
//餓模式
private static OOTest oo= new OOTest();
publicstatic OOTest getOO(){
returnoo;
}
//懶模式
private static OOTest oo = null;
public static OOTest getOO(){
if(oo == null){
oo = new OOTest();
}
returnoo;
}
}
Exception in thread "main" java.lang.NullPointerException
atcom.mantou.test_2016_11_22.Work.check(Work.java:70)
atcom.mantou.test_2016_11_22.Work.login(Work.java:30)
atcom.mantou.test_2016_11_22.Work.map(Work.java:17)
atcom.mantou.test_2016_11_22.Test_main.main(Test_main.java:7)
以上報錯,表示空指針異常,
面向對象-----繼承,提高代碼的重用性
父類(基類) 子類(派生類)
子類通過extends關鍵字繼承父類所有非私有的屬性和方法
文法:
Public class 類名 extends 類名{
}
Java隻允許單個繼承
重載: (所有類中都可以使用)
相同方法名不同參數清單的方法。 (重載隻和參數清單有關系和傳回值沒有關系)Eg:構造函數
重寫(也稱覆寫):(必須存在繼承關系,而且隻能在子類中重寫父類的函數)
相同方法(傳回值類型,參數清單,方法名都相同)不同實作(方法體)
所有的類都預設隐式繼承Object類
如果子類重寫父類函數,那麼在調用時計算機會先在子類查找,如果存在就直接使用子類函數,如果不存在就使用父類函數。
建議:在子類重寫父類函數的時候,建議使用Override 注解驗證。
this表示目前類對象,super表示對父類的引用
抽象類:有抽象方法類一定是抽象類,但是抽象類不一定有抽象方法
繼承抽象類的子類必須重新父類的所有抽象方法
使用Abstract 修飾的類:
Public abstract class 類名{}
抽象方法:
修飾符abstract 傳回值類型 函數名(參數清單){}
接口:特殊的抽象類,在1.7以前的接口中的屬性和函數都是抽象的
接口中的屬性必須定義為 public static final 資料類型 變量名 = 值 ;
屬性名必須全部大寫!
final 用于修飾常量,常量隻能初始指派一次,其他地方不能重新指派
定義接口文法:
Public interface 接口名{}
接口中的函數預設就是 abstract 的,可以省略不寫
Java是單繼承的,但是可以實作多個接口
實作接口的文法:(可以不用繼承父類,直接實作接口)
public class 子類名 extends 父類名 implements 接口1,接口2…{}
使用建議:先定義接口(規則),多個接口的公用部分使用抽象類
繼承中構造函數執行順序:沒有父親那來兒子,
建立子類對象時,java會隐式執行父類的構造函數
super():表示調用父類構造函數,在子類中計算機預設調用父類無參構造函數
多态:相同方法不同實作(重寫的具體使用)
Java 中展現了多态性:重寫
實作多态的思想:父類的引用指向子類的執行個體,接口引用指向接口實作類執行個體
eg: People peo = new Student();
沒有繼承,就沒有多态
父類引用隻能調用父類存在的函數,在運作時java或先去子類中查找是否存在重寫的方法,如果存在就直接調用子類函數,如果不存在才調用父類函數
父類引用不能調用子類特有的函數,如果想要調用隻能通過向下轉型,讓子類引用調用自己的函數,注意在強制轉換類型前都必須進行類型判斷
public void job(People peo) {
peo.show();
if(peo instanceof Student){
((Student)peo).play();
}else if (peo instanceof Teacher){
((Teacher)peo).play();
}
}
判斷文法:
(); 執行個體 instanceof 類型 :判斷執行個體指向的資料類型是否屬于指導類型
向上轉換是自動轉 :People peo = new Student();
向下轉型必須強制轉換 : Student stu = (Student)peo
Student stu = new Student();
在堆中開辟空間生成Student對象,記憶體自動生成一個辨別位址,将位址指派給棧中的stu變量
”==”是比較棧中的值相等
Equals 比較的是堆得值相等
面向對象程式設計是Java裡面的大頭, 封裝,繼承,多态等對面向對象程式設計起到了很大的幫助。 封裝簡單的說就是講屬性元素通過get 和set方法封裝起來,隻能通過get,set方法調用,這樣增加了代碼的安全性。 其中還有單例模式, 也就是讓一個類隻能建立一個對象,這種模式有效地增強了代碼的安全性。
然後就是繼承,java裡面隻能實作 單繼承。 java裡面可以實作多接口。 說白了,繼承可以有效地減少代碼重用性!! 繼承裡面還包括抽象類的繼承,重寫等知識點。
然後就是多态了,簡單的說,沒有繼承就沒有多态。多态是實作重寫的一種。