Java多態性理解

2020-12-03 CSDN

Java中多態性的實現

什麼是多態

面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而準備的。這是我們最後一個概念,也是最重要的知識點。

多態的定義:指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行為方式。(發送消息就是函數調用)

實現多態的技術稱為:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。

多態的作用:消除類型之間的耦合關係。

現實中,關於多態的例子不勝枚舉。比方說按下 F1 鍵這個動作,如果當前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;如果當前在 Word 下彈出的就是 Word 幫助;在 Windows 下彈出的就是 Windows 幫助和支持。同一個事件發生在不同的對象上會產生不同的結果。

下面是多態存在的三個必要條件,要求大家做夢時都能背出來!

多態存在的三個必要條件

一、要有繼承;

二、要有重寫;

三、父類引用指向子類對象。

多態的好處:

1.可替換性(substitutability)。多態對已存在代碼具有可替換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。

2.可擴充性(extensibility)。多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。

3.接口性(interface-ability)。多態是超類通過方法籤名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。如圖8.3 所示。圖中超類Shape規定了兩個實現多態的接口方法,computeArea()以及computeVolume()。子類,如Circle和Sphere為了實現多態,完善或者覆蓋這兩個接口方法。

4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。

5.簡化性(simplicity)。多態簡化對應用軟體的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。

Java中多態的實現方式:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。

一個小題目:

(一)相關類

/** * Java學習交流QQ群:589809992 我們一起學Java! */ class A ...{ public String show(D obj)...{ return ("A and D"); } public String show(A obj)...{ return ("A and A"); } } class B extends A...{ public String show(B obj)...{ return ("B and B"); } public String show(A obj)...{ return ("B and A"); } } class C extends B...{} class D extends B...{}

(二)問題:以下輸出結果是什麼?

A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a1.show(b)); ① System.out.println(a1.show(c)); ② System.out.println(a1.show(d)); ③ System.out.println(a2.show(b)); ④ System.out.println(a2.show(c)); ⑤ System.out.println(a2.show(d)); ⑥ System.out.println(b.show(b)); ⑦ System.out.println(b.show(c)); ⑧ System.out.println(b.show(d)); ⑨

(三)答案

① A and A ② A and A ③ A and D ④ B and A ⑤ B and A ⑥ A and D ⑦ B and B ⑧ B and B ⑨ A and D

