4 回答
TA贡献1798条经验 获得超3个赞
你父类有的特性派生类肯定有,你子类有的特性父类不一定有。
因此你把父类的特性(方法)去掉,而你申明的又是父类的数组,编译器当然不知道你会塞个什么东西进去,所以会报错咯。
父类不能访问子类这个也正常,你子类可能有自己的特殊性,那么我父类去访问的时候怎么知道这些东西呢?而且在对象构造时子类的构造函数在执行时第一步就是去super父类,那么也就说明了现有父类后有子类,如果能够让父类去访问子类的信息这个就会出现问题(这个时候子类还没完成构造工作)。
shapes[0].area()这个具体是谁的area方法要看你shapes[0]里面是谁了,如果是Circle而且它又override掉了父类的这个方法那就是Circle的了,如果没有override那么就是父类的了。这个解释也很简单,主要是看shapes[0]在运行时是谁,这是面相对象语言本来的特性。
抽象方法是子类的统一入口这个描述不太准确,一个是方法,一个是对象实例,这两个没关系。抽象方法需要在其派生类中去实现,而抽象方法本身仅作为一种契约而已,这个不是这个方法的唯一入口,如果你直接Circle c=new Circle()后还是可以执行这个方法(这个被override方法本来就属于Circle对象)
TA贡献1827条经验 获得超9个赞
@小梁丶:
针对这个场景吧。
Shape shape=new Circle();
shape.area();
这个在实际调用的时候area方法是个虚方法,那么需要根据对象派生关系找到实际调用方法的来源,由于你Circle已经override掉了此方法,而且此处实例化的实例是Circle,那么当然就调用Circle的方法了。
添加回答
举报
