這是java多態的一個體現,如果一個類classA繼承了類classB,有實現了接口interfaceA,並且接口中有方法funA(),且父類classB中也有funA(),那么對於classA來說既可以重寫這個方法也可以不重寫。
父類:
public class MySuperClass { public int getData(){ return 100; } }
接口:
public interface MyInterface{ public int getData();//與父類重名的方法 public void todosomethings(); }
子類:
public class MyTest extends MySuperClass implements MyInterface{ public static void main(String[] args) { MyTest mt = new MyTest(); System.out.println(mt.getData()); MySuperClass msc = new MyTest(); System.out.println(msc.getData()); } @Override public void todosomethings() { // TODO Auto-generated method stub } @Override public int getData() { // TODO Auto-generated method stub return 10; } }
當繼承父類並且同時實現接口的時候會自動提示實現接口獨有的方法todosomethings(),並不提示要實現getData()方法,如果此時測試執行getData將會調用父類的方法。
如果選擇自己重寫getData方法,那么就會執行自己重寫的方法。多態:父類引用指向了子類對象,如何理解這句話父類引用是"MySuperClass msc" 這句話定義了msc這個引用,
但是它指向的的(=)卻是子類的對象 new Mytest(),因此棧空間里的msc指向了堆空間里的Mytest,當執行getData()方法的時候java的JVM會先找子類是否重寫了這個方法,如果沒有才會執行父類的方法。
因此執行的結果是:
10
10