Fu f=new Zi()这句话是父类的变量指向子类实例对象。但是f始终是父类类型的一个变量,父类中没有的方法是不能调用的。之所以f.show()显示的是zi,是因为子类show方法覆盖了父类show方法,相当于重写了。
子类和父类的关系你似乎不太清楚。
重写多态特性,有同名方法调用子类的;父类中没有show()方法,子类中有不属于重写,f为父类的引用,f.show()调用父类中的show()方法,此时父类中没有此方法,所以会报错
你好像没有理解方法重写的含义
这里有三个比较重要的概念:多态;重写与java编译时与运行时状态。
你所说的删除掉父类的show()方法后,实际是编译时报的错,因为在编译时类型是基类类型,而运行时是指向的实际对象的方法的类型,编译的基类
里没有该方法,当然会报错。
你用的是父类的类型创建的f对象,虽然用的是子类的构造器,可是类型是父类的啊,父类明显删除以后明显没有这个方法,编译器就认为没有这个方法。
如果用子类类型创建对象,删了父类的方法也可以,不过这个不是父类继承来的方法,是子类的方法了吧。比如Zi f=new Zi();
删除父类show方法后,父类就没有show方法了。调用不存在的方法,当然会报错。