第三章 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 類名{
// [引數]可有可無
修飾符 類名([引數]) {
}
}
注意:
- 如果沒有定義構造方法,系統將給出一個預設的無引數構造方法,如果定義了構造方法,系統將不再提供預設的構造方法
- 如果自定義了帶參構造方法,還要使用無引數構造方法,就必須再寫一個無引數構造方法
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、繼承中變數使用的訪問特點
- 子類區域性範圍找
- 子類成員範圍找
- 父類成員範圍找
- 如果都沒有就報錯(不考慮父親的父親…)
3.4.3.2、繼承中成員方法的訪問特點
- 子類成員範圍找
- 父類成員範圍找
- 如果都沒有就報錯(不考慮父親的父親…)
3.4.3.3、繼承中構造方法的訪問特點
注意:子類中所有的構造方法預設都會訪問父類中無參的構造方法,每一個子類構造方法的第一條語句預設都是:super()
問題:如果父類中沒有無參構造方法,只有帶參構造方法,該怎麼辦呢?
答案:通過使用super關鍵字去顯示的呼叫父類的帶參構造方法
3.4.4、方法重寫
概述:子類出現了和父類中一模一樣的方法宣告(方法名一樣,引數列表也必須一樣)
應用:當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了 父類的功能,又定義了子類特有的內容
註解:Override註解用來檢測當前的方法,是否是重寫的方法,起到【校驗】的作用
注意:
- 私有方法不能被重寫(父類私有成員子類是不能繼承的)
- 子類方法訪問許可權不能更低(public > 預設 > 私有)
3.4.5、繼承的注意事項
- 類只支援單繼承,不支援多繼承
- 類支援多層繼承
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修飾區域性變數
- fianl修飾基本資料型別變數:基本型別的資料值不能發生改變
- final修飾引用資料型別變數:引用型別的地址值不能發生改變,但是地址裡面的內容是可以發生改變
3.9、static關鍵字
概述:static關鍵字是靜態的意思,可以修飾成員方法、成員變數
特點:
非靜態的成員方法
能訪問靜態的成員變數
能訪問非靜態的成員變數
能訪問靜態的成員方法
能訪問非靜態的成員方法
靜態的成員方法
能訪問靜態的成員變數
能訪問靜態的成員方法
注意:
- 靜態成員方法只能訪問靜態成員