類和對象
- 對象的概念
- 什么是面向對象
- 類
- 什么是對象的屬性
- 什么是對象的方法
- 類與對象的關系/與區別
什么是對象
萬物皆對象, 客觀存在的事物皆為對象
什么是類
類是模子, 確定對象將會擁有的特征(屬性)和行為(方法)
類的特點:
類是對象的類型
具有相同的屬性和方法的一組對象的集合
其實類在客觀世界里是不存在的, 只是用來描述對象信息
什么是對象的屬性
屬性--對象具有的各種特征
每個對象的每個屬性都擁有特定的值
類和對象的關系
類是抽象的概念, 僅僅是模板, 比如說 : "手機";
對象是一個能看得到, 摸得著的具體實物
定義類
1.類的重要性 : 所有Java程序都以類class為組織單元
2.什么是類?
類是模子, 確定對象將會擁有的特征(屬性)和行為(方法)
3.類的組成 : 屬性和方法
4.定義一個類的步驟 :
a. 定義類名
b. 編寫類的屬性
c. 編寫類的方法
Java對象
使用對象的步驟 :
1. 創建對象 :
類名 對象名 = new 類名();
Telephone phone = new Telephone();
ps: 類是以代碼的形式保存在文件中, 當把文件信息放到內存中, 此時,這些信息的集合就叫對象, 這個過程叫做實例化.
2. 使用對象
引用對象啊的屬性 : 對象名.屬性
phone.screen = 5; // 賦值
引用對象的方法 : 對象名 . 方法名();
phone.send(); // 調用send方法
成員變量和局部變量
1.成員變量
在類中定義, 用來描述對象將要有什么
成員變量可以被本類的所有方法使用, 也可以被與本類有關系的其他方法使用
2.局部變量
在類的方法中定義, 在方法中臨時保存數據
只能在本方法中使用
區別 :
1.作用域不同
局部變量的作用域僅限于定義它的方法
成員變量的作用域在整個類的內部都是可見的
2.初始值不同
Java會給成員變量一個初始值
Java不會給局部變量賦予初始值
3.在同一個方法中不允許有同名局部變量
在不同的方法中, 可以有同名局部變量
4.兩類變量同名時, 局部變量具有更高的優先級
構造方法
1.使用new + 構造方法 創建一個新的對象
2.構造方法是定義在Java類中的一個用來初始化對象的方法
構造方法的類名同名且沒有返回值
3.語法格式
public 構造方法名() {
// 初始化代碼
}
無參構造方法 : 當沒有指定構造方法時, 系統會自動添加無參的構造方法
有參構造方法 : 為了初始化成員變量的值, 當有指定構造方法, 無論是有參, 無參的構造方法, 都不會自動添加無參構造方法
構造方法的重載 : 方法名相同, 但參數不同的多個方法, 調用時會自動根據不同的參數選擇相應的方法
構造方法不但可以給對象的屬性賦值, 還可以保證給對象的屬性賦一個合理的值
Java中的static使用之----靜態變量
Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。
靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。當然,鑒于他作用的特殊性更推薦用類名訪問~~
static 可以修飾變量、方法和代碼塊
PS : 靜態成員屬于整個類,當系統第一次使用該類時,就會為其分配內存空間直到該類被卸載才會進行資源回收!~~
Java中的static使用之----靜態方法
1.靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。
如果希望在靜態方法中調用非靜態變量,可以通過創建類的對象,然后通過對象來訪問非靜態變量。
2.在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量
3.靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。
Java中的static使用之----初始化塊
Java 中可以通過初始化塊進行數據賦值
在類的聲明中,可以包含多個初始化塊,當創建類的實例時,就會依次執行這些代碼塊。如果使用 static 修飾初始化塊,就稱為靜態初始化塊
PS : 靜態初始化塊只在類加載時執行,且只會執行一次,同時靜態初始化塊只能給靜態變量賦值,不能初始化普通的成員變量。
程序運行時靜態初始化塊最先被執行,然后執行普通初始化塊,最后才執行構造方法。由于靜態初始化塊只在類加載時執行一次
面向對象特性
- 封裝
- 繼承
- 多肽
封裝
1.概念 :
將類的某些信息隱藏在類內部, 不允許外部程序直接訪問, 而是通過該類提供的方法來實現對隱藏信息的操作和訪問
2.好處 :
a.只能通過規定的方法訪問數據
b.隱藏類的實例細節, 方便修改和實現
3.封裝的實現步驟 :
第一步, 修改屬性的可見性---設為private
第二步, 創建getter/setter方法---用于屬性讀寫
第三步, 在getter/setter方法中加入屬性控制語句---對屬性值的合法性進行判斷
Java中的包
1. 包的作用:
管理Java文件
解決同名文件沖突
2. 定義包 : package 包名
注 : 必須放在Java源程序的第一行
包名可以用"."號隔開
3. 系統中的包
java.(功能).(類)
java.lang.(類) 包含java語言基礎的類
java.util.(類) 包含java語言中各種工具類
java.io.(類) 包含輸入,輸出相關功能
4. 包的使用
(1),可以通過import關鍵字, 在某個文件使用其他文件中的類.
(2),Java中, 包的命名規范全是小寫字母拼寫
(3),使用的時候不但可以加載某個包下的所有文件, 也可以加載某個具體子包下的所有文件
Java中的訪問修飾符
訪問修飾符 --- 可以修飾屬性和方法的訪問范圍
訪問修飾符 本類 同包 子類 其他
private √
默認 √ √
protected √ √ √
public √ √ √ √
Java中的this關鍵字
1. this關鍵字代表當前對象
this.屬性 操作當前對象的屬性
this.方法 調用當前對象的方法
2. 封裝對象的屬性的時候, 經常會使用this關鍵字
Java中的內部類
1. 概念 :
內部類( Inner Class )就是定義在另外一個類里面的類。與之對應,包含內部類的類被稱為外部類
2. 作用 :
1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
2. 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據
3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便
3. 種類 :
成員內部類
靜態內部類
方法內部類
匿名內部類
PS :
1.外部類是不能直接使用內部類的成員和方法的
可先創建內部類的對象,然后通過內部類的對象來訪問其成員變量和方法。
2.如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法
如果要訪問外部類的成員變量,可以使用 this 關鍵字。
Java 中的靜態內部類
靜態內部類是 static 修飾的內部類,這種內部類的特點是:
1.靜態內部類不能直接訪問外部類的非靜態成員,但可以通過new 外部類().成員的方式訪問
2.如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;
如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員
3.創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類 對象名= new 內部類();
Java 中的方法內部類
方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
ps : 由于方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。
繼承
1. 繼承的概念 :
繼承是類與類的一種關系, 是一種"is a"的關系
ps : Java中的繼承是單繼承
2. 繼承的好處 :
1.子類擁有父類所有的屬性和方法
ps : 屬性和方法的修飾符不能是"private"
2.實現代碼復用
3. 語法規則 :
class 子類 extends 父類
方法重寫
1. 什么是方法重寫?
如果子類對繼承父類的方法不滿意, 是可以重寫父類繼承的方法的, 當調用方法時會優先調用子類的方法
2. 語法規則 :
a. 返回值類型
b. 方法名
c. 參數類型及個數
都要與父類繼承的方法相同, 才叫方法重寫
繼承的初始化順序
1. 初始化父類, 再初始化子類
2. 先執行初始化對象中屬性, 再執行構造方法中的初始化
eg : 父類對象 ---> 屬性初始化 ---> 構造方法 ---> 子類對象 ---> 屬性初始化 ---> 構造方法
final的使用
final關鍵字
使用final關鍵字做標識有"最終的"含義
final可以修飾類, 方法, 屬性和變量
final修飾類, 則該類不允許被繼承
final修飾方法, 則該方法不允許被覆蓋(重寫)
final修飾屬性
則該類的屬性不會進行隱式的初始化(類的初始化屬性必須有值)
或者在構造方法中賦值(但只能選其一)
final修飾變量, 則該變量的值只能賦一次值, 即為常量
super關鍵字
super關鍵字 : 在對象的內部使用, 可以代表父類對象
1. 訪問父類的屬性
super.父類屬性;
2. 訪問父類方法
super.父類方法()
ps : 子類的構造過程當中必須調用其父類的構造方法
如果子類構造方法中沒有顯式調用父類的構造方法, 則系統默認調用父類無參構造方法
如果顯式的調用構造方法, 必須在子類的構造方法的第一行
如果子類構造方法中既沒有顯式調用父類的構造方法, 而父類又沒有無參構造方法, 則編譯出錯
Object類
1. toString()方法
在Object類里面定義toString()方法的時候,返回的對象的哈希code碼(對象地址字符串)
可以通過重寫toString() 方法表示出對象的屬性
2. equals()方法
比較的是對象的引用是否是指向同一塊內存地址
多肽
概念 :
對象的多種形態
1. 引用多肽
父類的引用可以指向本類的對象
父類的引用可以指向子類的對象
(子類的引用不可以指向父類)
ps : 繼承是多肽的實現基礎
2. 方法多肽
創建本類對象時, 調用的方法為本類的方法
創建子類對象時, 調用的方法為子類重寫的方法或者繼承的方法
引用類型轉換
1. 向上類型轉換(隱式/自動類型轉換), 是小類型到大類型的轉換
2. 向下類型轉換(強制類型轉換), 是大類型到小類型
ps : 向上類型轉換(無風險), 向下類型轉換(有風險)
3. instanceof運算符, 來解決引用對象的類型, 避免類型轉換的安全性問題
抽象類
1. 語法定義 :
抽象類前使用abstract關鍵字修飾, 則該類為抽象類
2. 應用場景 :
a.在某些情況下, 某個父類只是知道其子類應該包含怎樣的方法, 但無法準確知道這些子類如何實現這些方法
也就是說抽象類是約束子類必須有哪些方法, 而并不關注子類是如何實現的
b.從多個具有相同特征的類中抽象出一個抽象類, 以這個抽象類作為子類的模板, 從而避免了子類設計的隨意性
3. 作用 :
限制規定子類必須實現某些方法, 但不關注實現細節
4. 使用規則 :
a. abstract定義抽象類
b. abstract定義抽象方法, 只有聲明, 不需要實現
c. 包含抽象方法的類是抽象類
d. 抽象類中可以包含普通方法, 也可以沒有抽象方法
e. 抽象類不能直接創建, 可以定義引用變量
接口
1. 接口概念 : (是一種規范, 是用來約束類的)
接口可以理解為一種特殊的類, 由全局常量和公共的抽象方法所組成
類是一種具體的實現體, 而接口定義了某一批類所需要遵守的規范, 接口不關心這些類的內部數據,
也不關心這些類里方法的實現細節, 它只規定這些類里必須提供某些方法
2. 接口定義
和類定義不同, 定義接口不再使用class關鍵字, 而是使用interface關鍵字
接口定義的基本語法 :
[修飾符] (abstract 此關鍵字肯定有, 如果沒有,系統會默認加上) interface 接口名 [extends 父接口1, 父接口2...]
{
零到多個常量定義...
零到多個抽象方法的定義...
}
接口就是用來被繼承, 被實現的, 修飾符一般建議用public
ps : 不能使用private和protected修飾接口
3. 常量 :
接口中的屬性是常量, 即使定義時不添加 public static final 修飾符, 系統也會自動加上
4. 方法 :
接口中的方法只能是抽象方法, 即使定義時不添加public abstract 修飾符, 系統也會自動加上
5. 使用接口 :
一個類可以實現一個或者多個接口, 實現接口可以使用implements關鍵字. Java中的一個類只能繼承一個父類,
是不夠靈活的, 通過實現過個接口可以做補充
繼承父類實現接口的語法為 :
[修飾符] class 類名 extends 父類 implements 接口1, 接口2...
{
類體部分 // 如果繼承了抽象類, 需要實現繼承的抽象方法; 要實現接口中的抽象方法
}
如果要繼承父類, 繼承父類必須在實現接口之前
使用接口 :
接口在使用過程當中, 還經常與匿名內部類配合使用
匿名內部類就是沒有名字的內部類
多用于關注實現而不關注實現類的名稱
語法格式 :
Interface i = new Interface(){
public void method(){
...
}
}