1. 主页 > 大智慧

避免踩坑:抽象方法吃的法重写指南

浣犳湁娌℃湁璇曡繃鍐橨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爜锛屾垜甯綘鐬呯瀰锛侊級

本文由嘻道妙招独家原创,未经允许,严禁转载