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