黑马程序员技术交流社区
标题:
显式的写明子类继承父类的方法,和不写有没有区别?
[打印本页]
作者:
刘云龙
时间:
2013-3-13 12:39
标题:
显式的写明子类继承父类的方法,和不写有没有区别?
本帖最后由 黄玉昆 于 2013-3-16 13:52 编辑
显式的写明子类继承父类的方法
,
和不写有没有区别
?
class AA
{
int num = 123;
void fun1()
{
System.out.println(fun2());
}
int fun2()
{
return num;
}
}
class BB extends AA
{
int num = 456;
int fun2() //此处如果注释掉fun2,结果会不同,既然说子类继承了父类的方法,即使不覆盖也是可以调用的,那么为什么显示的写明和不写明,结果却不同?
{
return num;
}
public static void main(String argv[])
{
AA a;
BB b = new BB();
b.fun1();
a = b; //多态
a.fun1();//
// System.out.println("a.num :"+a.num);
// System.out.println("b.num :"+b.num);
}
}
复制代码
作者:
437857487
时间:
2013-3-13 16:52
要是以实现的方法写不写都一样,但是一般继承后子类一般都会重写父类的方法。
作者:
黄玉昆
时间:
2013-3-13 18:29
我看了几遍,没太理解你的意思,你最好把代码写出来,这样会清晰一些,谢谢
作者:
scott0610
时间:
2013-3-13 18:50
@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法)。
希望对你有所帮助!
作者:
黑马-郑玉元
时间:
2013-3-13 19:04
真心的不懂你的意思!
作者:
IT菜鸟
时间:
2013-3-13 22:13
说明白点呗
作者:
张雪萍
时间:
2013-3-15 09:37
class AA
{
int num = 123;
void fun1()
{
System.out.println(fun2());
}
int fun2()
{
return num;
}
}
class BB extends AA
{
int num = 456;
int fun2() //此处如果注释掉fun2,结果会不同,既然说子类继承了父类的方法,即使不覆盖也是可以调用的,那么为什么显示的写明和不写明,结果却不同?
{
return num;
}
public static void main(String argv[])
{
AA a;
BB b = new BB();
b.fun1();
a = b; //多态
a.fun1();//
// System.out.println("a.num :"+a.num);
// System.out.println("b.num :"+b.num);
}
}
复制代码
你所说的,显式的写就是在子类中出现了跟父类一模一样的方法,这叫子类的该方法覆盖了父类的该方法,父类的该方法被子类隐藏了,
所以当子类中要调用该方法时,调用的是子类中的该方法,就比如说,你跟你的父亲都有钱,你继承了你的父亲,当你要花钱的时候当然是先花你的了,
因为比较方便嘛。像你这程序之后,子类中的fun2()用到的num是本类中定义的成员变量nun,值为456,
你要是想调用父类中的fun2方法,就要用到一个关键字super,格式是super.fun2();
如果你不在子类中在写该方法,那么子类就只能继承父类中的该方法,所以调用的时候,num指的是本类也就是父类中的num,值为123.
作者:
tianyun
时间:
2013-3-15 10:47
当然会不一样,父类的应用指向了子类对象,该应用只能调用子类覆盖父类的方法,而不是调用父类的方法,又因为属性是不存在继承关系的,不重写时调用父类方法,只能访问父类的属性123。重写后访问子类属性456,所以结果不同。
作者:
范天成
时间:
2013-3-15 18:56
七楼正解,赞一个{:soso_e113:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2