Java基礎十一--多態

来源:http://www.cnblogs.com/Renyi-Fan/archive/2017/06/01/6927015.html
-Advertisement-
Play Games

Java基礎十一--多態 一、多態定義 簡單說:就是一個對象對應著不同類型. 多態在代碼中的體現: 父類或者介面的引用指向其子類的對象。 向上轉型:父類引用指向子類對象。子類的特有功能無法訪問。 向下轉型:子類引用指向父類對象。 在實際應用中,向上轉型便於代碼擴展(之前寫的代碼以後能用,只有繼承或者 ...


Java基礎十一--多態

一、多態定義

簡單說:就是一個對象對應著不同類型.

多態在代碼中的體現:
父類或者介面的引用指向其子類的對象。

  1 /*
  2 
  3 對象的多態性。
  4 
  5 class 動物
  6 {}
  7 
  8 class 貓 extends 動物
  9 {}
 10 
 11 class 狗 extends 動物
 12 {}
 13 
 14 
 15 
 16 貓 x = new 貓();
 17 
 18 動物 x = new 貓();//一個對象,兩種形態。
 19 
 20 
 21 
 22 貓這類事物即具備者貓的形態,又具備著動物的形態。
 23 這就是對象的多態性。 
 24 
 25 簡單說:就是一個對象對應著不同類型. 
 26 
 27 多態在代碼中的體現:
 28     父類或者介面的引用指向其子類的對象。
 29 
 30 
 31 多態的好處:
 32     提高了代碼的擴展性,前期定義的代碼可以使用後期的內容。
 33 
 34 多態的弊端:
 35     前期定義的內容不能使用(調用)後期子類的特有內容。通過向下轉型來解決。
 36 
 37 多態的前提:
 38     1,必須有關係,繼承,實現。(實現是特殊的繼承)
 39     2,要有覆蓋 40 
 41 
 42 
 43 */
 44 
 45 abstract class Animal
 46 {
 47     abstract void eat();
 48 
 49 }
 50 
 51 class Dog extends Animal
 52 {
 53     void eat()
 54     {
 55         System.out.println("啃骨頭");
 56     }
 57     void lookHome()
 58     {
 59         System.out.println("看家");
 60     }
 61 }
 62 
 63 class Cat extends Animal
 64 {
 65     void eat()
 66     {
 67         System.out.println("吃魚");
 68     }
 69     void catchMouse()
 70     {
 71         System.out.println("抓老鼠");
 72     }
 73 }
 74 
 75 class Pig extends Animal
 76 {
 77     void eat()
 78     {
 79         System.out.println("飼料");
 80     }
 81     void gongDi()
 82     {
 83         System.out.println("拱地");
 84     }
 85 }
 86 
 87 
 88 
 89 class DuoTaiDemo 
 90 {
 91     public static void main(String[] args) 
 92     {
 93         
 94 //        Cat c = new Cat();
 95 //        c.eat();
 96 //        c.catchMouse();
 97 
 98         Animal a = new Cat(); //自動類型提升,貓對象提升了動物類型。但是特有功能無法s訪問。
 99                             //作用就是限制對特有功能的訪問。
100                             //專業講:向上轉型。將子類型隱藏。就不用使用子類的特有方法。
101 
102 
103 //        a.eat();
104 
105         //如果還想用具體動物貓的特有功能。 
106         //你可以將該對象進行向下轉型。
107 //        Cat c = (Cat)a;//向下轉型的目的是為了使用子類中的特有方法。
108 //        c.eat();
109 //        c.catchMouse();
110 
111 //        註意:對於轉型,自始自終都是子類對象在做著類型的變化。
112 //        Animal a1 = new Dog();
113 //        Cat c1 = (Cat)a1;//ClassCastException
114 
115 
116         /*
117         Cat c = new Cat();
118 
119 //        Dog d = new Dog();
120 
121 //        c.eat();
122         method(c);
123 //        method(d);
124 //        method(new Pig());
125         */
126 
127         method(new  Dog());
128 
129     }
130 
131     public static void method(Animal a)//Animal a = new Dog();
132     {
133         a.eat();
134      //解決類型匹配問題的時候,我們就可以判斷一下
135         if(a instanceof Cat)//instanceof:用於判斷對象的具體類型。只能用於引用數據類型判斷
136 //                        //通常在向下轉型前用於健壯性的判斷。
137 
138         {
139             Cat c = (Cat)a;
140             c.catchMouse();
141         }
142         else if(a instanceof Dog)
143         {
144             Dog d = (Dog)a;
145             d.lookHome();
146         }
147         else
148         {
149         
150         }
151         
152     }
153     /*
154     public static void method(Cat c)
155     {
156         c.eat();
157     }
158     public static void method(Dog d)
159     {    
160         
161     }
162     */    
163 }

向上轉型:父類引用指向子類對象。子類的特有功能無法訪問。

向下轉型:子類引用指向父類對象。

1 Animal a = new Cat(); //自動類型提升,貓對象提升了動物類型。但是特有功能無法s訪問。
2                       //作用就是限制對特有功能的訪問。
3                       //專業講:向上轉型。將子類型隱藏。就不用使用子類的特有方法。
4 
5 Cat c = (Cat)a;//向下轉型的目的是為了使用子類中的特有方法。

在實際應用中,向上轉型便於代碼擴展(之前寫的代碼以後能用,只有繼承或者實現基類了的),但是要用到子類特有的功能的時候,必須向下轉型。

很多時候我們向上轉型為Object類,當用到自己特有功能的時候,我們向下轉型轉回來。

 

二、多態生活實例

 1 /*
 2 畢老師和畢姥爺的故事。
 3 */
 4 
 5 class 畢姥爺
 6 {
 7     void 講課()
 8     {
 9         System.out.println("管理");
10     }
11     void 釣魚()
12     {
13         System.out.println("釣魚");
14     }
15 }
16 
17 class 畢老師 extends 畢姥爺
18 {
19     void 講課()
20     {
21         System.out.println("Java");
22     }
23     void 看電影()
24     {
25         System.out.println("看電影");
26     }
27 }
28 
29 
30 
31 
32 
33 class  DuoTaiDemo2
34 {
35     public static void main(String[] args) 
36     {   //原來
37 //        畢老師 x = new 畢老師();
38 //        x.講課();
39 //        x.看電影();
40      //多態
41         畢姥爺 x = new 畢老師();
42         x.講課(); //這裡講的是Java的內容,Java把管理學覆蓋了 
43         x.釣魚();
44 
45         畢老師 y = (畢老師)x;//ClassCastException
46         y.看電影();
47 
48 
49 
50 
51     }
52 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • jlink 如何 離開 keil、IAR 監控變數呢? 目前 jlink的 api 可以做到,自己可以用C# 做一個 上位機,監控RAM裡面的變數。而不用打開keil 調試。還可以 刷寫 flash,可以用在產品量產的刷寫上。 SEGGER 的 jlink sdk並不是免費的,在調試API 過程中, ...
  • 最近在做一個資源對接項目,對方的介面中要求我們把文件的md5值傳過去,搜了一下找到這個方法,記錄之。 ...
  • 一、目標樣式 我們要實現上圖中的效果,需要如下的操作: 二、資源分享代碼 註:Client.Share.SendURL("URL地址") 分享文本:Client.Share.SendText("文本") 分享圖片:Client.Share.SendImage("圖片") 分享截屏:Client.Sh ...
  • 在angularjs中,想在文本框中,驗證用戶輸入的字元串是否為日期時間。剛開始時,Insus.NET想到的是正則,這隻是驗證到日期與時間的格式是否正確而已,而對於2月最後一天或是30或是31號,還是無能為力。 因此,Insus.NET想使用angularjs的自定義指令來驗證解決此問題。在ASP. ...
  • 1,這是因為用線程式控制制子窗體,刷新數據的時候會影響主窗體,因為主次窗體是以 Main man = new Main(); man.ShowDialog();形式存在 2,解決辦法: 新建公共類,Bool屬性並賦值,在需要調用刷新數據方法地方通過給刷新數據的方法套一個事件,在通過Timer 控制項結束當 ...
  • 接上一篇,眾所周知一個網站的用戶登錄是非常重要,一站式的登錄(SSO)也成了大家討論的熱點。微軟在這個Demo中,把登錄單獨拉了出來,形成了一個Service,用戶的註冊、登錄、找回密碼等都在其中進行。這套service是基於IdentityServer4開發的, 它是一套基於 .Net Core的... ...
  • 一、需求 我們在開發中經常會遇到一些枚舉,而且這些枚舉類型可能會在表單中的下拉中,或者單選按鈕中會用到等。 這樣用是沒問題的,但是用過的人都知道一個問題,就是枚舉的命名問題,當然有很多人枚舉直接中文命名,我是不推薦這種命名規則,因為實在不夠友好。 那有沒有可以不用中文命名,而且可以顯示中文的方法呢。 ...
  • 本文是利用PrintDocument定製列印單據的小例子。 涉及知識點: PrintDocument :從 Windows 窗體應用程式列印時,定義一種可重用的可發送到印表機上的對象。 PrintPreviewControl :表示 Windows 窗體應用程式列印預覽的原始預覽部分,沒有任何對話框 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...