一、面向對象 Java中的面向對象與C 的面向對象,本質都是一樣。所以對於學過C 的同學理解Java中面向對象的概念就比較輕鬆。 對象 定義: 萬物皆對象,客觀存在的事物都稱為 對象 。 1、面向對象 類 定義: 類是模具,確定對象將會擁有的特性(屬性)和行為(方法) 特點: A.類是對象的類型 B ...
一、面向對象
- Java中的面向對象與C#的面向對象,本質都是一樣。所以對於學過C#的同學理解Java中面向對象的概念就比較輕鬆。
對象
- 定義: 萬物皆對象,客觀存在的事物都稱為對象。
1、面向對象
- 類
- 定義: 類是模具,確定對象將會擁有的特性(屬性)和行為(方法)
- 特點:
- A.類是對象的類型
- B.具有相同屬性和方法的一組對象的集合
- 屬性
- 定義: 有什麼就是這個屬性
- 方法
- 定義: 能幹什麼(對象操作的執行)
2、Java中如何定義類
- 1.所有Java程式中都以類(class)為組織單元
- 2.類有屬性、方法
- 3.如何定義類:
graph LR
如何定義類-->定義類名
如何定義類-->編寫類的屬性
如何定義類-->編寫類的方法
3、如何創建Java對象
類名 對象名=new 類名();
4、Java中成員變數與局部變數
- 成員變數
- 在類中定義,用來描述對象將要有什麼,整個類內部都可以看到
- 局部變數
- 在類的方法中定義,在方法中臨時保存數據
- 區別
- 1.作用域不同
- 2.成員變數會預設給一個初始值,不會給局部變數初始值。C#也是如此
- 3.在同一個方法中,不允許有同名局部變數,在不同方法中,可以有同名局部變數
4.兩類變數同名時,局部變數優先調用。C#也是如此
5、構造方法
- 1.使用new + 構造方法 創建一個新的對象
- 2.構造方法是定義在Java類中的一個用來初始化對象的方法
- 3.構造方法與類名相同且沒有返回值
- 4.無參構造方法,如果我們沒有指定,系統會自動生成無參構造方法
- 5.有參構造方法,當我們指定有參構造方法,系統就不會自動生成無參構造方法
- 6.構造方法的重載,方法名相同,但是參數不同的多個方法,系統調用時候根據參數去調用
- 7.構造方法不但可以給對象的屬性賦值,還可以保證給對象屬性賦一個合理的值。(就是加判斷條件)
6、靜態變數(static)
- 我們可以基於一個類創建多個該類的對象,每個對象都擁有自己的成員,互相獨立,然而在某些時候,我們更希望該類的所有對象共用一個成員。這時候需要靜態變數
- 使用static修飾的成員稱為靜態成員或者類成員,它屬於整個類所有,而不是某個對象所有,即被雷的所有對象共用
- 靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。推薦使用類名訪問
靜態成員屬於整個類,當系統第一次使用該類時,就會分配記憶體空間直到類被卸載才進行資源回收
7、靜態方法
- 與靜態變數一樣,我們也可以使用static修飾方法,稱為靜態方法或類方法
- 1.靜態方法中可以直接調用類中的靜態成員,但不能調用非靜態成員
- 2.若希望在靜態方法中調用非靜態變數,可以通過創建類的對象,然後通過對象來訪問非靜態變數
3.在普通方法中,則可以直接訪問同類的非靜態變數和靜態變數
8、靜態初始化塊
- 靜態初始化只在類載入時執行,且只會執行一次,同時靜態初始化只能給靜態變數賦值,不能初始化普通變數
- Java中有靜態初始化塊,但是在C#中沒有對應的概念
- Java初始化塊是不能接收任何參數的,定義的靜態變數可以通過初始化塊進行初始化
好處在於:提高初始化塊的復用,提高整個應用的可維護性
二、封裝
1.封裝
- 定義:將類的某些信息隱藏在類的內部,不允許外部程式直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問
- 好處:
- 1.只能通過規定的方法訪問數據
- 2.隱藏類的實例細節,方便修改和實現
- 步驟:
- 1.修改屬性的可見性(private修飾)
- 2.創建getter/setter方法(用於屬性的寫讀)
3.在getter/setter方法中加入屬性控制語句
2.使用包管理Java中類
- 包的作用:1.管理Java文件。2.解決同名文件衝突
- 定義包:package包名:包名間可以使用"."號隔開
- 可以通過import關鍵字,在某個文件中使用其它文件中的類
Java中,包的命名規則是全小寫字母拼寫
3.Java訪問修飾符
修飾符 | 本類 | 同包 | 子類 | 其他 |
---|---|---|---|---|
private | Y | N | N | N |
預設 | Y | Y | N | N |
protected | Y | Y | Y | N |
public | Y | Y | Y | Y |
4.Java中this關鍵字
- this關鍵字代表當前對象
封裝對象屬性
5.Java中內部類,C#也可以定義內部類
- 就是定義在另一個類裡面的類,與之對應,包含內部類的類被稱為外部類
- 作用:
- 1.可以提供了更好的封裝,可以把內部類隱藏在外部之內,不允許同一個包中的其他類訪問
- 2.內部類可以直接訪問外部類的所有數據,包含私有數據
- 內部類的劃分:
- 1.成員內部類
- 2.靜態內部類
- 3.方法內部類
- 4.匿名內部類
- 註意點:
外部類不能訪問內部類中的成員方法,如果外部類和內部類具有相同的成員變數或方法,內部類預設訪問自己的成員變數或方法。如果要訪問外部類成員則要加this
6.Java中靜態內部類
1.靜態內部類不能直接訪問外部類的非靜態成員,但可以通過
new 外部類().成員變數
- 2.如果外部類的靜態成員與內部類的成員名稱相同,可通過
類名.靜態成員
- 3.創建靜態內部類的對象時,不需要外部類的對象,可以通過直接創建
內部類 對象名=new 內部類();
7.Java方法內部類,C#不允許
方法內部類就是內部類定義在外部方法中,方法內部類只在該方法中內部可見,不能使用修飾符及static
三、繼承
1.繼承
- 繼承是類與類的一種關係,是一種"is a"的關係。父類 基類 | 子類 派生類
- Java中的繼承是單繼承,C#也是單繼承
語法規則:
class 子類 extends 父類
2.方法的重寫
- 如果子類對於繼承父類的方法不滿意,是可以重寫父類繼承的方法的,當調用方法時會優先調用子類的方法
- C#中方法重寫是用override關鍵字表示,Java中是在方法上註解的方式@Override
- 語法規則:
- 1.返回值類型
- 2.方法名
- 3.參數類型及個數
都要與父類繼承的方法相同,才叫方法的重寫
3.Java繼承初始化順序
- 初始化相當於執行類的構造方法
- 1.初始化父類再初始化子類對象
2.先執行初始化對象中的屬性,再執行構造方法中的初始化
public class Person {
private int age = 10;
Person() {
age = 20;
}
public static void main(String[] args) {
System.out.println(new Person().age);//20
}
}
4.final關鍵字
- 使用final關鍵做標識有"最終的"含義
- final可以修飾類、方法、屬性、變數
- final修飾類,則該類不允許被繼承。類似C#.sealed
- final修飾方法,則該方法不允許被覆蓋
- final修飾屬性,則該類的屬性不會進行隱式初始化,或在構造方法中賦值(兩者選其一)
final修飾變數,則該變數的值只能賦值一次,稱為常量
5.super關鍵字
- 在對象內部使用,可以代表父類對象
- 1.訪問父類的屬性
- 2.訪問父類的方法
- 使用場景
- 1.子類的構造的過程必須調用其父類的構造方法
2.隱式程式預設調用無參構造方法
6.Object類
- Object是所有類的父類,如果一個類沒有使用extends關鍵字明確標識繼承另一個類,那麼這個類預設繼承Object類
- 1.toString()方法
- 在Object類中定義的toString()方法時返回的對象的哈希code碼。即地址
- 2.equals()方法
- 比較的是對象的引用是否執行同一個快記憶體地址
- 類對象與類的對象的區別
- 類對象是類對象的類型getclass();
類的對象是關註的數據信息
四、多態
1.多態(對象的多種形態)
- 1.引用多態
父類的引用可以指向本類對象
Animal obj=new Animal();
- 父類的引用可以指向子類對象(里氏替換原則)
Animal obj=new Dog();
- 2.方法多態
- 1.創建本類對象時,調用的方法為本類對象
2.創建子類對象時,調用的方法為子類重寫的方法或繼承的方法
2.引用類型轉換
- 向上類型轉換(隱式/自動類型轉換),是小類型到大類型的轉換。不存在風險
- 向下轉換(強類型轉換),是大類型到小類型的轉換
使用instanceof運算符,來解決引用對象的類型
3.抽象類(abstract)
- 應用場景:
- 1.在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但是無法準確知道這些子類如何實現這些方法
- 2.從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板,從而避免了子類設計的隨意性
- 作用
- 不關註子類的實現,但是約束子類的設計
- 使用規則
- 1.abstract定義抽象類
- 2.abstract定義抽象方法,只要聲明,不需要實現
- 3.包含抽象方法的類是抽象類
- 4.抽象類中可以包含普通的方法,也可以沒有抽象方法
5.抽象類不能直接創建
五、介面
1.定義
- 類的一種具體實現體,而介面定義了某一批所需要遵守的規範,介面不關心這些類的內部數據,也不關係這些類里的方法的實現細節,它只是規定這些類必須提供某些方法
- 和類定義不同,定義介面不再使用class關鍵字,而是使用interface關鍵字
2.語法格式
[修飾符] interface 介面名 [extends 父介面1,父介面2,...]
{
零個到多個常量定義
零個到多個抽象方法的定義
}
- 介面就是用來被繼承,被實現,修飾符一般建議使用public
介面中的方法只能是抽象方法,即使定義時不添加public abstract 修飾符,系統也會自動加上
3.實現介面
- 一個類可以實現一個或多個介面,實現介面使用implements關鍵字,Java中一個類只能繼承一個類,是不夠靈活的,通過實現多個介面可以做補充。
如果需要繼承父類,繼承父類必須在實現介面之前