避免踩坑:抽象方法吃的法重写指南
浣犳湁娌℃湁璇曡繃鍐橨ava鎶借薄鏂规硶鏃讹紝鏄庢槑鐓х潃鏁欑▼鏁蹭唬鐮侊紝涓€杩愯鍗寸柉鐙傛姤閿欙紵鐗瑰埆鏄噸鍐欓偅涓?code>eat()鏂规硶鏃讹紝涓嶆槸灏戜釜鎷彿灏辨槸婕忎簡鍒嗗彿锛屾皵寰楁兂鐮搁敭鐩橈紵鍒厡锛佷粖澶╁挶浠氨鍞犲敔鈥?strong>鈥嬫娊璞℃柟娉曢噸鍐欑殑閬垮潙鎸囧崡鈥?/strong>鈥嬶紝涓撴不鍚勭鎵嬫姈鍜屾嚨鍦堬紒
涓€銆佸厛鎼炴槑鐧斤細鎶借薄鏂规硶鍒板簳鏄釜鍟ョ帺鎰忓効锛?/h3>
鎯宠薄浣犲紑瀹犵墿搴楋紝鐙楀悆楠ㄥご銆佺尗鍚冮奔銆佸厰瀛愬晝钀濆崪銆傝櫧鐒堕兘鍦ㄢ€滃悆鈥濓紝浣嗗叿浣撳姩浣滃畬鍏ㄤ笉鍚屻€傝繖鏃跺€?code>Animal绫婚噷鐨?code>eat()鏂规硶鈥?strong>鈥嬪彧鑳藉0鏄庤鍒欙紝涓嶈兘鍐欏叿浣撳姩浣溾€?/strong>鈥嬧€斺€旇繖灏辨槸鎶借薄鏂规硶锛?br/> 鈥?strong>鈥嬪叧閿壒寰佲€?/strong>鈥嬶細
- 鈥?strong>鈥嬪彧鏈夊0鏄庯紝娌℃湁鏂规硶浣撯€?/strong>鈥嬶紒缁撳熬鏄垎鍙蜂笉鏄ぇ鎷彿
閿欒绀鸿寖锛?code>public void eat() { } 鉂?锛堣繖鎴愪簡鏅€氭柟娉曪級
姝g‘濮垮娍锛?code>public abstract void eat(); 鉁?锛堟敞鎰忓垎鍙凤紒锛?/li> - 鈥?strong>鈥嬪繀椤讳綇鍦ㄦ娊璞$被閲屸€?/strong>鈥嬶紒鏅€氱被鏁㈠啓鎶借薄鏂规硶锛熺紪璇戝櫒鍒嗗垎閽熸暀浣犲仛浜?/li>
- 鈥?strong>鈥嬪瓙绫讳笉閲嶅啓灏辨姤閿欌€?/strong>鈥嬶紒杩欐槸鎶借薄鏂规硶鐨勨€滈湼鐜嬫潯娆锯€濃€斺€旈€肩潃瀛愮被蹇呴』瀹炵幇瀹?/li>
浜屻€侀噸鍐欐娊璞℃柟娉曠殑涓夊ぇ閾佸緥锛堣繚鍙嶅繀宕╋紒锛?/h3>
1锔忊儯 鈥?strong>鈥嬫柟娉曠鍚嶅繀椤讳竴妯′竴鏍封€?/strong>鈥?/h4>
灏卞儚韬唤璇佸彿鐮侊紝鈥?strong>鈥嬫柟娉曞悕+鍙傛暟鍒楄〃+杩斿洖绫诲瀷鈥?/strong>鈥嬪叏寰楀寰椾笂锛佸樊涓€涓瓧绗﹂兘涓嶈锛?/p>
java澶嶅埗// 鐖剁被鎶借薄鏂规硶 public abstract void eat(String food); // 瀛愮被姝g‘閲嶅啓 @Override public void eat(String food) { ... } 鉁? // 瀛愮被浣滄鍐欐硶 public void Eat(String food) { ... } 鉂?鏂规硶鍚嶉瀛楁瘝澶у啓 public void eat() { ... } 鉂?鍙傛暟灏戜簡涓猄tring public String eat(String food) { ...}鉂?杩斿洖绫诲瀷浠?span>void鍙樻垚String
2锔忊儯 鈥?strong>鈥嬭闂潈闄愬彧鑳芥洿瀹芥澗鈥?/strong>鈥?/h4>
鈥?strong>鈥嬬埗绫籶ublic锛屽瓙绫讳笉鑳界缉鎴恜rotected鈥?/strong>鈥嬶紒閬撶悊寰堢畝鍗曪細瀛愮被瑕佹瘮鐖剁被鈥滃ぇ鏂光€?/p>
鐖剁被锛?code>protected abstract void eat();
瀛愮被鍙敼鎴愶細public void eat() { }
鉁?br/> 浣嗙粷涓嶈兘锛?code>private void eat() { } 鉂?锛堣棌璧锋潵涓嶈璋冪敤锛熸病闂紒锛?/p>
3锔忊儯 鈥?strong>鈥嬪紓甯镐笉鑳戒贡鎶涒€?/strong>鈥?/h4>
鈥?strong>鈥嬪瓙绫绘姏鐨勫紓甯镐笉鑳芥瘮鐖剁被鏇村娉涒€?/strong>鈥嬶紒姣斿鐖剁被鎶?code>IOException锛屽瓙绫绘姏Exception
灏辩偢浜嗭紙鍥犱负Exception鍖呭惈IO寮傚父锛夈€傜ǔ濡ュ仛娉曪細
瑕佷箞涓嶆姏寮傚父
瑕佷箞鎶涙洿鍏蜂綋鐨勫紓甯革紙姣斿FileNotFoundException
锛?/p>
涓夈€佹柊鎵嬬炕杞︾幇鍦篢OP3锛堥檮鎶㈡晳鏂规锛?/h3>
馃殤 鈥?strong>鈥嬪潙1锛氬繕璁板啓鏂规硶浣撯€?/strong>鈥?/h4>
鎶借薄鏂规硶娌?code>{}锛屼絾鈥?strong>鈥嬪瓙绫婚噸鍐欏繀椤诲甫鏂规硶浣撯€?/strong>鈥嬶紒
java澶嶅埗class Dog extends Animal { @Override public void eat(); 鉂?// 婕忎簡澶ф嫭鍙穥} }
鈥?strong>鈥嬫姠鏁戔€?/strong>鈥嬶細琛ヤ笂{ }
鍝€曢噷闈㈡槸绌虹殑锛?/p>
馃殤 鈥?strong>鈥嬪潙2锛氭墜鎶栧啓閿欐敞瑙b€?/strong>鈥?/h4>
@Override
涓嶆槸瑁呴グ鍝侊紒瀹冭兘鑷姩妫€鏌ラ噸鍐欐槸鍚︽纭€傛紡鍐欏畠锛熼敊鎴?code>@Overide锛熺瓑鐫€鑾悕鍏跺鎶ラ敊鍚э紒
java澶嶅埗class Cat extends Animal { @Overide 鉂?// 鎷奸敊鎴怬veride public void eat() { ... } }
鈥?strong>鈥嬫姠鏁戔€?/strong>鈥嬶細鑰佽€佸疄瀹炲啓@Override
馃殤 鈥?strong>鈥嬪潙3锛氬瓙绫绘病閲嶅啓鍏ㄢ€?/strong>鈥?/h4>
濡傛灉鎶借薄绫绘湁2涓娊璞℃柟娉曪紙姣斿eat()
+sleep()
锛夛紝鈥?strong>鈥嬪瓙绫诲繀椤诲叏閮ㄩ噸鍐欌€?/strong>鈥嬶紒鍚﹀垯缂栬瘧鐩存帴鍗′綇锛?/p>
java澶嶅埗abstract class Animal { public abstract void eat(); public abstract void sleep(); // 涓や釜鎶借薄鏂规硶锛?/span> } class LazyDog extends Animal { @Override public void eat() { ... } 鉁? // 蹇樹簡sleep()锛?鉂?閿欒锛歀azyDog蹇呴』鏄痑bstract }
鈥?strong>鈥嬫姠鏁戔€?/strong>鈥嬶細瑕佷箞琛ュ叏鎵€鏈夋娊璞℃柟娉曪紝瑕佷箞鎶婂瓙绫讳篃鏀规垚abstract class
鍥涖€佺伒榄傛嫹闂細涓哄暐闈炲緱鐢ㄦ娊璞℃柟娉曪紵鏅€氭柟娉曚笉琛屽悧锛?/h3>
鈥?strong>鈥嬮棶鈥?/strong>鈥嬶細鎴戝湪鐖剁被鍐欎釜鏅€?code>eat()绌烘柟娉曪紝瀛愮被鐖遍噸鍐欎笉閲嶅啓锛屼笉鏇磋嚜鐢憋紵
鈥?strong>鈥嬬瓟鈥?/strong>鈥嬶細澶ч敊鐗归敊锛佷妇涓敮浠樼郴缁熺殑渚嬪瓙锛?/p>
濡傛灉
Payment
绫荤敤鏅€氭柟娉曪細java澶嶅埗class Payment { public void pay() { } // 绌烘柟娉?/span> } class Alipay extends Payment { } // 鎳掍汉娌¢噸鍐?/span>
缁撴灉鐢ㄦ埛鐐瑰嚮鏀粯鈥斺€斺€?strong>鈥嬫牴鏈病鎵i挶锛佲€?/strong>鈥?/p>
鐢ㄦ娊璞℃柟娉曢€间綘閲嶅啓锛?/p>
java澶嶅埗abstract class Payment { public abstract void pay(); // 涓嶉噸鍐欙紵浠g爜閮借窇涓嶈捣鏉ワ紒 } class Alipay extends Payment { @Override public void pay() { // 涓嶅緱涓嶅啓鏀粯閫昏緫 System.out.println("鏀粯瀹濇墸娆炬垚鍔燂紒"); } }
鈥?strong>鈥嬫娊璞℃柟娉曞氨鏄槻鎽搁奔绁炲櫒鈥?/strong>鈥嬶細涓嶅疄鐜帮紵鍒兂缂栬瘧閫氳繃锛?/p>
浜斻€佹娊璞$被 vs 鎺ュ彛锛氬埌搴曠敤鍝釜锛?/h3>
寰堝灏忕櫧鍒嗕笉娓咃紝涓€寮犺〃璇撮€忥細
鈥?strong>鈥嬪姣旈」鈥?/strong>鈥?/th> | 鈥?strong>鈥嬫娊璞$被鈥?/strong>鈥?/th> | 鈥?strong>鈥嬫帴鍙b€?/strong>鈥?/th> |
---|---|---|
鈥?strong>鈥嬫柟娉曗€?/strong>鈥?/td> | 鍙惈鏅€氭柟娉?鎶借薄鏂规硶 | 鍏ㄦ槸鎶借薄鏂规硶锛圝ava 8鍓嶏級 |
鈥?strong>鈥嬪彉閲忊€?/strong>鈥?/td> | 鏅€氬彉閲?甯搁噺 | 鍙兘鏄?code>public static final甯搁噺 |
鈥?strong>鈥嬬户鎵库€?/strong>鈥?/td> | 鈥?strong>鈥嬪崟缁ф壙鈥?/strong>鈥嬶紙瀛愮被鍙兘鏈変竴涓埗绫伙級 | 鈥?strong>鈥嬪瀹炵幇鈥?/strong>鈥嬶紙涓€涓被鍙帴澶氫釜鎺ュ彛锛?/td> |
鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥?/td> | 鈥?strong>鈥?鏄粈涔?鈥?/strong>鈥嬶紙濡傜嫍鏄竴绉嶅姩鐗╋級 | 鈥?strong>鈥?鑳藉仛浠€涔?鈥?/strong>鈥嬶紙濡備細椋炪€佷細娓告吵锛?/td> |
鈥?strong>鈥嬩妇涓牀瀛愨€?/strong>鈥嬶細
- 鎶借薄绫伙細
Animal
锛堢嫍/鐚殑鐖剁被锛岄兘鏈?code>age灞炴€у拰eat()
琛屼负锛?/li> - 鎺ュ彛锛?code>Flyable锛堥鏈恒€侀笩閮借兘瀹炵幇
fly()
锛屼絾瀹冧咯涓嶆槸鍚岀被锛?/li>
灏忕紪瑙傜偣
鎶借薄鏂规硶閲嶅啓鐪嬩技鏄娉曢棶棰橈紝鈥?strong>鈥嬫湰璐ㄦ槸闈㈠悜瀵硅薄鐨勮璁″绾︹€?/strong>鈥嬧€斺€旂埗绫荤珛瑙勭煩锛屽瓙绫诲畧瑙勭煩銆傚垰寮€濮嬩綘鍙兘瑙夊緱杩欎簺瑙勫垯鐑︿汉锛屼絾鍐欏浜嗕細鍙戠幇锛?/p>
鈥?strong>鈥嬭秺鏄弗鏍肩殑瑙勫畾锛岃秺鑳介伩鍏嶅崐澶滄壘bug鐨勫穿婧冿紒鈥?/strong>鈥?br/> 涓嬫鍐嶅啓
eat()
鏃讹紝璁颁綇涓夌偣锛氣€?strong>鈥嬬鍚嶅埆鎵嬫姈銆佹潈闄愬埆缂╁皬銆佸紓甯稿埆涔辨姏鈥?/strong>鈥嬨€傝俯鍧戯紵涓嶅瓨鍦ㄧ殑锛?/p>
锛堢湅鍒拌繖鍎胯繕鎳碉紵璇勮鍖虹敥浠g爜锛屾垜甯綘鐬呯瀰锛侊級
本文由嘻道妙招独家原创,未经允许,严禁转载