1. 程式人生 > >java面向物件基本知識點

java面向物件基本知識點

面向物件的思想

當需求單一,或者簡單時,我們一步一步去操作沒問題,並且效率也挺高,可隨著需求的更改,功能的增多,發現需要面對每一個步驟很麻煩了。這時就開始思索,能不能把這些步驟和功能在進行封裝,封裝時根據不同的功能,進行不同的封裝,功能類似的封裝在一起。這樣結構就清晰了很多。用的時候,找到對應的類就可以了。這就是面向物件的思想。
面向過程思想概述
面向過程開發,其實就是面向著具體的每一個步驟和過程,把每一個步驟和過程完成,然後由這些功能方法相互呼叫,完成需求。
面向過程的代表語言:C語言
類和物件的概念
a:類: 是一組相關的屬性和行為的集合
b:物件: 是該類事物的具體體現
c:舉例:

    類	  學生
    物件	  班長就是一個物件

學生類的定義
A:學生事物
屬性: 姓名 , 年齡 , 地址 …
行為: 吃飯 , 睡覺 , 上課 …
B:學生事物與學生類的對應關係
屬性 ----- 成員變數
行為 ----- 成員方法
學生類的使用
A:檔名問題
在一個java檔案中寫兩個類:一個基本的類,一個測試類。
建議:檔名稱和測試類名稱一致。
B:如何使用呢?
建立物件使用。
C:如何建立物件呢?
格式:類名 物件名 = new 類名();
D:如何使用成員變數呢?
格式:物件名.變數名
E:如何使用成員方法呢?
格式:物件名.方法名(…)
一個物件的記憶體圖


在這裡插入圖片描述三個引用二個物件的記憶體圖
在這裡插入圖片描述成員變數和區域性變數的區別
A:在類中的位置不同
成員變數:在類中方法外
區域性變數:在方法定義中或者方法宣告上
B:在記憶體中的位置不同
成員變數:在堆記憶體
區域性變數:在棧記憶體
C:生命週期不同
成員變數:隨著物件的建立而存在,隨著物件的消失而消失
區域性變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失
D:初始化值不同
成員變數:有預設初始化值
區域性變數:沒有預設初始化值,必須定義,賦值,然後才能使用
注意事項: 區域性變數名稱可以和成員變數名稱一樣,在方法中使用的時候,採用的是就近原則。
方法的形式引數是類名的時候如何呼叫
A:Java中引數傳遞問題

形式引數
基本型別:形式引數的改變不影響實際引數
引用型別:形式引數的改變直接影響實際引數
B:方法的引數是類名
如果你看到了一個方法的形式引數是一個類型別(引用型別),這裡其實需要的是該類的物件。

匿名物件的概述和應用

A:什麼是匿名物件
就是沒有名字的物件
B:匿名物件應用場景
a:呼叫方法,僅僅只呼叫一次的時候。
b:匿名物件可以作為實際引數傳遞

封裝的概述

是指隱藏物件的屬性和實現細節,僅對外提供公共訪問方式。
封裝好處:
1.隱藏實現細節,提供公共的訪問方式
2.提高了程式碼的複用性
3.提高安全性。
封裝原則:
1.將不需要對外提供的內容都隱藏起來。
2.把屬性隱藏,提供公共方法對其訪問。

構造方法概述和格式

A:構造方法概述和作用
建立物件,給物件中的成員進行初始化
B:構造方法格式特點
a:方法名與類名相同
b:沒有返回值型別,連void都沒有
c:沒有具體的返回值
構造方法的過載及注意事項
a:如果我們沒有給出構造方法,系統將自動提供一個無參構造方法。
b:如果我們給出了構造方法,系統將不再提供預設的無參構造方法。
注意: 這個時候,如果我們還想使用無參構造方法,就必須自己給出。建議永遠自己給出無參構造方法
給成員變數賦值的兩種方式
a:setXxx()方法
b:構造方法
建立一個物件的步驟
Student s = new Student();
(1):載入Student.class檔案進記憶體
(2):在棧記憶體為s開闢空間
(3):在堆記憶體為學生物件開闢空間
(4):對學生物件的成員變數進行預設初始化
(5):對學生物件的成員變數進行顯示初始化
(6):通過構造方法對學生物件的成員變數賦值
(7):學生物件初始化完畢,把物件地址賦值給s變數在這裡插入圖片描述

程式碼塊的概述和分類

A:程式碼塊概述
在Java中,使用{}括起來的程式碼被稱為程式碼塊。
B:程式碼塊分類
根據其位置和宣告的不同,可以分為區域性程式碼塊,構造程式碼塊,靜態程式碼塊,同步程式碼塊(多執行緒講解)。
C:常見程式碼塊的應用
a:區域性程式碼塊
在方法中出現;限定變數生命週期,及早釋放,提高記憶體利用率
b:構造程式碼塊
在類中方法外出現;多個構造方法方法中相同的程式碼存放到一起,每次呼叫構造都執行,並且在構造方法前執行
c:靜態程式碼塊
在類中方法外出現,加了static修飾
在類中方法外出現,並加上static修飾;用於給類進行初始化,在載入的時候就執行,並且只執行一次。
例子:

