电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則

瀏覽:4日期:2022-08-15 09:35:07

CSDN 的小伙伴們,大家好,我是沉默王二。

重寫(Overriding)算是 Java 中一個(gè)非常重要的概念,理解重寫到底是什么對(duì)每個(gè) Java 程序員來說都至關(guān)重要,這篇文章就來給大家說說重寫過程中應(yīng)當(dāng)遵守的 12 條規(guī)則。

01、什么是重寫?

重寫帶來了一種非常重要的能力,可以讓子類重新實(shí)現(xiàn)從超類那繼承過來的方法。在下面這幅圖中,Animal 是父類,Dog 是子類,Dog 重新實(shí)現(xiàn)了 move() 方法用來和父類進(jìn)行區(qū)分,畢竟狗狗跑起來還是比較有特色的。

Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則

重寫的方法和被重寫的方法,不僅方法名相同,參數(shù)也相同,只不過,方法體有所不同。

02、哪些方法可以被重寫?

規(guī)則一:只能重寫繼承過來的方法。

因?yàn)橹貙懯窃谧宇愔匦聦?shí)現(xiàn)從父類繼承過來的方法時(shí)發(fā)生的,所以只能重寫繼承過來的方法,這很好理解。這就意味著,只能重寫那些被 public、protected 或者 default 修飾的方法,private 修飾的方法無法被重寫。

Animal 類有 move()、eat() 和 sleep() 三個(gè)方法:

public class Animal { public void move() { } protected void eat() { } void sleep(){ }}

Dog 類來重寫這三個(gè)方法:

public class Dog extends Animal { public void move() { } protected void eat() { } void sleep(){ }}

OK,完全沒有問題。但如果父類中的方法是 private 的,就行不通了。

public class Animal { private void move() { }}

此時(shí),Dog 類中的 move() 方法就不再是一個(gè)重寫方法了,因?yàn)楦割惖?move() 方法是 private 的,對(duì)子類并不可見。

public class Dog extends Animal { public void move() { }}03、哪些方法不能被重寫?

規(guī)則二:final、static 的方法不能被重寫。

一個(gè)方法是 final 的就意味著它無法被子類繼承到,所以就沒辦法重寫。

public class Animal { final void move() { }}

由于父類 Animal 中的 move() 是 final 的,所以子類在嘗試重寫該方法的時(shí)候就出現(xiàn)編譯錯(cuò)誤了!

Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則

同樣的,如果一個(gè)方法是 static 的,也不允許重寫,因?yàn)殪o態(tài)方法可用于父類以及子類的所有實(shí)例。

public class Animal { final void move() { }}

重寫的目的在于根據(jù)對(duì)象的類型不同而表現(xiàn)出多態(tài),而靜態(tài)方法不需要?jiǎng)?chuàng)建對(duì)象就可以使用。沒有了對(duì)象,重寫所需要的“對(duì)象的類型”也就沒有存在的意義了。

Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則

04、重寫方法的要求

規(guī)則三:重寫的方法必須有相同的參數(shù)列表。

public class Animal { void eat(String food) { }}

Dog 類中的 eat() 方法保持了父類方法 eat() 的同一個(gè)調(diào)調(diào),都有一個(gè)參數(shù)——String 類型的 food。

public class Dog extends Animal { public void eat(String food) { }}

一旦子類沒有按照這個(gè)規(guī)則來,比如說增加了一個(gè)參數(shù):

public class Dog extends Animal { public void eat(String food, int amount) { }}

這就不再是重寫的范疇了,當(dāng)然也不是重載的范疇,因?yàn)橹剌d考慮的是同一個(gè)類。

規(guī)則四:重寫的方法必須返回相同的類型

父類沒有返回類型:

public class Animal { void eat(String food) { }}

子類嘗試返回 String:

public class Dog extends Animal { public String eat(String food) { return null; }}

于是就編譯出錯(cuò)了(返回類型不兼容)。

Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則

規(guī)則五:重寫的方法不能使用限制等級(jí)更嚴(yán)格的權(quán)限修飾符。

可以這樣來理解:

如果被重寫的方法是 default,那么重寫的方法可以是 default、protected 或者 public。 如果被重寫的方法是 protected,那么重寫的方法只能是 protected 或者 public。 如果被重寫的方法是 public, 那么重寫的方法就只能是 public。

舉個(gè)例子,父類中的方法是 protected:

public class Animal { protected void eat() { }}

子類中的方法可以是 public:

public class Dog extends Animal { public void eat() { }}

如果子類中的方法用了更嚴(yán)格的權(quán)限修飾符,編譯器就報(bào)錯(cuò)了。

Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則

規(guī)則六:重寫后的方法不能拋出比父類中更高級(jí)別的異常。

舉例來說,如果父類中的方法拋出的是 IOException,那么子類中重寫的方法不能拋出 Exception,可以是 IOException 的子類或者不拋出任何異常。這條規(guī)則只適用于可檢查的異常。

可檢查(checked)異常必須在源代碼中顯式地進(jìn)行捕獲處理,不檢查(unchecked)異常就是所謂的運(yùn)行時(shí)異常,比如說 NullPointerException、ArrayIndexOutOfBoundsException 之類的,不會(huì)在編譯器強(qiáng)制要求。

父類拋出 IOException:

public class Animal { protected void eat() throws IOException { }}

子類拋出 FileNotFoundException 是可以滿足重寫的規(guī)則的,因?yàn)?FileNotFoundException 是 IOException 的子類。

