摘要:把這種對(duì)某個(gè)對(duì)象的引用視為對(duì)其基類(lèi)的引用的做法被稱(chēng)作向上轉(zhuǎn)型?;蛘呃^承或者重寫(xiě)了的問(wèn)題從子類(lèi)向上轉(zhuǎn)型到父類(lèi),可能會(huì)縮小接口。因?yàn)橄蛏限D(zhuǎn)型之后使用引用進(jìn)行訪(fǎng)問(wèn),只能訪(fǎng)問(wèn)父類(lèi)定義的接口,而不能訪(fǎng)問(wèn)自己定義的新接口。
preliminary
最近在讀Thinking in Java這篇是一個(gè)基本此書(shū)的整理。
對(duì)象既可以作為它本身的類(lèi)型使用,也可以作為它的基類(lèi)類(lèi)型使用(upcast)。
把這種對(duì)某個(gè)對(duì)象的引用 視為 對(duì)其基類(lèi)的引用的做法被稱(chēng)作向上轉(zhuǎn)型。
舉例
父類(lèi) Instrument
子類(lèi) Wind
子類(lèi)重寫(xiě)了play方法
javaclass Instrument { public void play(Note n){ Prt.prt("Instrument.play()"); } } class Wind extends Instrument{ public void play(Note n){ Prt.prt("Wind.play()" + n); } } public class Music { public static void tune(Instrument i) { i.play(Note.MIDDLE_C); } public static void main(String[] args) { Instrument flute = new Wind(); tune(flute); } } output: Wind.play() MIDDLE_C
如果一個(gè)函數(shù)的方法Music.tune()接受一個(gè)Instrument的引用,那么它同時(shí)也接受任何Instrument的子類(lèi)(Wind)。
這說(shuō)明Instrument的接口必定存在于Wind中。(或者繼承/或者重寫(xiě)了)
從子類(lèi)向上轉(zhuǎn)型到父類(lèi),可能會(huì)縮小接口。因?yàn)橄蛏限D(zhuǎn)型之后使用Instrument引用進(jìn)行訪(fǎng)問(wèn),只能訪(fǎng)問(wèn)父類(lèi)Instrument定義的接口,而不能訪(fǎng)問(wèn)Wind自己定義的新接口。
為什么要用upcast?用了upcast就會(huì)讓子類(lèi)縮小接口,既然這樣,為什么要用upcast?
【減少代碼量】如果讓tune()方法接受一個(gè)Wind引用作為自己的參數(shù),似乎更為直觀(guān)。但是,如果這樣做,就需要系統(tǒng)為Instrument的每種類(lèi)型都編寫(xiě)一個(gè)tune方法。這就意味著在開(kāi)始時(shí)候,就需要更多的編程,這也意味著以后想添加類(lèi)似tune()新方法,或者添加自Instrument導(dǎo)出的新類(lèi),仍需要做大量的工作。
【重載】此外,如果我們忘記重載某個(gè)方法,編譯器也不會(huì)返回任何錯(cuò)誤info,關(guān)于類(lèi)型的整個(gè)處理過(guò)程,就難以操作.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64170.html
摘要:而面向?qū)ο髣t是向程序員提供表示問(wèn)題空間中元素的工具,我們將問(wèn)題空間中的元素及其在解空間中的表示稱(chēng)為對(duì)象。為什么要把對(duì)象看作是服務(wù)提供者呢這是將問(wèn)題分解為對(duì)象集合的一種合理方式。職能太多,可能會(huì)導(dǎo)致對(duì)象的內(nèi)聚性降低。在試圖將子類(lèi)對(duì)象當(dāng)作其基類(lèi) 計(jì)算機(jī)是頭腦延伸的工具,是一種不同類(lèi)型的表達(dá)媒體。本文以背景性的和補(bǔ)充性的材料,介紹包括開(kāi)發(fā)方法概述在內(nèi)的面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-orie...
摘要:構(gòu)造器沒(méi)有返回值一個(gè)對(duì)象變量并沒(méi)有實(shí)際包含一個(gè)對(duì)象,而僅僅引用一個(gè)對(duì)象,如有兩個(gè)部分。子類(lèi)重寫(xiě)方法的返回值范圍必須小于等于父類(lèi)方法的返回值。枚舉類(lèi)型中可以添加一些構(gòu)造器方法和域。 第三章 Java是一種強(qiáng)類(lèi)型語(yǔ)言。 https://blog.csdn.net/qq_3619... 在Java中,整型的范圍與機(jī)器無(wú)關(guān)。 int 4字節(jié) short 2字節(jié) long ...
摘要:所以靜態(tài)方法不能被覆蓋。雖然就算你重寫(xiě)靜態(tài)方法,編譯器也不會(huì)報(bào)錯(cuò)。也就是說(shuō),如果你試圖重寫(xiě)靜態(tài)方法,不會(huì)阻止你這么做,但你卻得不到預(yù)期的結(jié)果重寫(xiě)僅對(duì)非靜態(tài)方法有用。我們應(yīng)該直接使用類(lèi)名來(lái)訪(fǎng)問(wèn)靜態(tài)方法,而不要使用對(duì)象引用來(lái)訪(fǎng)問(wèn)。 重寫(xiě)/重載 重寫(xiě)指的是根據(jù)運(yùn)行時(shí)對(duì)象的類(lèi)型來(lái)決定調(diào)用哪個(gè)方法,而不是根據(jù)編譯時(shí)的類(lèi)型。所以靜態(tài)方法不能被覆蓋。 (如果從重寫(xiě)方法會(huì)有什么特點(diǎn)來(lái)看,我們是不能...
摘要:寫(xiě)在開(kāi)頭本篇是小紅書(shū)筆記的第六篇,也許你會(huì)奇怪第六篇筆記才寫(xiě)語(yǔ)法基礎(chǔ),筆者是不是穿越了??梢撇焦P者的文章中替換方式參考文檔高級(jí)程序設(shè)計(jì)作者以樂(lè)之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVblGMc?w=600&h=400); 寫(xiě)在開(kāi)頭 本篇是小紅書(shū)筆記的第六篇,也許你會(huì)奇怪第六篇筆記才寫(xiě)語(yǔ)法基礎(chǔ),筆者是不是穿越了。...
摘要:接口的概念接口的概念接口是功能的集合,同樣可看做是一種數(shù)據(jù)類(lèi)型,是比抽象類(lèi)更為抽象的類(lèi)。多態(tài)的前提是必須有子父類(lèi)關(guān)系或者類(lèi)實(shí)現(xiàn)接口關(guān)系,否則無(wú)法完成多態(tài)。 01接口的概念 * A:接口的概念 接口是功能的集合,同樣可看做是一種數(shù)據(jù)類(lèi)型,是比抽象類(lèi)更為抽象的類(lèi)。 接口只描述所應(yīng)該具備的方法,并沒(méi)有具體實(shí)現(xiàn),具體的實(shí)現(xiàn)由接口的實(shí)現(xiàn)類(lèi)(相當(dāng)于接口的子類(lèi))來(lái)完成。這樣將功能的定...
閱讀 3447·2023-04-25 18:03
閱讀 1214·2021-11-15 11:38
閱讀 5846·2021-10-25 09:45
閱讀 901·2021-09-24 09:48
閱讀 2415·2021-09-22 15:34
閱讀 1793·2019-08-30 15:44
閱讀 2748·2019-08-30 13:12
閱讀 651·2019-08-29 16:05