Java基礎鞏固(六)-類
繼承
關鍵字extent,implement
java 不支援 多繼承
但支援多重繼承
特性
- 子類擁有父類非private的屬性,方法。
- 子類可以擁有自己的屬性和方法,即子類可以對父類進行擴充套件。
- 子類可以用自己的方式實現父類的方法。
- Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關係就是C類是B類的父類,B類是A類的父類,這是java繼承區別於C++繼承的一個特性。
- 提高了類之間的耦合性(繼承的缺點,耦合度高就會造成程式碼之間的聯絡越緊密,程式碼獨立性越差)。
super & this
- super關鍵字
我們可以通過super關鍵字來實現對父類成員的訪問,用來引用當前物件的父類。 - this關鍵字
指向自己的引用。
重寫(Override)&過載(Overload)
重寫
重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!
方法的重寫規則
- 引數列表必須於被重寫的方法相同
- 返回型別必須完全與被重寫的方法的返回型別相同
- 訪問許可權不能比父類中被重寫的訪問許可權低
例如 父是 public 子不能為protected - 父類的成員方法只能被它的子類重寫
- final的方法不能被重寫
- static方法不能被重寫 但能夠被再次宣告
- 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了宣告為private和final的方法。
- 子類和父類不在同一個包中,那麼子類只能夠重寫父類的宣告為public和protected的非final方法。
- 構造方法不能被重寫。
- 如果不能繼承一個方法,則不能重寫這個方法。
過載(Overload)
過載(overloading) 是在一個類裡面,方法名字相同,而引數不同。返回型別可以相同也可以不同。
每個過載的方法(或者建構函式)都必須有一個獨一無二的引數型別列表。
最常用的地方就是構造器的過載。
過載規則
- 被過載的方法必須改變引數列表(引數個數或型別不一樣);
- 被過載的方法可以改變返回型別;
- 被過載的方法可以改變訪問修飾符;
- 被過載的方法可以宣告新的或更廣的檢查異常;
- 方法能夠在同一個類中或者在一個子類中被過載。
- 無法以返回值型別作為過載函式的區分標準。
例如 下面的就是不允許的 無法通過返回值型別為過載函式的區分標準
void deleteBatch(String[] ids);
FileEntity deleteBatch(String[] ids);
過載重寫對比
下圖說明了一切 特別有意思 哈哈~
左 過載 右 重寫
多型
多型是同一個行為具有多個不同表現形式或形態的能力。
多型就是同一個介面,使用不同的例項而執行不同操作,同一個事件發生在不同的物件上會產生不同的結果。
優點
- 消除型別之間的耦合關係
- 可替換性
- 可擴充性
- 介面性
- 靈活性
- 簡化性
多型存在的三個必要條件
- 繼承
- 重寫
- 父類引用指向子類引用
例如
Parent a = new Child();
多型的實現方式
- 重寫
- 介面
- 抽象類和抽象方法
抽象類
在面向物件的概念中,所有的物件都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪物件的,如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,這樣的類就是抽象類
抽象類除了不能例項化物件之外,類的其它功能依然存在,成員變數、成員方法和構造方法的訪問方式和普通類一樣。
由於抽象類不能例項化物件,所以抽象類必須被繼承,才能被使用。
在Java中抽象類表示的是一種繼承關係,一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。
抽象方法
Abstract關鍵字同樣可以用來宣告抽象方法,抽象方法只包含一個方法名,而沒有方法體。
抽象方法沒有定義,方法名後面直接跟一個分號,而不是花括號。
// 例如
public abstract class Employee
{
private String name;
private String address;
private int number;
public abstract double computePay();
//其餘程式碼
}
- 如果一個類包含抽象方法,那麼該類必須是抽象類。
- 任何子類必須重寫父類的抽象方法,或者宣告自身為抽象類。
抽象類總結
- 抽象類不能被例項化,只有其非抽象子類才能被例項化;
- 抽象類不一定都有抽象方法 但有抽象方法的一定是抽象類;
- 抽象類的抽象方法 只是宣告 沒有方法體 即沒有括號;
- 構造方法,類方法(用static修飾的方法)不能宣告為抽象方法;
- 抽象類的非抽象子類必須對爸爸的抽象方法進行實現
封裝
在面向物件程式設計方法中,封裝(英語:Encapsulation)是指一種將抽象性函式介面的實現細節部份包裝、隱藏起來的方法。
封裝可以被認為是一個保護屏障,防止該類的程式碼和資料被外部類定義的程式碼隨機訪問。
封裝最主要的功能在於我們能修改自己的實現程式碼,而不用修改那些呼叫我們程式碼的程式片段。
優點
- 良好的封裝能減少耦合
- 類內部的結構可以自由修改
- 可以對成員編碼進行更加精細的控制
- 隱患資訊,實現細節
實現步驟
- 修改屬性的可見性來限制對屬性的訪問(一般限制為private)
- 對每個值屬性提供對外的公共方法訪問,也就是建立一對賦取值方法,用於對私有屬性的訪問
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
注:採用 this 關鍵字是為了解決例項變數(private String name)和區域性變數(setName(String name)中的name變數)之間發生的同名的衝突。
介面
Interface
介面(英文:Interface),在JAVA程式語言中是一個抽象型別,是抽象方法的集合,介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。
介面並不是類,編寫介面的方式和類很相似,但是它們屬於不同的概念。類描述物件的屬性和方法。介面則包含類要實現的方法。
介面特性
- 介面中每一個方法也是隱式抽象的,介面中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。
- 介面中可以含有變數,但是介面中的變數會被隱式的指定為 public static final 變數(並且只能是 public,用 private 修飾會報編譯錯誤)
注:根據這條 我們可以看到大量網上開原始碼中 定義了大量的介面常量 這種習慣其實不好。但它實現的就是 下面的這個常量類的效果
// 這是老幹爹的開源的spring cloud中的部分程式碼
// 這裡定義了管理通用常量
public class AdminCommonConstant {
public final static int ROOT = -1;
public final static int DEFAULT_GROUP_TYPE = 0;
/**
* 許可權關聯型別
*/
public final static String AUTHORITY_TYPE_GROUP = "group";
/**
* 許可權資源型別
*/
public final static String RESOURCE_TYPE_MENU = "menu";
public final static String RESOURCE_TYPE_BTN = "button";
public final static String RESOURCE_REQUEST_METHOD_GET = "GET";
public final static String RESOURCE_REQUEST_METHOD_PUT = "PUT";
public final static String RESOURCE_REQUEST_METHOD_DELETE = "DELETE";
public final static String RESOURCE_REQUEST_METHOD_POST = "POST";
public final static String RESOURCE_ACTION_VISIT = "訪問";
public final static String BOOLEAN_NUMBER_FALSE = "0";
public final static String BOOLEAN_NUMBER_TRUE = "1";
}
- 介面的位元組碼檔案儲存在 .class 結尾的檔案中。
- 介面相應的位元組碼檔案必須在與包名稱相匹配的目錄結構中。
介面的多繼承
在java中類不允許多繼承
但介面是允許多繼承的
標記介面
最常用的繼承介面是沒有包含任何方法的介面。
標記介面是沒有任何方法和屬性的介面.它僅僅表明它的類屬於一個特定的型別,供其他程式碼來測試允許做一些事情。
標記介面作用:簡單形象的說就是給某個物件打個標(蓋個戳),使物件擁有某個或某些特權。
例如:java.awt.event 包中的 MouseListener 介面繼承的 java.util.EventListener 介面定義如下:
package java.util;
public interface EventListener{
}
標記介面 主要用於以下兩種目的
- 建立一個公共的父介面
- 向一個類新增資料型別
包(package)
通常,一個公司使用它網際網路域名的顛倒形式來作為它的包名.例如:網際網路域名是 runoob.com,所有的包名都以 com.runoob 開頭。包名中的每一個部分對應一個子目錄。