1.1什麼是類和對象
類是模子,是不存在的,用來確定將會擁有的特徵(屬性)和行爲(方法)。
類的特點:
類是對象的類型;
是具有相同屬性和方法的一組對象的組合;
對象的屬性: 對象擁有的各種屬性,每個對象的每個屬性都擁有特定值。
對象的方法: 對象執行的操作。
類是抽象的概念,如手機
對象是具體實體,如小米
1.2 定義類
類的重要性:所有Java程序都以類class爲組織單元
定義一個類的步驟:
1.3如何使用Java中的對象
- 創建對象 : 類名 對象名 = new 類名()
- 使用對象 :引用對象的屬性和方法: 對象名.屬性 對象名.方法
1.4 成員變量和局部變量
|
|
作用域 |
初始值 |
其他 |
成員變量 |
類中定義,用來描述類有什麼 |
在整個類中都是可見的 |
Java會給成員變量一個初始值 |
不同方法中可以有同名的局部變量 |
局部變量 |
類的方法中定義,在方法中臨時保存數據 |
僅限於定義它的方法 |
Java不會給成員變量一個初始值 |
局部變量的優先級比同名的成員變量高 |
1.5 Java 中的構造方法
- 使用 new + 構造方法, 創建一個新的對象
- 構造的方法是定義在Java類中的一個用來初始化對象的方法
構造方法與類同名且沒有返回值
當沒有指定構造方法時,系統會自動添加無參的構造方法
當有指定構造方法時,即使只定義了有參的,系統也不會自動添加無參的構造方法
構造方法的重載: 方法名相同,但是參數不同的多個方法,調用時會根據不同的參數選擇相應的方法
構造方法不但可以給對象的屬性賦值,還可以保證給對象的屬性賦一個合理的值。
1.6 Java中static使用之靜態變量
Java中被static 修飾的成員稱爲靜態成員或 類成員,它屬於整個類所有,而不是某個對象所有,即被所有的對象所共享。
靜態成員可以使用類名直接訪問,也可以使用對象進行訪問。推薦用類名訪問
使用static 可以修飾變量,方法和代碼塊。
注意:靜態成員屬於整個類,當系統第一次使用該類時,就會爲其分配內存空間,直到該類被卸載纔會進行資源回收!
1.7 Java 中static 使用之靜態方法
與靜態變量一樣,我們也可以使用static修飾方法,稱爲靜態方法或類方法。
之前我們一直寫的main函數方法就是靜態方法。
public static void main ( String[] args) { }
注意:
- 靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員,可以在靜態方法中創建類的對象,通過對象來訪問非靜態變量;
- 在普通成員方法中,則可以直接訪問同類的靜態變量和非靜態變量;
- 靜態方法中不能直接調用非靜態方法,需要通過創建對象來訪問非靜態方法。
1.8 Java 中static 使用之靜態初始化塊
Java中可以通過初始化塊進行數據賦值:
public class Hello {
String name; //定義一個成員變量
// 通過初始化塊爲成員變量賦值
{
name = "愛慕課";
}
}
在類的聲明中,可以包含多個初始化塊。
當創建類的實例時,就會依次執行這些代碼塊。
如果使用 static 修飾初始化塊,就稱爲靜態初始化快。
注意: 靜態初始化塊只在類加載時執行,且只會執行一次,同時靜態初始化塊只能給靜態變量賦值,不能初始化普通的成員變量
運行結果:
通過輸出結果,我們可以看到,程序運行時靜態初始化塊最先被執行,然後執行普通初始化塊,最後才執行構造方法。由於靜態初始化塊只在類加載時執行一次,所以當再次創建對象
hello2 時並未執行靜態初始化塊。
面向對象的三大特性: 封裝,繼承,多態
封裝
2.1 什麼是Java中的封裝
概念: 將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。
好處:
- 只能通過規定的方法訪問數據
- 隱藏類的實例細節,方便修改和實現
封裝的實現步驟
- 修改屬性的可見性,設爲private
- 創建getter/setter 方法,用於屬性的讀寫
- 在 getter/setter方法中加入屬性控制語句,對屬性值的合法性進行判斷
2.2 使用包 管理Java中的類
包的作用:
管理Java文件,解決同名文件衝突
定義包: package 包名
注意:必須放在Java源程序中的第一行,包名之間可以用點號”.“隔開
系統中的包:
Java.(功能).(類)
java.lang.(類) 包含Java語言基礎的類
java.util.(類) 包含java語言中各種工具類
java.io.(類) 包含輸入輸出相關功能的類
包的使用:
使用 import 關鍵字在某個文件中使用其他文件夾中得類。
java中,包的命名規範是全小寫字母。
.* 可以把某個包下的所有文件加載進來。
2.3 Java 中訪問修飾符
訪問修飾符: 可以修飾屬性和方法的訪問範圍。
訪問修飾符 |
本類 |
同包 |
子類 |
其他 |
private |
√ |
|
|
|
默認 |
√ |
√ |
|
|
protected |
√ |
√ |
√ |
|
public |
√ |
√ |
√ |
√ |
2.4 Java 中的this關鍵字
this關鍵字代表當前的對象
this.屬性
this.方法
封裝對象的屬性時,經常會使用this關鍵字
2.5 Java中的內部類 Inner Class
內部類就是定義在另一個類裏面的類。
同理,包含內部類的類被稱爲外部類。
內部類的作用:
- 內部類提供了更好的封裝,可以把內部的類隱藏在外部類之內,不允許同一個包中的其他類訪問該類。
- 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據;
- 內部類所實現的功能,使用外部類同樣可以實現,只是有時使用內部累更方便
內部類有以下幾種:
/外部類HelloWorld
public class HelloWorld {
// 內部類Inner,類Inner在類HelloWorld的內部
public class Inner {
// 內部類的方法
public void show() {
System.out.println("welcome to imooc!");
}
}
public static void main(String[] args) {
// 創建外部類對象
HelloWorld hello = new HelloWorld();
// 創建內部類對象
Inner i = hello.new Inner();
// 調用內部類對象的方法
i.show();
}
}
繼承
3.1 Java中的繼承
概念: 繼承是類與類的一種” is a“ 的關係
父類,基類 ------- 子類,派生類
注意:Java中的繼承是單繼承的,只有一個父類。
繼承的好處:
子類擁有父類的所有屬性和方法,但 private修飾的除外;
實現代碼複用
語法規則:
class 子類 extends 父類 { }
3.2 Java中的方法重寫:
什麼事方法的重寫:
如果子類對繼承父類的方法不滿意,是可以重寫父類繼承方法的,當調用方法時會優先調用子類的方法。
語法規則: 返回類型,方法名,參數 都要和父類繼承方法相同纔可以。
3.3 Java中的繼承初始化順序
- 初始化父類,在初始化子類
- 同一個類中,先執行初始化對象中屬性,再執行構造方法中的初始化
也就是說: 父類屬性初始化 ==> 父類構造方法 ==> 子類對象屬性初始化 ==> 子類對象構造方法
3.4 Java中的fanal 關鍵字
final關鍵字作標識有”最終的“含義,也就是說不可修改,不可變化的。
- final 修飾類,則該類不允許被繼承
- final 修飾方法,則該方法不允許被覆蓋(重寫)
- final 修飾屬性,則該類的屬性不會進行隱性的初始化(類的初始化必須有值),或是在構造方法中賦值,必須二者選其一。 也就是說要麼在屬性的聲明時賦初始值,要麼在構造函數裏面賦值。
- final 修飾變量, 則該變量的值只能賦一次值,在聲明的時候初始化賦值,即變爲常量。
3.5 Java中的super 關鍵字
super 關鍵字在對象的內部使用,可以代表父類的對象。
子類的構造過程中,必須調用父類的構造方法。
程序隱式的在子類的構造函數裏的第一行添加父類的構造方法,如super();
如果子類構造方法中既沒有顯式的調用父類的構造方法,而父類又沒有無參的的構造方法,則編譯出錯。
3.6 Java中的Object類
Object 類是所有類的父類,也就是Java世界中的老總。
如果一個類沒有使用 extends 關鍵字明確標識繼承另外一個類,那麼這個類默認基本Object類。
Object類中的方法,適合所有的子類。
Object類 常用方法:
- toString() 方法,返回對象的哈希code碼(對象地址字符串);哈希碼是用來唯一區分對象的字符串。可以通過重寫toString() 方法表示出對象的屬性
- equals() 方法 ,比較的是對象引用的是否指向同一塊內存地址,可以通過重寫equals() 方法使其比較兩個對象的值是否一致。
new 類 : 得到的是 類的對象
對象調用 getClass() 方法 : 得到的是 類對象
多態
4.1 Java中的多態
多態: 對象的多種形態
注意: 繼承是多態實現的基礎。
1 引用多態
父類的引用可以指向本類的對象
父類的引用可以指向子類的對象 (注意:子類的引用不能指向父類的對象)
2 方法多態
創建本類的對象時,調用的方法是本類的方法
創建子類的對象時,調用的方法爲子類重寫的方法或繼承的方法
如果子類具有獨有的方法,不是從父類繼承來的,那就不能通過父類的引用來調用子類獨有的方法。
4.2 多態中的引用類型轉型
1 向上類型轉換(隱式/自動類型轉換),是小類型到大類型的轉換: 無風險
2 向下類型轉換(強制類型轉換),是大類型到小類型的轉換 : 有風險,可能溢出
可以運用運算符 instanceof 來解決引用對象的類型,避免類型轉換的安全性問題。
4.3 Java中的抽象類
語法定義: 抽象類前使用abstract 關鍵字修飾,則該類爲抽象類。
應用場景:
- 某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但是無法準確知道這些子類如何實現這些方法;(約束子類必須有哪些方法,但不約束其具體實現)
- 從多個具有相同特徵的類中抽象出一個抽象類,以這個抽象類作爲子類的模板,從而避免子類設計的隨意性。
作用: 限制規定子類必須實現某些方法,但不關注實現細節。
使用規則:
- abstract 定義抽象類
- abstract 定義抽象方法,只有聲明,不需要實現
- 包含抽象方法的類必須是抽象類
- 抽象類中可以包含普通的方法,也可以沒有抽象方法
- 抽象類不能直接創建,可以定義引用變量
抽象方法 沒有方法體則以分號結束。
4.4 Java中的接口
概念: 接口可以理解爲一種特殊的類,由全局變量和公共的抽象方法所組成。
如果說類是一種具體實現體,而接口定義了某一批類所需要遵循的規範,接口不需要關心這些類的內部數據,也不關心這些類裏方法的實現細節,它只規定這些類裏必須提供的某些方法。
和定義類不同,定義接口不再使用 class 關鍵字,而是使用interface 關鍵字
基本語法:
[修飾符] interface 接口名 [extends 父接口1, 父接口2 ... ]
{
零到多個常量定義 。。。
零到多個抽象方法定義。。。
}
注意:
interface 前一定有 abstract,自己沒顯式地添加時,系統也會自動添加
可以有多個父接口, 而Java類最多隻有一個父類。
接口定義
- 常量: 接口中的屬性是常量,即使定義時不添加 public static final 修飾符,系統也會自動加上;
- 方法: 接口中的方法只能是抽象方法,總是使用;即使定義時沒有添加 public abstract修飾符, 系統也會自動加上;
接口中方法不能有方法體,同時方法的訪問修飾符不能是 private 和 protected
使用接口:
一個類可以實現一個或多個接口,實現接口使用 implements 關鍵字。
Java中的一個類只能繼承一個父類,是不夠靈活的,通過實現多個接口可以做補充。
繼承父類實現接口的語法:
[修飾符] class 類名 extends 父類 implements 接口1, 接口2 ..
{
類體部分 ;
// 如果繼承了抽象類,需要實現繼承的抽象方法;
// 也要實現接口中的抽象方法
//如果要繼承父類,繼承父類必須在實現接口之前
}
通過接口可以描述兩個不同的類型之間相同的特徵。
使用接口:
接口類對象引用指向實現類的對象:
另外一種使用接口的方式:
接口在使用的過程當中,還經常與匿名內部類配合使用
匿名內部類就是沒有名字的內部類,多用於關注實現而不關注類的名稱
4.7 UML 簡介
Unified Modeing Language 統一建模語言/ 標準建模語言
是一個支持模型化和軟件系統開發的圖形化語言