class Student {
    static {
        System.out.println("Student 靜態程式碼塊");
    }

    {
        System.out.println("Student 構造程式碼塊");
    }
    public Student() {
        System.out.println("Student 構造方法");
    }
}
public class StudentDemo {
    static {
        System.out.println("StudentDemo的靜態程式碼塊");
    }

    public static void main(String[] args) {
        System.out.println("我是main方法");

        Student s1 = new Student();
        Student s2 = new Student();
    }
}

輸出:
Student 靜態程式碼塊
Student 構造程式碼塊
Student 構造方法
Student 構造程式碼塊
Student 構造方法

繼承的引入和概述

A:繼承概述
多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為,只要繼承那個類即可。
B:繼承格式
通過extends關鍵字可以實現類與類的繼承
class 子類名 extends 父類名 {}
單獨的這個類稱為父類,基類或者超類;這多個類可以稱為子類或者派生類。
繼承的好處和弊端
繼承的好處
a:提高了程式碼的複用性
b:提高了程式碼的維護性
c:讓類與類之間產生了關係,是多型的前提
繼承的弊端
類的耦合性增強了。

	開發的原則:高內聚,低耦合。
	耦合:類與類的關係
	內聚:就是自己完成某件事情的能力

Java中類的繼承特點

a.Java只支援單繼承,不支援多繼承。
有些語言是支援多繼承,格式:extends 類1,類2,…
b:Java支援多層繼承(繼承體系)
繼承的注意事項和什麼時候使用繼承
A:繼承的注意事項
a:子類只能繼承父類所有非私有的成員(成員方法和成員變數)
b:子類不能繼承父類的構造方法,但是可以通過super(待會兒講)關鍵字去訪問父類構造方法。
c:不要為了部分功能而去繼承
B:什麼時候使用繼承
繼承其實體現的是一種關係:“is a” .
採用假設法。
如果有兩個類A,B。只有他們符合A是B的一種,或者B是A的一種,就可以考慮使用繼承。
繼承中成員變數的關係
A:子類中的成員變數和父類中的成員變數名稱不一樣
B:子類中的成員變數和父類中的成員變數名稱一樣
在子類中訪問一個變數的查詢順序(“就近原則”)
a: 在子類的方法的區域性範圍找,有就使用
b: 在子類的成員範圍找,有就使用
c: 在父類的成員範圍找,有就使用
d:如果還找不到,就報錯
繼承中構造方法的關係
子類中所有的構造方法預設都會訪問父類中空引數的構造方法,因為子類會繼承父類中的資料,可能還會使用父類的資料。所以,子類初始化之前,一定要先完成父類資料的初始化。
其實:
每一個構造方法的第一條語句預設都是:super()
在這裡簡單的提一句,Object類。否則有人就會針對父類的構造方法有疑問。Object在沒有父類了。
繼承中構造方法的注意事項
父類沒有無參構造方法,子類怎麼辦?
a: 在父類中新增一個無參的構造方法
b:子類通過super去顯示呼叫父類其他的帶參的構造方法
c:子類通過this去呼叫本類的其他構造方法
本類其他構造也必須首先訪問了父類構造
注意事項
super(…)或者this(….)必須出現在第一條語句上
例項1:

class Fu{
    public int num = 10;
    public Fu(){
        System.out.println("fu");
    }
}
class Zi extends Fu{
    public int num = 20;
    public Zi(){
        System.out.println("zi");
    }
    public void show(){
        int num = 30;
        System.out.println(num);
        System.out.println(this.num);
        System.out.println(super.num);
    }
}
class Test {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.show();
    }
}

輸出:
fu
zi
30
20
10
繼承中成員方法關係
A:當子類的方法名和父類的方法名不一樣的時候
B:當子類的方法名和父類的方法名一樣的時候
通過子類呼叫方法:
a: 先查詢子類中有沒有該方法,如果有就使用
b:在看父類中有沒有該方法,有就使用
c: 如果沒有就報錯

方法重寫概述及其應用

A:什麼是方法重寫
子類中出現了和父類中一模一樣的方法宣告(方法名,引數列表,返回值型別),也被稱為方法覆蓋,方法複寫。
B: Override和Overload的區別?Overload能改變返回值型別嗎?
https://blog.csdn.net/singit/article/details/47722047
C:方法重寫的應用:
當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法。
這樣,即沿襲了父類的功能,又定義了子類特有的內容。
方法重寫的注意事項
a:父類中私有方法不能被重寫
因為父類私有方法子類根本就無法繼承
b:子類重寫父類方法時,訪問許可權不能更低
最好就一致
c:父類靜態方法,子類也必須通過靜態方法進行重寫