1. 程式人生 > 其它 >Java方法重寫時容易被忽略的里氏轉換原則

Java方法重寫時容易被忽略的里氏轉換原則

技術標籤:典化成籍 · JavaJava方法重寫里氏轉換extends

FatherFloor - 里氏轉換父類

package domain;

import java.util.ArrayList;

/**
 * 里氏轉換父類
 * 
 * @author WanAkiko
 *
 */
public class FatherFloor {
	
	// 原父類execute方法引數為List<Object> list,此類在被其它子類繼承並重寫方法時,不同的型別接收值返回的結果不一致
	// 在實際開發中父類與子類間的方法重寫子類引數的型別必須大於父類引數型別,例如父類若為HashMap則子類必須為Map
	
//	public void execute(List<Object> list) {
//		System.out.println("父類List有參execute方法");
//	}
	
	public void execute(ArrayList<Object> list) {
		System.out.println("父類List有參execute方法");
	}

}

SonFloor - 里氏轉換子類

package domain;

import java.util.List;

/**
 * 里氏轉換子類
 * 
 * @author WanAkiko
 *
 */
public class SonFloor extends FatherFloor {

	// 原子類execute方法引數為ArrayList<Object> list,此類在繼承父類並重寫父類方法時,不同的型別接收值返回的結果不一致
	// 在實際開發中父類與子類間的方法重寫子類引數的型別必須大於父類引數型別,例如父類若為ArrayList則子類必須為List
	
//	public void execute(ArrayList<Object> list) {
//		System.out.println("子類ArrayList有參execute方法");
//	}
	
	public void execute(List<Object> list) {
		System.out.println("子類ArrayList有參execute方法");
	}
	
}

RichConvertTest - 繼承關係測試類

package main;

import java.util.ArrayList;

import domain.FatherFloor;
import domain.SonFloor;

public class RichConvertTest {

	public static void main(String[] args) {
		
		ArrayList<Object> list = new ArrayList<Object>();
		// 繼承關係沒有遵循里氏轉換規則時,不同型別的接收值接收的結果不一致
		FatherFloor father = new SonFloor(); // 輸出父類方法
		father.execute(list);
		SonFloor son = new SonFloor(); // 輸出子類方法
		son.execute(list);
	}

}

執行示例:
在這裡插入圖片描述