多態
多態定義
- 同樣的消息被不同類型的對象接收時產生不同的行爲
- 表示的方法綁定的含義
- 方法調用和方法聲明之間的關聯
- 靜態綁定方法(早綁定)
- 編譯時編譯器就能準確判斷應該調用的哪個方法
- 靜態多樣性(方法重載)
- 動態 綁定方法(晚綁定)
+ 運行時判斷所引用對象的實際類型,根據實際類型調用相應的方法
+ 動態多態性
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單繼承的不足
- 設計目的