#Java學習#(四)多態、數組和接口

多態

多態定義

  • 同樣的消息被不同類型的對象接收時產生不同的行爲
  • 表示的方法綁定的含義
    • 方法調用和方法聲明之間的關聯
    • 靜態綁定方法(早綁定)
      • 編譯時編譯器就能準確判斷應該調用的哪個方法
      • 靜態多樣性(方法重載)
    • 動態 綁定方法(晚綁定)
      + 運行時判斷所引用對象的實際類型,根據實際類型調用相應的方法
      + 動態多態性
public class pet{
	private String nama;
	public Pet(String name){
		this.name = name;
	}
	public void cry(){
	}
}

class Cat extends Pet{
	private String eyeColor;
	Cat(String n, String c){
		super(n);
		eyeColor = c;
	}
	public void cry(){
		System.out.println("喵喵");
	}
}

class Dog extends Pet{
	private String furColor;
	Dog(String n, String c){
		super(n);
		furColor = c;
	}
	public void cry(){
		System.out.println("汪汪");
	}
}

public static void main(String[] args){
	Pet p0, p1;
	p0 = new Cat();
	p1 = new Dog();
	p0.cry();
	p1.cry();
}

抽象類和抽抽象方法

  • 抽象方法:一種沒有實現的方法
  • 抽象類:定義有抽象方法的類
  • abstract關鍵字
  • 特徵
    • 含有抽象方法的類必須定義爲抽象類
    • 抽象類不能創建(new)實例
    • 抽象類是被用來繼承的,抽象方法是用來被重寫的
    • 子類未實現一個父類的抽象方法,該類仍爲抽象類;只有當子類實現了全部抽象方法時纔不是抽象類

數組

  • 創建: new 元素類型[元素個數]
  • 初始化:
    • 動態初始化
      • 數組的定義與數組元素分配空間、賦值操作分配進行
      • 先分配空間,然後給元素賦值
    • 靜態初始化
      • 定義數組的同時給數組分配空間並賦初值
    • 數組創建時默認初始化(基本類型、對象)
  • 說明
    • 定義數組並用new爲數組分配空間後,纔可以引用數組中元素
    • 引用數組元素方法:arrayName[index]
    • 數組下標0~n-1
    • 屬性:length,記錄數組長度
  • 大小
    • 數組創建後不能改變大小
    • 運行時動態確定數組大小
  • 二維數組
    • Java實際上沒有多維數組
    • 本質:數組的數組
    • 聲明和初始化按照從左到右的順序進行
    • 不規則數組
    int[][] odds = new int[3][];
    odds[0] = new int[]{1};
    odds[1] = new int[]{2,3};
    odds[2] = new int[]{4,5,6};
    //輸出結果:
    //1
    //2,3
    //4,56
    

Java數組變量相當於C++中指向數組的指針,Java中無指針運算

接口

定義與使用

  • 定義
//無構造方法,不能直接實例化
[修飾符] interface 接口名 [extends 父接口1, 父接口2, …]{//可以通過已有接口定義新的接口
	類型 常量成員名 =//屬性是public ststic final類型
	…
	返回類型 方法名(參數列表)//方法無實現,不需要指定訪問限制符(public),不能定義靜態方法(注:JDK8可以定義靜態方法和默認(default)方法)
}
  • 使用
[修飾符] class 類名 [extends 父類名] implements 接口1,接口2{//一個類可以實現多個無關接口
	//類的實現代碼}
//舉例
public class GraphicCard  implements PCI{
   private String model;
   public GraphicCard(String model){
   	this.model = model;
   }
   public void start() {  
   	System.out.println("Display Graphic...");  
   }  
   public void stop() {  
   	System.out.println("Display Graphic stop!");  
   }  
}

public class NetworkCard implements PCI {  
   public void start() {  
       System.out.println("Send data!");  
   } 
   public void stop() {  
       System.out.println("Network stop!");  
   }  
} 

public class SoundCard implements PCI {  
   public void start() {  
       System.out.println("Play sound");  
   } 
   public void stop() {  
       System.out.println("Sound stop!");  
   }  
}
  • 接口與多繼承
    • 面向對象中的多繼承
    • Java不支持一個類繼承多個類
    • Java中一個類可以實現多個接口
  • 總結
    • 定義和類相似,可以通過已有接口定義新的接口
    • 多個無關的類可以實現同一個接口;一個類可以實現多個無關的接口
    • 無構造方法,不能直接實例化,允許有接口變量,與實現類之間存在多態性
    • 方法無實現,不需要指定訪問限制符(public)
    • 屬性是public static final類型
    • 在實現接口的類中要實現接口中定義的所有方法

接口與抽象類

  • 相似之處:
    • 接口和抽象類都不能被實例化,它們都位於繼承樹的頂端,用於被其它類實現和繼承
    • 接口和抽象類都可以包含抽象方法
  • 不同之處
    • 設計目的
      • 接口作爲系統與外界交互的窗口,體現的是一種規範
        • 對於接口的實現者而言,接口規定了實現者必須向外提供哪些服務(方法形式提供)
        • 對於接口的調用者,接口規定了調用者可以調用哪些服務,以及如何調用這些服務(如何調用方法)
        • 在一個程序中使用接口時,接口是多個模塊之間的耦合標準;在多個應用程序之間使用接口時,接口是多個程序之間的通信標準
      • 抽象類作爲系統中多個子類的共同父類,它體現一種模板式設計
        • 抽象類作爲多個子類的抽象父類,可以被當作系統實現過程中的中間產品,它已經實現了系統的部分功能(已經提供實現的方法)
        • 但這個產品不能當成最終產品,必須更進一步的完善,這種完善可能有多種不同形式(不同的子類有不同的實現方式)
    • 用法
      • 接口裏只能包含抽象方法,不能包含已經提供實現的方法;抽象類則可以包含普通方法
      • 接口裏不能定義靜態方法(JDK8除外);抽象類可定義靜態方法
      • 接口裏只能定義靜態常量屬性,不能定義普通屬性;抽象類裏則既可以定義普通屬性,也可以定義靜態常量屬性
      • 接口不包含構造方法;抽象類裏可以包含構造方法,抽象類裏的構造方法並不是用於創建對象,而讓其子類調用這些構造方法來完成屬於抽象類的初始化操作
      • 接口裏不能包含初始化塊,但抽象類則完全可以包含初始化塊
      • 一個類最多只能有一個直接父類,包括抽象類;但一個類可以實現多個接口,通過實現多個接口可以彌補Java單繼承的不足
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章