Java中的重寫和隱藏是面向?qū)ο笾械膬蓚€重要概念,很多初學(xué)者容易把兩者混淆。下面我們來詳細解析它們之間的區(qū)別。
重寫(Override):
重寫是指在子類中編寫一個與父類中同名、同參數(shù)、同返回值類型的方法,這個子類方法的代碼實現(xiàn)會覆蓋原父類方法的實現(xiàn)。
在重寫時,子類方法的訪問修飾符不能低于父類方法的訪問修飾符。如果父類方法是public,那么子類方法也必須是public,如果父類方法是protected,那么子類方法可以是protected或public,而不能是private。
public class Animal { public void eat() { System.out.println("Animal is eating."); } } public class Cat extends Animal { public void eat() { System.out.println("Cat is eating."); } } public class Test { public static void main(String[] args) { Animal animal = new Cat(); animal.eat(); //輸出結(jié)果:Cat is eating. } }
隱藏(Hide):
隱藏是指子類中定義了一個與父類中同名但是參數(shù)列表不同的方法,這個子類方法不會覆蓋父類中的方法,而是在子類中獨立存在。隱藏發(fā)生在同一個類中或者是繼承關(guān)系的子類中。
在隱藏時,子類方法的訪問修飾符可以低于父類方法的訪問修飾符。如果父類方法是public,那么子類方法可以是public、protected或private,如果父類方法是protected,那么子類方法可以是protected或private,而不能是public。
public class Animal { public void eat() { System.out.println("Animal is eating."); } } public class Cat extends Animal { private void eat(String food) { System.out.println("Cat is eating " + food); } } public class Test { public static void main(String[] args) { Cat cat = new Cat(); cat.eat("fish"); //輸出結(jié)果:Cat is eating fish cat.eat(); //編譯會報錯,因為Cat類中不存在無參的eat方法 } }
通過上述對重寫和隱藏的分析,我們可以看出,重寫是在子類中對父類方法的重寫實現(xiàn),而隱藏是在子類中定義一個與父類同名但參數(shù)列表不同的方法。