Java基礎學習小記--多態

来源:http://www.cnblogs.com/xingyazhao/archive/2016/10/07/5936377.html
-Advertisement-
Play Games

現在我們要做這麼一個媒體庫,用來存放CD和DVD。可以往媒體庫里添加CD和DVD,還可以列出來媒體庫里所有的CD和DVD。 我們用到了繼承的概念:CD是一個對象,DVD也是。兩者又有很多相似的地方,比方說都有名字,播放時間,評論,等等,為了以後便於管理和調試,我們做了一個父類叫Item,它下麵有兩... ...


題外話:總結了多年的學習心得,不得不說,睡眠是一個學習者的必需品!所謂“早起毀一天”不是沒有道理哪,特別對Coders來說,有幾天不是加班到夜裡。好吧,我承認對於初學Java的我,昨日頭腦頓路,Java的繼承與多態,看得我是有點小懵逼。其實大致是懂了,不過到了具體應用中,特別是比較複雜的繼承和調用關係的時候些許迷路。好了,話不多說,明日再把繼承和多態來個總結,今日先對多態來個小記。

-------------------------------------------------------------------------------------------------------------------

現在我們要做這麼一個媒體庫,用來存放CD和DVD。可以往媒體庫里添加CD和DVD,還可以列出來媒體庫里所有的CD和DVD。

我們用到了繼承的概念:CD是一個對象,DVD也是。兩者又有很多相似的地方,比方說都有名字,播放時間,評論,等等,為了以後便於管理和調試,我們做了一個父類叫Item,它下麵有兩個子類:CD,DVD。

然後我們還需要做一個類(對象)來管理它們,這個對象有一個ArrayList的成員變數當作媒體庫,有一個add函數用來添加CD或DVD,還得有個list函數用來列出媒體庫里的所有東西。我們給這個類起名Database。

這樣我們就要做以下四個java源文件:

源碼:

 1 package dome;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class Database {
 6     
 7     private ArrayList<Item> listItem = new ArrayList<Item>();
 8     
 9     public void add(Item item) {
10         listItem.add(item);
11     }
12     
13     public void list() {
14         for(Item item:listItem) {
15             item.print();
16         }
17     }
18     
19     public static void main(String[] args) {
20         Database db = new Database();
21         db.add(new CD("黑夢",600,true,"Classic Album","竇唯",10));
22         db.add(new DVD("功夫",900,false,"Let's do this!","周星馳"));
23         db.add(new CD("Wall",700,false,"Psychedelic Rock","PinkFloyd",15));
24         db.list();
25     }
26     
27 }
Database.java
 1 package dome;
 2 
 3 public class Item {
 4 
 5     private String title;
 6     private int playTime;
 7     private boolean gotIt = false;
 8     private String comment;
 9     
10     public Item(String title, int playTime, boolean gotIt, String comment) {
11         super();
12         this.title = title;
13         this.playTime = playTime;
14         this.gotIt = gotIt;
15         this.comment = comment;
16     }
17     
18     public void print() {
19         System.out.print(title+":"+playTime+":"+gotIt+":"+comment);
20     }
21     
22 }
Item.java
 1 package dome;
 2 
 3 public class CD extends Item {
 4 
 5     private String artist;
 6     private int numofTracks;
 7     
 8     public CD(String title, int playTime, boolean gotIt, String comment, String artist, int numofTracks) {
 9         super(title, playTime, gotIt, comment);
10         this.artist = artist;
11         this.numofTracks = numofTracks;
12     }
13     
14     public void print() {
15         System.out.print("CD:");
16         super.print();
17         System.out.println(":"+artist+":"+numofTracks);
18     }
19     
20 }
CD.java
 1 package dome;
 2 
 3 public class DVD extends Item {
 4     
 5     private String director;
 6 
 7     public DVD(String title, int playTime, boolean gotIt, String comment, String director) {
 8         super(title, playTime, gotIt, comment);
 9         this.director = director;
10     }
11     
12     public void print() {
13         System.out.print("DVD:");
14         super.print();
15         System.out.println(":"+director);
16     }
17     
18 }
DVD.java

