多型 簡單講解
物件的轉型
-
父類的引用可以指向子類的物件
-
向上轉型:
- 由子類型別轉型為父類型別
- 可定會成功,是一個隱式轉換
- 向上轉型後的物件,將只能訪問父類中共有的成員,不能訪問子類獨有的成員
- 向下轉型:
- 由父類型別轉型為子類型別
- 存在失敗的可能性,需要進行強制型別的轉換,是一個顯式轉換
- 如果失敗了,會出現ClassCastException異常
- 向下轉型後的物件,將可以訪問子類獨有的成員
Animal.java
package myOO5.polymorphism.polymorphism1;
/**
* 物件的轉型
*/
public class Animal {}
class Dog extends Animal{}
class JinMao extends Dog{}
Program.java
package myOO5.polymorphism.polymorphism1;
/**
* 父類的引用可以指向子類的物件
*
* 向上轉型:
* 1. 由子類型別轉型為父類型別
* 2. 可定會成功,是一個隱式轉換
* 3. 向上轉型後的物件,將只能訪問父類中共有的成員,不能訪問子類獨有的成員
*
* 向下轉型:
* 1. 由父類型別轉型為子類型別
* 2. 存在失敗的可能性,需要進行強制型別的轉換,是一個顯式轉換
* 3. 如果失敗了,會出現ClassCastException異常
* 4. 向下轉型後的物件,將可以訪問子類獨有的成員
*/
public class Program {
public static void main(String[] args) {
Dog dog = new Dog();
// 1. 向上轉型
Animal animal = dog;
// 2. 向下轉型
JinMao jinmao = (JinMao) dog;
}
}
報錯如下:
Exception in thread "main" java.lang.ClassCastException: myOO5.polymorphism.polymorphism1.Dog cannot be cast to myOO5.polymorphism.polymorphism1.JinMao
at myOO5.polymorphism.polymorphism1.Program.main(Program.java:20)
原因在於dog原本就不是jinmao
修改:
instanceof 關鍵字
向下轉型,存在失敗的可能性。如果引用實際指向的物件,不是要轉型的型別,此時強制轉換會出現ClassCastException異常。所以,在向下轉型之前,最好使用 instanceof 關鍵字進行型別檢查,檢查某一個物件是不是指定的型別
物件的轉型例項
動物園例項
package myOO5.polymorphism.polymorphism2;
public class Program {
// 需求:
// 某動物園需要錄入動物資訊
// 錄入的資訊,包含動物的名字,年齡;如果是老虎,還需要額外的錄入老虎的性別
public static void main(String[] args) {
load(new Tiger());
load(new Monkey());
load(new Wolf());
}
public static void load(Animal animal) {
// 輸出每一個動物的姓名和年齡
System.out.println("name = "+animal.name+", age = "+animal.age);
// 針對老虎做特殊處理
if (animal instanceof Tiger){
//向下轉型
Tiger tiger = (Tiger) animal;
//輸出老虎的性別
System.out.println("老虎的性別:" + tiger.gender);
}
}
}
class Animal{
String name;
int age;
}
class Tiger extends Animal{
String gender;
}
class Wolf extends Animal{}
class Monkey extends Animal{}
class Lion extends Animal{}
class QQ extends Animal{}
多型中的方法重寫
當向上轉型後的物件,呼叫父類中的方法。如果這個方法已經被子類重寫了,此時呼叫的就是子類的重寫實現
package myOO5.polymorphism.polymorphism3;
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
animal.bark(); //bark~
Dog dog = new Dog();
dog.bark(); //Won~
Animal animal1 = new Dog();
animal1.bark(); //Won~
}
}
class Animal{
public void bark(){
System.out.println("bark~");
}
}
class Dog extends Animal{
@Override
public void bark() {
System.out.println("Won~");
}
}
class Cat extends Animal{
@Override
public void bark() {
System.out.println("Miao~");
}
}
package myOO5.polymorphism.polymorphism3;
public class Test {
public static void main(String[] args) {
makeBark(new Animal());
makeBark(new Dog());
makeBark(new Cat());
}
private static void makeBark(Animal animal){
animal.bark();
}
}
class Animal{
public void bark(){
System.out.println("bark~");
}
}
class Dog extends Animal{
@Override
public void bark() {
System.out.println("Won~");
}
}
class Cat extends Animal{
@Override
public void bark() {
System.out.println("Miao~");
}
}
多型重寫的案例
package myOO5.polymorphism.polymorphism2;
public class Program {
// 需求:
// 某動物園需要錄入動物資訊
// 錄入的資訊,包含動物的名字,年齡;如果是老虎,還需要額外的錄入老虎的性
public static void main(String[] args) {
load(new Animal());
load(new Tiger());
load(new Monkey());
load(new Wolf());
}
public static void load(Animal animal) {
System.out.println(animal);
}
}
class Animal{
String name;
int age;
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Tiger extends Animal{
String gender;
@Override
public String toString() {
return "Tiger{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
class Wolf extends Animal{}
class Monkey extends Animal{}
class Lion extends Animal{}
class QQ extends Animal{}
這就是重寫方法在多型中的體現
相關文章
- 簡單易懂講註解
- Airtest簡單上手講解AI
- PHP 多程式之孤兒和殭屍簡單講解PHP
- SpringBoot切面Aop的demo簡單講解Spring Boot
- TCP、UDP、HTTP及Socket的簡單講解TCPUDPHTTP
- 簡單講解觀察者設計模式設計模式
- 簡單講解蘋果ios企業簽名蘋果iOS
- 樹狀陣列入門(簡單的原理講解)陣列
- webpack基礎講解及簡單搭建步驟Web
- Android Rxjava :最簡單&全面背壓講解 (Flowable)AndroidRxJava
- Python中Pandas 方法cut簡單講講Python
- 簡單講講上下界網路流
- [筆記] ELMO, BERT, GPT 簡單講解 - 李宏毅筆記GPT
- 簡單講解如何針對DDos部署防禦措施
- GIT Bash 簡單講解-git如何推/拉程式碼Git
- tf.transpose函式的用法講解(多維情況,看似複雜,其實也簡單)函式
- 最簡單易懂的 Spring Security 身份認證流程講解Spring
- 一份簡單夠用的 Nginx Location 配置講解Nginx
- 簡單講講小程式外掛是什麼
- 用最簡單的例子講解js中解決非同步的方法JS非同步
- 簡單談談方法過載和方法重寫(編譯時多型和執行時多型)編譯多型
- 瞭解多型多型
- 簡單CSS實現閃爍動畫(+1白話講解)CSS動畫
- 資料庫安全定義以及重要性簡單講解資料庫
- 簡單有效的多標準中文分詞詳解中文分詞
- Go 1.18 泛型全面講解:一篇講清泛型的全部Go泛型
- 這篇文章只簡單通俗的講單例模式單例模式
- 泛型就這麼簡單泛型
- 其實泛型很簡單泛型
- 怎樣錄製一個簡單的教學影片並配音講解
- 一個簡單多庫配置
- 簡單多播委託Demo
- 快速簡單的瞭解VLAN(VXLAN)和埠鏈路型別型別
- 編寫一個簡單的flask的前後端互動的網頁(flask簡單知識的講解)Flask後端網頁
- 使用Promise解決多層非同步呼叫的簡單學習Promise非同步
- SAP UI5 SimpleForm M 和 L 型表單的 label 和 input 分配講解UIORM
- Date簡單型別的setter注入型別
- WebSocket 簡單瞭解Web