天天看點

老王學JAVA七周第四天

對象的向上轉型:

對象的向下轉型

老王學JAVA七周第四天
/*
抽象方法必須是抽象類: 記得要加abstract關鍵字。 
 */

public abstract class Animal {
	public abstract void eat();

}

           
public class Cat extends Animal{
	
	@Override
	public void eat(){
		System.out.println("貓吃魚");
	}

	//子類特有方法
	public void catchMouse(){
		System.out.println("貓抓老鼠");
	}
}

           
public class Dog extends Animal{

	@Override
	public void eat() {
		System.out.println("狗吃SHIT");
	}
	
	public void watchHouse(){
		System.out.println("狗看家");
	}

}
           
/*
 向上轉型一定是安全的,沒有問題的,正确的,但是也有一個弊端,
 對象一旦向上轉型為父類,就無法調用子類原本特意的方法内容。
 
 解決方案:用對象的向下轉型[還原]。(本來就是貓才能還原才是貓)
 */
public class Demo01Main {

	public static void main(String[]args){
		//對象的向上轉型,就是:父類引用指向子類對象。
		Animal animal = new Cat();//本來建立的時候是一種貓
		animal.eat();
		
		
//		animal.catchMouse();//錯誤寫法
		
		//向下轉型,進行“還原”動作
		Cat cat = (Cat) animal;
		cat.catchMouse();//貓抓老鼠
		
		//下面是錯誤的向下轉型
		//本來new的時候是一隻貓,現在非要當做狗
		//錯誤寫法,編譯不會報錯,但是運作會出現異常;
		// java.lang.ClassCastException,類轉換異常
		Dog dog = (Dog) animal;
	}
}

           

用instancesf 關鍵字進行類型判斷:

如何能知道一個父類引用的對象,本來是什麼子類?

格式:

對象 instanceof 類型名稱

這将得到一個boolean值結果(判斷boolean值 就是if語句),也就是判斷前面的對象能不能當做後面類型的實列。

public class Demo02Instanceof {

	public static void main(String [] args){
		Animal animal = new Cat();//本來是一隻貓
		animal.eat();//貓吃魚
		
		//如果希望調用子類特有方法,需要向下轉型
		//判斷一下父類引用animal 本來是不是Dog
		if(animal instanceof Dog){
			Dog dog = (Dog) animal;
			dog.watchHouse();
		}
		//判斷一下animal本來是不是Cat
		if(animal instanceof Cat){
			Cat cat = (Cat) animal;
			cat.catchMouse();
		}
		
		giveMeAPet(new Dog());
	}
	public static void giveMeAPet(Animal animal){
		if(animal instanceof Dog){
			Dog dog = (Dog) animal;
			dog.watchHouse();
		}
		if(animal instanceof Cat){
			Cat cat = (Cat) animal;
			cat.catchMouse();
		}
	}
}
           

筆記本USB接口案例 分析:

筆記本電腦:通常使用USB裝置的功能,在生成時,筆記本都有預留了可以插入USB裝置的USB接口,具體是什麼USB裝置,筆記本廠商并不關心,隻要符合USB規格的裝置都可以。

定義USB 接口,具備最基本的開啟功能和關閉功能,滑鼠和鍵盤要想能在電腦上使用,那麼滑鼠和鍵盤也必須遵守USB規範,實作USB接口,否則滑鼠和鍵盤的生産出來也無法使用。

案例分析:

進行描述筆記本類,實作筆記本使用USB滑鼠,USB 鍵盤。

1,USB接口,包含打開裝置功能,關閉裝置功能

2,筆記本類,包含開機功能,關機功能,使用USB裝置功能。

3,滑鼠類,要實作USB接口,并具備點選的方法

4,鍵盤類,要實作USB接口,具備敲擊的方法。

老王學JAVA七周第四天
public interface USB {
	
	
	public abstract void open();//打開裝置
	
	
	public abstract void close();//關閉裝置

}
           
public class Computer {
	
	public void  powerOn(){
		System.out.println("筆記本電腦開機");
		
	}
	public void powerOff(){
		System.out.println("筆記本電腦關機");
	}
	
	//使用USB 裝置的方法,使用接口作為方法的參數
	public void useDevice(USB usb){
		usb.open();//打開裝置
		if(usb instanceof Mouse){//一定先判斷
			Mouse mouse = (Mouse) usb;//向下轉型
			mouse.click();
		}else if (usb instanceof Keyboard){//先判斷
			Keyboard keyboard = (Keyboard) usb;//向下轉型
			keyboard.type();
		}
		
		usb.close();//關閉裝置
	}

}

           
//滑鼠就是一種USB裝置
public class Mouse implements USB{

	@Override
	public void open() {
		System.out.println("打開滑鼠");
		
	}

	@Override
	public void close() {
		System.out.println("關閉滑鼠");
		
	}

	public void click(){
		System.out.println("點選滑鼠");
	}
}

           
//鍵盤也是一個USB裝置
public class Keyboard implements USB {

	@Override
	public void open() {
		System.out.println("打開鍵盤");
		
	}

	@Override
	public void close() {
		System.out.println("關閉鍵盤");
		
	}

	public void type(){
		System.out.println("鍵盤輸入");
	}
}

           
public class DemoMain {

	public static void main(String[]args){
		
		//首先建立一個筆記本電腦
		Computer computer = new Computer();
		computer.powerOn();
		
		//準備一個滑鼠,供電腦使用
//		Mouse mouse = new Mouse();
		//首先進行向上轉型
		USB usbMouse = new Mouse();//多态寫法
		//參數是USB 類型,我正好傳遞進去的就是USB滑鼠
		computer.useDevice(usbMouse);
		
		
		
	//建立一個USB 鍵盤 
		Keyboard keyboard = new Keyboard();//沒有使用多态寫法
		//方法參數是USB類型,傳遞進去的是實作類對象
		computer.useDevice(keyboard);//正确寫法,也發生了向上轉型
		//使用子類對象,匿名對象,也可以
//		computer.useDevice(new Keyboard());//也是正确寫法
		
		
		
		computer.powerOff();
		System.out.println("=================");
		
		method(10.0);//正确寫法。double --> double
		method(20);//正确寫法。 int --> double
		
		int a = 30;
		method(a);//正确寫法, int -- > double
			
	}
	
	public static void method(double num){
		System.out.println(num);
	}
}