對象的向上轉型:
對象的向下轉型
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB5UeZRVT3lFRPBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyQTOyIjNykDM2ADOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
/*
抽象方法必須是抽象類: 記得要加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接口,具備敲擊的方法。
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);
}
}