相關焦點

  • 詳細介紹Java多態性(一)
    詳細介紹Java多態性(一) 本文介紹的是JAVA的多態性,希望對你有幫助,一起來看。佚名來源:網際網路|2011-07-11 16:35 多態性
  • 詳細介紹Java多態性(二)
    多態性是通過:1 接口和實現接口並覆蓋接口中同一方法的幾不同的類體現的2 父類和繼承父類並覆蓋父類中同一方法的幾個不同子類實現的.一、基本概念多態性:發送消息給某個對象,讓該對象自行決定響應何種行為。
  • Java多態性:Java什麼是多態?
    多態性是面向對象編程的又一個重要特徵,它是指在父類中定義的屬性和方法被子類繼承之後,可以具有不同的數據類型或表現出不同的行為,這使得同一個屬性或方法在父類及其各個子類中具有不同的含義
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    學習過Java的程式設計師都知道,java類有三大特徵——封裝、繼承和多態。下面的文章給大家詳細的介紹一下java的這三大特性。封裝封裝是將描述某類事物的數據與處理這些數據的函數封裝在一起,形成一個有機整體,稱為類。類所具有的的封裝性可使程序模塊具有良好的獨立性與可維護性。
  • 跟我學java編程—深入理解for語句的嵌套循環
    示例1:用「*」輸出一個菱形圖案,圖案如下: 在D盤Java目錄下,新建「ForSample1.java」文件。用記事本打開「ForSample1.java」文件,輸入以下代碼:代碼結構分析程序功能主要是演示for嵌套循環的使用方法。
  • Java基礎教程:java反射機制教程
    一、反射概念 在正式講解反射之前,為了很好的去理解它我們先從一個案例說起。這時候java語言在設計的時候為我們提供了一個機制,就是反射機制,他能夠很方便的去解決我們的問題。
  • 程式設計師:深入理解JVM,從JVM層面來講Java多態
    對多態理解不夠深入的,多半都會答錯;如果能記住口訣:「變量多態看左邊,方法多態看右邊,靜態多態看左邊」的話,肯定就知道答案,但是JVM是如何確定具體調用哪個方法的,有小夥伴思考過嗎?主要原因是字面量不需要定義,所以字面量沒有顯式的靜態類型,它的靜態類型只能通過語言上的規則去理解和推斷。
  • Java程式設計師必備基礎:Java代碼是怎麼運行的?
    最近複習了深入理解Java虛擬機,做了一下總結,希望對大家有幫助,如果有不正確的地方,歡迎提出,感激不盡。java源文件編譯為class字節碼 類加載器把字節碼加載到虛擬機的方法區。
  • 基因多態性的檢測方法
    在人群中,個體間基因的核苷酸序列存在著差異性稱為基因(DNA)的多態性(gene polymorphism)。這種多態性可以分為兩類,即DNA位點多態性(site polymorphism)和長度多態性 (longth polymorphism)。
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    提到C++語言,很多人發現在使用過程中最容易出現的錯誤就是內存管理,而java有自動垃圾回收器,不用擔心內存。零基礎學Java作為一門面向對象的高級語言,Java不僅吸收了C++語言的各種優點,還對C++裡諸如多繼承、指針等一些讓用戶難以理解和掌握的概念重新組織和及摒棄
  • 「染色體多態性」知多少?
    染色體多態性在人群中發生的比例很高,經常在染色體核型分析中被發現。從分子水平上看,染色體異染色質區所含DNA主要是非編碼的高度重複序列,不含有結構基因,沒有轉錄活性。傳統觀點認為染色體多態性一般不會引起臨床表型異常。      但近年研究表明,染色體多態性有一定的臨床效應,並且是以流產、死胎、不孕不育為主要表現,且以生殖異常佔多數。
  • Python每天一分鐘:白話解釋類的多態性,終於說清楚了(附代碼)
    面向對象的程序設計具有三大特性:封裝性,繼承性,多態性!其中,多態性是類編程中的重要特性,也是三者中最不易理解的特性!本文將對類的多態性做詳細介紹,最後通過代碼來演示具體的應用場景!類的多態性一、由生活中的多態性到類編程中的多態性我們將通過具體的生活場景
  • 變異形式專題-SNP多態性
    幾乎所有常見的單核苷酸多態性(SNP)位點只有兩個等位基因。單核苷酸多態性(SNP)位點的分布是不均勻的,在非編碼區比在編碼區更常見。一般來說,自然選擇傾向於保留最利於遺傳適應性的單核苷酸多態性(SNP)位點。其他因素,如基因重組和突變率也可判斷單核苷酸多態性(SNP)位點的密度。
  • Java8 lambda表達式語法
    文中如有錯誤和理解偏差的地方,希望大家幫忙指出,我會持續修改和優化。本文是該系列的第一篇,主要介紹Java8對屌絲碼農最有吸引力的一個特性—lambda表達式。java8的安裝工欲善其器必先利其器,首先安裝JDK8。過程省略,大家應該都可以自己搞定。
  • 用最傻瓜式的方法理解Java中的封裝、繼承和多態
    說到java中面向對象的封裝、繼承和多態,很多人會說這麼簡單這麼入門的東西一直講幹嘛,雖然是基礎,但是我們要明白,所有東西都是要在基礎上發展的,沒有基礎就去學其他的,那麼你肯定是很容易失敗的,那麼應該怎樣能夠用傻瓜式方法去理解Java面向對象的封裝、繼承和多態呢?
  • 深入分析java中的多態(從jvm角度分析)
    對於java中多態概念的理解一直是面試常問的問題,所以今天花了一些時間好好地整理了一下,力求從java虛擬機的角度來分析和理解多態。一、認識多態1、方法調用在Java中,方法調用有兩類,動態方法調用與靜態方法調用。
  • Android被指抄襲Java代碼引爭議
    (轉自谷奧)首先是第一組的7個抄襲的java文件(PolicyNodeImpl.java, AclEntryImpl.java, AclImpl.java, GroupImpl.java, OwnerImpl.java, PermissionImpl.java 和 PrincipalImpl.java)都屬於原始碼裡的測試分支。任何程式設計師都不會將測試代碼放到最終發布的產品裡。
  • JavaScript中的多態性
    介紹面向對象編程中的多態性是能夠創建具有多種形式的變量,函數或對象。背景多態性在面向對象編程中的主要用途是屬於不同類型的對象響應相同名稱的方法,欄位或屬性調用的能力,每個對象根據適當的類型特定行為進行響應。程式設計師不必事先知道對象的確切類型,因此確切的行為是在運行時確定的。
  • 學習java的優勢是什麼?學習難度怎麼樣
    學習java成為了現在比較熱門的話題。Java是一種可以撰寫跨平臺應用軟體的面向對象的程序設計語言。  他容易學而且很好用,如果你學習過C++語言,你會覺得C++和Java很像,因為Java中許多基本語句的語法和C++一樣,像常用的循環語句,控制語句等和C++幾乎一樣,其實Java和C++是兩種完全不同的語言,Java只需理解一些基本的概念,就可以用它編寫出適合於各種情況的應用程式。同時截止到2018年8月,java領先其它語言幾乎4.5%。為世界第一程式語言。
  • Java反射初探 ——「當類也學會照鏡子」
    動態加載類 我理解的「反射」的意義(僅個人理解哈) 我理解的java反射機制就是: 提供一套完善而強大的API「反射「類的結構。 所以我們可以其實可以將java中的對象分為兩種: 1.:import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method; public class Test {  public static void printClassMessage (Object obj)