public class Dog extends Animal { public void eat() throws FileNotFoundException { }}

如果子類拋出了一個(gè)新的異常,并且是一個(gè) checked 異常:

public class Dog extends Animal { public void eat() throws FileNotFoundException, InterruptedException { }}

那編譯器就會(huì)提示錯(cuò)誤:

Error:(9, 16) java: com.itwanger.overriding.Dog中的eat()無法覆蓋com.itwanger.overriding.Animal中的eat() 被覆蓋的方法未拋出java.lang.InterruptedException

但如果子類拋出的是一個(gè) unchecked 異常,那就沒有沖突:

public class Dog extends Animal { public void eat() throws FileNotFoundException, IllegalArgumentException { }}

如果子類拋出的是一個(gè)更高級(jí)別的異常:

public class Dog extends Animal { public void eat() throws Exception { }}

編譯器同樣會(huì)提示錯(cuò)誤,因?yàn)?Exception 是 IOException 的父類。

Error:(9, 16) java: com.itwanger.overriding.Dog中的eat()無法覆蓋com.itwanger.overriding.Animal中的eat() 被覆蓋的方法未拋出java.lang.Exception

05、如何調(diào)用被重寫的方法?

規(guī)則七:可以在子類中通過 super 關(guān)鍵字來調(diào)用父類中被重寫的方法

子類繼承父類的方法而不是重新實(shí)現(xiàn)是很常見的一種做法,在這種情況下,可以按照下面的形式調(diào)用父類的方法:

super.overriddenMethodName();

來看例子。

public class Animal { protected void eat() { }}

子類重寫了 eat() 方法,然后在子類的 eat() 方法中,可以在方法體的第一行通過 super.eat() 調(diào)用父類的方法,然后再增加屬于自己的代碼。

public class Dog extends Animal { public void eat() { super.eat(); // Dog-eat }}06、重寫和構(gòu)造方法

規(guī)則八:構(gòu)造方法不能被重寫。

因?yàn)闃?gòu)造方法很特殊,而且子類的構(gòu)造方法不能和父類的構(gòu)造方法同名(類名不同),所以構(gòu)造方法和重寫之間沒有任何關(guān)系。

07、重寫和抽象方法

規(guī)則九:如果一個(gè)類繼承了抽象類,抽象類中的抽象方法必須在子類中被重寫。

先來看這樣一個(gè)接口類:

public interface Animal { void move();}

接口中的方法默認(rèn)都是抽象方法,通過反編譯是可以看得到的:

public interface Animal{ public abstract void move();}

如果一個(gè)抽象類實(shí)現(xiàn)了 Animal 接口,move() 方法不是必須被重寫的:

public abstract class AbstractDog implements Animal { protected abstract void bark();}

但如果一個(gè)類繼承了抽象類 AbstractDog,那么 Animal 接口中的 move() 方法和抽象類 AbstractDog 中的抽象方法 bark() 都必須被重寫:

public class BullDog extends AbstractDog { public void move() {} protected void bark() {}}08、重寫和 synchronized 方法

規(guī)則十:synchronized 關(guān)鍵字對(duì)重寫規(guī)則沒有任何影響。

synchronized 關(guān)鍵字用于在多線程環(huán)境中獲取和釋放監(jiān)聽對(duì)象,因此它對(duì)重寫規(guī)則沒有任何影響,這就意味著 synchronized 方法可以去重寫一個(gè)非同步方法。

09、重寫和 strictfp 方法

規(guī)則十一:strictfp 關(guān)鍵字對(duì)重寫規(guī)則沒有任何影響

如果你想讓浮點(diǎn)運(yùn)算更加精確,而且不會(huì)因?yàn)橛布脚_(tái)的不同導(dǎo)致執(zhí)行的結(jié)果不一致的話,可以在方法上添加 strictfp 關(guān)鍵字。因此 strictfp 關(guān)鍵和重寫規(guī)則無關(guān)。

到此這篇關(guān)于Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則的文章就介紹到這了,更多相關(guān)Java 重寫規(guī)則內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 智慧农业|农业物联网|现代农业物联网-托普云农物联网官方网站 | 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | 高硼硅玻璃|水位计玻璃板|光学三棱镜-邯郸奥维玻璃科技有限公司 高温高压釜(氢化反应釜)百科 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 广东成考网-广东成人高考网| 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 传动滚筒_厂家-淄博海恒机械制造厂 | 硫化罐-电加热蒸汽硫化罐生产厂家-山东鑫泰鑫智能装备有限公司 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 广州市哲铭油墨涂料有限公司,水性漆生产研发基地 | 缝纫客| 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 企业微信scrm管理系统_客户关系管理平台_私域流量运营工具_CRM、ERP、OA软件-腾辉网络 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 南方珠江-南方一线电缆-南方珠江科技电缆-南方珠江科技有限公司 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | OLChemim试剂-ABsciex耗材-广州市自力色谱科仪有限公司 | 艺术涂料_进口艺术涂料_艺术涂料加盟_艺术涂料十大品牌 -英国蒙太奇艺术涂料 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 阻垢剂-反渗透缓蚀阻垢剂厂家-山东鲁东环保科技有限公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 联系我们老街华纳娱乐公司官网19989979996(客服) | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 热闷罐-高温罐-钢渣热闷罐-山东鑫泰鑫智能热闷罐厂家 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 |