1. 程式人生 > 程式設計 >Java面向物件程式設計:繼承,多型用法例項分析

Java面向物件程式設計:繼承,多型用法例項分析

本文例項講述了Java面向物件程式設計:繼承,多型用法。分享給大家供大家參考,具體如下:

本文內容:

  • 繼承
  • 多型

首發時期:2018-03-23


繼承:

介紹:

  • 如果多個類中存在相同的屬性和行為,可以將這些內容抽取到單獨一個類中,那麼多個類(子類)無需再定義這些屬性和行為,只要繼承那個類(父類/超類/基類)即可。【比如,泰迪狗類也是狗類,狗的屬性,泰迪狗也應該是有的,那麼泰迪狗類在定義的時候就不必要新增那些與狗類重複的屬性了,而是直接繼承狗類即可。在多個狗類的子類(泰迪狗,二哈,柴犬)的時候,直接繼承狗類可以省去很多程式碼,提高程式碼複用性。】
  • 繼承關係是通過extends來產生的,繼承的格式:class 子類名 extends 父類名{}image
  • 子類可以直接訪問父類中的非私有的屬性和行為(因為私有的並非子父類共性屬性、行為,父類並不一定只包含父子類共有的屬性,還會包含自己應該有的屬性,比如雖然哺乳類跟人類是父子類關係,但我們都能清楚,哺乳類有一些特別的特徵我們人類是沒有的)
  • 繼承的出現讓類與類之間產生了關係,為第三個特徵多型提供了前提。
  • JAVA只支援單繼承,不能有多個父類,但支援多實現(介面)(多繼承可能因為多個父類中有同名變數或函式而發生呼叫的不確定性)
  • JAVA支援多層繼承image_5ab3497c_1123
  • 當子父類不同包時,子類無法繼承父類的友好變數(預設無許可權修飾),只能繼承public 或 protected的。
class Person{
 String gender="unknown";//為了測試繼承,先賦值
 int age;
 String family_address;
 private String children; 
}

class Student extends Person{
}

public class Demo {

 public static void main(String[] args) {
  Student st=new Student();
  System.out.println(st.gender);//unknown
//  System.out.println(st.children);//報錯,children是父類私有
 }

}

繼承中的建構函式:

  • 預設是有呼叫父類的建構函式的,如果想要顯式呼叫父類的建構函式,可以使用super(引數列表)
    • 為了測試有預設super()的例子
      class Person{
       String gender="unknown";//為了測試繼承,先賦值
       int age;
       String family_address;
       private String children;
       Person(){
        System.out.println("為了測試預設有super()");
       }
      
       
      }
      
      class Student extends Person{
      
      }
      
      public class Demo {
      
       public static void main(String[] args) {
        Student st=new Student();
      
       }
      
      }
      
      
      -------------------結果:
      為了測試預設有super()
    • 顯示呼叫建構函式的例子:
        class Person{
         String gender;
         int age;
         String family_address;
         private String children;
         Person(String gender,int age,String family_address){
          this.gender=gender;
          this.age=age;
          this.family_address=family_address;
         }
         
        }
        
        class Student extends Person{
         Student(String gender,String family_address){
          super(gender,age,family_address);
         }
        }
        
        public class Demo {
        
         public static void main(String[] args) {
          Student st=new Student("男",18,"M78星雲");
          System.out.println(st.gender+st.family_address);//男M78星雲
          
        
         }
        
        }
  • 注意:預設的super()在第一行,而用this呼叫建構函式時也必須在第一行,那麼super()會預設在最終呼叫的建構函式的第一行。

繼承中成員變數的隱藏和方法的重寫:

  • 對於子類中繼承父類的成員變數,只要子類中對於同名的成員變數進行私有化,便能隱藏父類的成員變數。 【如果只是子類的成員變數是可見的,那麼直接定義同名變數覆蓋父類變數即可】
    • image
  • 方法重寫/覆蓋:重寫父類方法的時候不能降低方法的訪問許可權,也不能改變static修飾符。 【子類重寫後的方法的許可權必須大於等於父類的,非靜態不能覆蓋靜態的,靜態只能覆蓋靜態的】
    • 重寫就是子類中定義與父類中已有函式同名的函式,那麼這個子類中的函式就將父類的函式覆蓋了(不影響其他子類),當呼叫函式時,是呼叫子類中的該函式,而不是父類的。
      • image_5ab4aef5_590c
    • 如果想要使用被覆蓋了的父類方法,要新增super
      package 重寫;
      
      class Person{
       void show() {
        System.out.println("run in Fu");
       }
      }
      class Student extends Person{
       void show() {
        System.out.println("override in Zi");
        super.show();
       } 
      }
      
      public class Demo {
      
       public static void main(String[] args) {
        Student st=new Student();
        st.show();
        //結果:override in Zi
        //run in Fu
       }
      }

注意:

  1. 當子父類出現同名變數,用super來區分
  2. 子類無法重寫父類的private方法
  3. 用super.XXX來顯式獲取父類的成員變數或呼叫父類的方法


多型:

介紹:

  • 指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。【或者說指父類的某個方法被子類重寫時,可以各自產生自己的功能行為。】
  • 一種體現是函式的過載;一種體現是函式的重寫。
  • 另一種一種顯示形式:向上轉型,子類轉成父類物件,比如:image
    • 上轉型物件不能操作子類新增的函式,但可以呼叫子類繼承的成員變數或繼承或重寫的函式【注意的是不能呼叫子類隱藏父類的成員變數】。

使用:

向上轉型:

package 多型_usage;

class Animal{
 int age=4;
 void show() {
  System.out.println("run in Fu");
 }
}
class Tiger extends Animal{
 int age=6;
 void show() {
  System.out.println("ao ao ao");
 }
}

class Cat extends Animal{
 void show() {
  System.out.println("miao miao miao");
 }
}

public class Demo2{
 
 public static void main(String args[]) {
  Animal a=new Tiger();//把老虎轉型成父類-動物
  Animal b=new Cat();
  System.out.println(a.age);//4
  a.show();//run in Zi
  b.show();//miao miao miao
  
 }

}

注意:

  1. 成員變數子父類同名時,成員變數的呼叫看“.”所屬的物件的類。比如是父類.成員變數那麼就是父類的。

更多關於java相關內容感興趣的讀者可檢視本站專題:《Java面向物件程式設計入門與進階教程》、《Java資料結構與演算法教程》、《Java操作DOM節點技巧總結》、《Java檔案與目錄操作技巧彙總》和《Java快取操作技巧彙總》

希望本文所述對大家java程式設計有所幫助。