黑马程序员技术交流社区
标题:
继承中的一个小问题
[打印本页]
作者:
逆袭的风
时间:
2013-8-6 10:08
标题:
继承中的一个小问题
本帖最后由 逆袭的风 于 2013-8-6 21:51 编辑
今天突然突发奇想敲了如下代码
/*
验证能不能用子类抽象方法重父类实例方法
*/
class Fu
{
void eat()
{
System.out.println("吃货");
}
void sleep()
{
System.out.println("吃饱就睡");
}
}
abstract class Zi extends Fu//定义一个抽象子类
{
void play()
{
System.out.println("偶尔玩玩也不错嘛");
}
abstract void eat();//用抽象方法重写父类实例方法
}
class A extends Zi
{
void eat()
{
System.out.println("吃点好的");
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
A a=new A();
a.eat();
a.sleep();
a.play();
}
}
复制代码
他还编译运行了
那为什么可以用子类中的抽象方法重写父类中的实例方法呢??????????
作者:
Mr_Free
时间:
2013-8-6 10:19
覆盖的前提是,父类中方法和子类中的方法 参数列表 ,方法名,返回值 都相同,而且只要子类方法的权限大于父类,子类的方法就能复写父类方法的功能。
并没有说父类是实例方法,子类就不能用抽象方法覆盖了。只要满足覆盖的前提条件就行。
作者:
yan
时间:
2013-8-6 10:21
我的理解是这样的,你的A是ZI的子类 ,A中的void eat()方法重写了ZI中的void eat() 方法,而ZI又重写了Fu的 void eat(),因此运行的是A中的方法,所以可以编译运行,希望能帮助到你
作者:
哪颗最亮的星星
时间:
2013-8-6 10:22
抽象类也是类的一种,只是它的方法没有具体的动作而已,父类可以被子类覆盖,改变方法里的行为,当然也可以被抽象的子类覆盖,改变不明确的行为!!!
作者:
草帽
时间:
2013-8-6 11:15
我觉得能不能要从覆写(Overriding)的定义原则上来说。
Java中,子类默认可以继承父类中的方法,而不需要重新编写相同的方法,但是有时候,子类并不想原封不动的继承父类中的方法,而是做出一定的修改,这就是采用方法的覆写(也成为覆盖)来实现的。Java中覆写指的是,在子类中对父类中同一重名函数实现部分加以改变,但与父类的该方法的方法名、返回类型和参数列表都保持一致。即子类对父类中的函数进行重新定义,子类中的新方法将覆盖父类原有的方法。覆写是父类与子类之间的一种多态表现。
作者:
taotao
时间:
2013-8-6 11:24
这个例子说明,只要符合覆盖条件,子类方法就能覆盖父类方法!只是这种做法很2,完全颠覆了我们用覆盖的意图。
作者:
清心玉质
时间:
2013-8-6 11:35
虽然定义成抽象方法,但是并没有缩小父类的访问全新,也没有跑出更多异常,完全符合覆盖条件。
作者:
kime
时间:
2015-7-2 23:32
抽象方法是没有方法体的,没有方法实现部分,因此是不能重写父类的方法的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2