## 多態
~~~java
package com.dodoke.demo;
public class Animal {
protected String sex;
protected int age;
protected String color;
protected String type;
protected void sleep() {
System.out.println("動物正在睡覺");
}
/**
* 動物叫
*/
public void say() {
System.out.println("動物叫");
}
public Animal() {
}
public Animal(String type, int age) {
this.type = type;
this.age = age;
}
public Animal(String sex, int age, String color, String type) {
super();
this.sex = sex;
this.age = age;
this.color = color;
this.type = type;
}
}
~~~
~~~java
package com.dodoke.demo;
public class Dog extends Animal {
/**
* 重寫實際上針對父類的方法進行修改
* 通常會在重寫的方法上加上注解 @Override
* @param args
*/
@Override
public void sleep() {
System.out.println("狗正在躺著睡覺");
}
/**
* 重寫say方法
*/
@Override
public void say() {
System.out.println("汪汪汪");
}
public void play() {
System.out.println("狗正在玩");
}
}
~~~
~~~java
package com.dodoke.demo;
public class Cat extends Animal {
/**
* 重寫say方法
*/
@Override
public void say() {
System.out.println("喵喵喵");
}
public void play() {
System.out.println("貓正在玩");
}
}
~~~
~~~java
package com.dodoke.demo;
/**
* 多態演示
* @author 一教室
*
*/
public class PolyStudy {
public static void main(String[] args) {
/**
* 簡單的繼承和實例化對象
*/
//數據類型 變量名 = new 數據類型構造器()
Dog dog = new Dog();
dog.say();
Cat cat = new Cat();
cat.say();
//多態
Animal ani = null;//此時聲明變量,確定編譯的類型
ani = new Dog();//此時將調用構造器初始化出來的對象賦值給變量,確定運行時的類型
/**
* 1. 創建一個Animal類型的變量anim變量
* 2. 在堆內存中開辟Dog類型的空間
* 3. 將Dog類型的空間地址賦給Animal類型的anim變量
*/
//Animal car = new Car(); 編譯時類型和運行時類型得是父類和子類的關系
//多態的測試
ani.say();//因為運行時類型為Dog,所以Animal類型的ani實際引用的say方法,為Dog類中重寫的say方法
System.out.println("*******************");
//更換實現
ani = new Cat();//對ani重新賦值
ani.say();
}
}
~~~
~~~java
package com.dodoke.demo;
public class PolyStudy2 {
public static void main(String[] args) {
/**
* 對象的轉型
* 對象向上轉型:子類對象->父類對象(由小變大)安全的
*/
//實現多態,已經存在類型的轉化了
Animal ani = new Dog();
ani.say();
ani.sleep();
//ani.play();引用變量ani只能調用它編譯時類型Animal的方法,而不能調用其運行時類型Dog的方法
/**
* 為什么要進行引用類型的強制類型轉換
* 如果必須要調用對象ani運行時的類型Dog類中的方法,則需要進行強制類型轉換。
*/
/**
* 對象的轉型
* 對象向下轉型:父類對象->子類對象(由大變小)不安全的
* 引用類型的強制類型轉換
* 對象向下轉型必須發生在向上轉型之后,才能進行向下轉型
*/
//將Dog類型轉變為Dog類型
if(ani instanceof Dog) {
Dog dog = (Dog) ani;//將ani強制轉變為Dog類型,編譯時類型和運行時類型都變成了Dog類型
dog.say();
dog.play();
}
/**
* 將Dog類型轉變為Cat類型
*/
if(ani instanceof Cat) {
Cat cat = (Cat) ani;//ani本質上是Dog類型,強制轉變為Cat類型會發生錯誤
cat.play();
cat.say();
}
}
}
~~~
- 課程開始
- 第一課20191008
- 第二課20191009
- HTML
- CSS
- CSS第一課
- CSS第二課
- CSS第三課
- CSS第四課
- CSS第五課
- JavaScript
- Js第一課
- Js第二課
- Js第三課
- Js第四課
- Js第五課
- Js第六課
- Js第七課
- Js-事件模型
- Js-2019-10-31-標準庫
- Js-2019-11-01- 標準庫
- Js-2019-11-01-Json
- Js-2019-11-01-對象的創建
- Js-2019-11-04-this的使用
- Js-2019-11-05-storage與異常
- Js-2019-11-05-BOM與補充知識點
- Js-2019-11-06-正則表達式和計時器
- jQuery
- jQuery-2019-11-13-初識jQuery
- jQuery-2019-11-14-jQuery節點操作
- jQuery-2019-11-15-jQuery節點操作二
- jQuery-2019-11-16-jQuery效果與動畫
- Java
- Java-2019-11-27-變量直接量數據格式運算符
- Java-2019-11-28-流程控制
- Java-2019-12-02-數組
- Java-2019-12-04 面向對象
- Java-2019-12-05-封裝
- Java-2019-12-06-深入構造器
- Java-2019-12-09-繼承
- Java-2019-12-10-多態
- Java-2019-12-10-包裝類
- Java-2019-12-11-final修飾符
- Java-2019-12-11-包裝類
- Java-2019-12-11-接口
- java-2019-12-13-設計模式
- Java-2019-12-16-集合框架
- Java-2019-12-18-集合排序
- Java-2019-12-23-常用類學習
- Java-2019-12-25-異常處理
- Java-2019-12-31-內部類詳解