1. 程式人生 > >Java基礎鞏固(六)-類

Java基礎鞏固(六)-類

繼承

關鍵字extentimplement

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);

過載重寫對比

下圖說明了一切 特別有意思 哈哈~
左 過載 右 重寫
在這裡插入圖片描述


多型

多型是同一個行為具有多個不同表現形式或形態的能力。
多型就是同一個介面,使用不同的例項而執行不同操作,同一個事件發生在不同的物件上會產生不同的結果。

優點

  1. 消除型別之間的耦合關係
  2. 可替換性
  3. 可擴充性
  4. 介面性
  5. 靈活性
  6. 簡化性

多型存在的三個必要條件

  • 繼承
  • 重寫
  • 父類引用指向子類引用
    例如
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)是指一種將抽象性函式介面的實現細節部份包裝、隱藏起來的方法。
封裝可以被認為是一個保護屏障,防止該類的程式碼和資料被外部類定義的程式碼隨機訪問。
封裝最主要的功能在於我們能修改自己的實現程式碼,而不用修改那些呼叫我們程式碼的程式片段。

優點

  • 良好的封裝能減少耦合
  • 類內部的結構可以自由修改
  • 可以對成員編碼進行更加精細的控制
  • 隱患資訊,實現細節

實現步驟

  1. 修改屬性的可見性來限制對屬性的訪問(一般限制為private)
  2. 對每個值屬性提供對外的公共方法訪問,也就是建立一對賦取值方法,用於對私有屬性的訪問
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 開頭。包名中的每一個部分對應一個子目錄。