1. 程式人生 > 實用技巧 >第三章 Java面向物件(上)

第三章 Java面向物件(上)

3.1、概述

概述:面向物件是相對面向過程而言,面向物件和麵向過程都是一種思想,面向過程強調的是功能行為,面向物件則是將功能封裝進物件,強調具備功能的物件,面向物件是基於面向過程的。面向物件的三大特徵:封裝、繼承、多型。

開發:其實就是找物件,建立物件,使用物件,維護物件的關係。

3.2、類和物件

簡單理解:類是對事物的一種描述,物件則為具體存在的事物

類的定義:

public class 類名 {
    // 成員變數
    變數1的資料型別 變數1;
    變數2的資料型別 變數2;
    …
    // 成員方法
    方法1;
    方法2;
}

物件使用:

類名 物件名 = new 類名();

成員呼叫:

物件名.成員變數
物件名.成員方法();

特別注意:

3.3、封裝

概述:是面向物件程式語言對客觀世界的模擬,客觀世界 裡成員變數都是隱藏在物件內部的,外界是無法直接操作的

原則:將類的某些資訊隱藏在類內部,不允許外部程式直接訪問,而是通過該類提供的方法來實現對隱藏資訊的操作和訪問

好處:通過方法來控制成員變數的操作,提高了程式碼的安全性,把程式碼用方法進行封裝,提高了程式碼的複用性

3.3.1、private關鍵字

概述:private是一個修飾符,可以用來修飾成員(成員變數,成員方法),被private修飾的成員,只能在本類進行訪問

應用:類中的屬性通常被私有化,並對外提供公共的訪問方法,這樣可以避免安全隱患。這個方法一般有兩個,規範寫法:對於屬性 xxx,可以使用setXxx()、getXxx()對其進行操作。

3.3.2、this關鍵字

概述:this代表它所在函式所屬物件的引用,哪個物件在呼叫this所在的函式,this就代表哪個物件

應用:當定義類中功能時,該函式內部要用到呼叫該函式的物件時,這時用this來表示這個物件

3.3.3、構造方法

概述:構造方法是一種特殊的方法,可以使用帶參構造,為成員變數進行初始化

格式:

public class 類名{
    // [引數]可有可無 
    修飾符 類名([引數]) {
        
    }
}

注意:

  1. 如果沒有定義構造方法,系統將給出一個預設的無引數構造方法,如果定義了構造方法,系統將不再提供預設的構造方法
  2. 如果自定義了帶參構造方法,還要使用無引數構造方法,就必須再寫一個無引數構造方法

3.3.4、封裝案例

class Student {
    // 成員變數
    private String name;
    private int age;

    // 無參構造方法
    public Student() {}

    // 有參構造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 成員方法
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

3.4、繼承

概述:繼承可以使得子類具有父類的屬性和方法,還可以在子類中重新定義,以及追加屬性和方法

格式:class 子類 extends 父類 { }

好處:繼承可以讓類與類之間產生關係,子父類關係,產生子父類後,子類則可以使用父類中非私有的成員

3.4.1、super關鍵字

概述:代表父類儲存空間的標識(可以理解為父類物件引用)

應用:子類要訪問父類中的同名成員(成員變數和成員方法),用super關鍵字

3.4.2、this和super區別

this和super的概述:
		this:代表本類物件的引用
		super:代表父類物件的引用
    
this和super的使用:
成員變數:
	this.成員變數 - 訪問本類成員變數
	super.成員變數 - 訪問父類成員變數
    
成員方法:
	this.成員方法 - 訪問本類成員方法
	super.成員方法 - 訪問父類成員方法
    
構造方法:
	this(…) - 訪問本類構造方法
	super(…) - 訪問父類構造方法

3.4.3、繼承中的成員訪問特點

3.4.3.1、繼承中變數使用的訪問特點

  1. 子類區域性範圍找
  2. 子類成員範圍找
  3. 父類成員範圍找
  4. 如果都沒有就報錯(不考慮父親的父親…)

3.4.3.2、繼承中成員方法的訪問特點

  1. 子類成員範圍找
  2. 父類成員範圍找
  3. 如果都沒有就報錯(不考慮父親的父親…)

3.4.3.3、繼承中構造方法的訪問特點

注意:子類中所有的構造方法預設都會訪問父類中無參的構造方法,每一個子類構造方法的第一條語句預設都是:super()

問題:如果父類中沒有無參構造方法,只有帶參構造方法,該怎麼辦呢?

答案:通過使用super關鍵字去顯示的呼叫父類的帶參構造方法

3.4.4、方法重寫

概述:子類出現了和父類中一模一樣的方法宣告(方法名一樣,引數列表也必須一樣)

應用:當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了 父類的功能,又定義了子類特有的內容

註解:Override註解用來檢測當前的方法,是否是重寫的方法,起到【校驗】的作用

注意:

  1. 私有方法不能被重寫(父類私有成員子類是不能繼承的)
  2. 子類方法訪問許可權不能更低(public > 預設 > 私有)

3.4.5、繼承的注意事項

  1. 類只支援單繼承,不支援多繼承
  2. 類支援多層繼承

3.5、多型

概述:同一個物件,在不同時刻表現出來的不同形態

前提:要有繼承或實現關係、要有方法的重寫、要有父類引用指向子類物件

好處:提高程式的擴充套件性,定義方法時候,使用父型別作為引數,在使用的時候,使用具體的子型別參與操作

3.5.1、多型中的成員訪問特點

成員變數:編譯看父類,執行看父類
成員方法:編譯看父類,執行看子類

3.5.2、多型中的轉型

向上轉型:父類引用指向子類物件就是向上轉型
向下轉型:子型別 物件名 = (子型別)父類引用;

3.6、包和導包

3.6.1、package關鍵字

概述:包就是資料夾,用來管理類檔案的

格式:package 包名; (多級包用.分開)

注意:

帶包編譯:javac –d . 類名.java
例如:javac -d . com.caochenlei.demo.HelloWorld.java

帶包執行:java 包名+類名
例如:java com.caochenlei.demo.HelloWorld

3.6.2、 import關鍵字

概述:使用不同包下的類時,使用的時候要寫類的全路徑,寫起來太麻煩了,為了簡化帶包的操作,Java就提供了導包的功能

格式:import 包名;

3.7、許可權修飾符

3.8、final關鍵字

概述:final關鍵字是最終的意思,可以修飾成員方法、成員變數、類

特點:

final修飾方法:表示該方法不能被重寫
final修飾變數:表示該變數是一個常量,不能再次賦值
fianl修飾類:表示該類不能被繼承

注意:final修飾區域性變數

  1. fianl修飾基本資料型別變數:基本型別的資料值不能發生改變
  2. final修飾引用資料型別變數:引用型別的地址值不能發生改變,但是地址裡面的內容是可以發生改變

3.9、static關鍵字

概述:static關鍵字是靜態的意思,可以修飾成員方法、成員變數

特點:

非靜態的成員方法
	能訪問靜態的成員變數
	能訪問非靜態的成員變數
	能訪問靜態的成員方法
	能訪問非靜態的成員方法

靜態的成員方法
	能訪問靜態的成員變數
	能訪問靜態的成員方法

注意:

  1. 靜態成員方法只能訪問靜態成員