運行:

這裡有兩個概念:

多態變數:在這裡可以說是,一個父類下麵有兩個子類,在Database里第9行:Item item,定義了一個對象變數item,這個item是Item類,這個item還只是一個變數,是一個對象的管理者,但還沒有具體要去管的那個對象。在main函數里可以去給item賦一個CD,也可以給他賦DVD,所以這個item變數是要根據程式運行的時候才能知道他要管理的那個對象是什麼。這個item就是多態變數。

向上造型:想上造型是指拿一個子類的對象給父類的對象變數,或者說拿一個子類的對象當父類的對象來用,如Database里db.add一樣,我們可以拿一個CD或DVD給item這個Item類對象變數。向上造型總是安全的。

-------------------------------------------------------------------------------------------------------------------

然後是多態:

在Database運行的過程中,第15行,有句item.print

我們可以看到這是在調用Item里的print函數,不過我們從程式運行結果來看仿佛不是這麼回事,運行結果顯示明明是調用CD.print();和DVD.print();的結果。

Item.print():

CD.print():

DVD.print():

 

這就要用多態去解釋:首先當子類和父類里有相同名稱的函數時,子類里的函數會去覆蓋(override)從父類那裡繼承來的那個同名函數,於是從父類來的那個函數就會隱藏起來不起作用。然後Database第15行里的item會去看它管理的是什麼它自己的Item類還是他的子類,如果是它的子類,那麼這個print函數就會用它子類那裡的print函數。

 


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

-Advertisement-
Play Games
更多相關文章
  • 剛接到這樣的任務時,沒有感覺到任何壓力,不就是給移動端應用提供數據嗎?那邊發來參數,這邊處理數據,返回JSON。做網站開發時經常使用ajax請求後臺數據,不就是這麼回事嗎。於是,在確認完需求後就開始幹了,很快,進入聯調階段,這個時候各種問題來了,忙得不可開交。吃一塹,長一智,項目結束後總結了下,大致 ...
  • 虛方法和抽象方法都可以供派生類重寫,它們之間有什麼區別呢? 1. 虛方法必須有實現部分,併為派生類提供了覆蓋該方法的選項 抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被實例化。如: //抽象方法 public abstract class Animal { publ ...
  • 一、獲取文件夾列表 /// /// 獲取文件夾下的文件列表 /// /// string Path:文件夾路徑(@"C:\") /// string SearchPattern:擴展名過濾(" .txt") /// bool SearchChild:為False不搜索子目錄,為True搜索子目錄 / ...
  • 在asp.net mvc項目里,用戶需要開拓幾個活動版面,並以側欄的方式呈現在首頁右側,幾個活動時間不一致,為避免瀏覽者在活動未開放之時進入未開放的服務頁面。因此不僅需要在活動代碼中加入限制功能,也需要在前臺取消不合時宜的頁面的展示。 ...
  • 第一部分:程式集(System.Reflection.Assembly) 1.獲取Assembly對象 方法1:調用Assembly的以下4個靜態方法Get...()之一: GetAssembly(Type t) GetCallingAssembly() ——返回調用當前方法的方法所在的程式集 Ge ...
  • 欲練神功,引刀自宮。為了避免記憶體管理的煩惱,Java咔嚓一下,把指針砍掉了。當年.Net也追隨潮流,咔嚓了一下,化名小桂子,登堂入室進了皇宮。康熙往下麵一抓:咦?還在?——原來是假太監韋小寶。 打開unsafe選項,C 指針就biu的一下子蹦出來了。指針很強大,沒必要拋棄這一強大的工具。誠然,在大多 ...
  • 題目鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=5925 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams ...
  • 一、安裝VS2013,下載wpdpack,為VS2010配置WinpCap環境: ⑴首先在View中選擇Property Manager,然後展開工程,再展開Debug|Win32 ,接著右擊 Mircrosoft.Cpp.Win32.user選擇Properties(此處設置全局有效) ⑵之後分三 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...