黑马程序员技术交流社区

标题: 关于java重载问题 [打印本页]

作者: chuanyueing    时间: 2013-3-7 10:39
标题: 关于java重载问题
一般来说,方法重载是指在同一个类中有多个同名但不同参数的方法。但有没有特例呢??
比如:父类Animal有个public方法叫sleep(),子类Dog继承了Animal,但子类中也有一个public方法sleep(int time),只不过这个方法是个带参的方法,不是重写父类的方法。请问子类Dog的sleep方法算不算是重载的??
另外有一点疑惑的是:子类继承了父类,那么父类的公有成员是在子类中有一份拷贝呢还是说仅仅是在子类调用的时候才存在在子类中,或者是说子类继承父类,仅仅是在访问时可以使用父类的成员但子类本身并不具有这些成员??
请大伙我解释一下,非常感谢!!
作者: Gaara    时间: 2013-3-7 11:18
我好像在某些资料上看过说子类继承仅仅是在运行时可以使用继承来的东西,也就是说它使用的还是父类的,子类本身内部不存在这些。   不知道这种说法对不对?
重载,方法名称必须相同,参数必须不同。------>在同一个类中
重写,方法名称必须相同,参数也要相同。------>在子类重写父类的方法

作者: HM王琦    时间: 2013-3-7 11:54
这是重载,因为子类继承了父类,就是继承了父类的所非有私有成员包括变量和函数,当子类可以直接调用父类的这些非私有方法,当子类出现和父类相同(一模一样)的方法时,子类调用此方法就是调用的本类方法,好像父类方法被重写一样,所以称之为重写;当子类有与父类同名且返回值一样的但参数列表不一样的方法时,这时就是方法重载了。
作者: scott0610    时间: 2013-3-7 11:58
父类Animal有个public方法叫sleep(),子类Dog继承了Animal,但子类中也有一个public方法sleep(int time),只不过这个方法是个带参的方法,不是重写父类的方法。请问子类Dog的sleep方法算不算是重载的??
解答:Dog类中sleep的方法属于重载。因为子类Dog继承了父类Animal,那么之类Dog就拥有父类的所有属性和方法(私有属性和方法除外)。

子类继承了父类,那么父类的公有成员是在子类中有一份拷贝呢还是说仅仅是在子类调用的时候才存在在子类中,或者是说子类继承父类,仅仅是在访问时可以使用父类的成员但子类本身并不具有这些成员??
解答:在Java程序创建某个类的对象时系统会隐身创建该类父类的对象。只要有一个子类对象存在,则一定存在一个与之对应的父类对象。比如有一个父类叫Fruit,子类名叫Apple。如果创建一个Apple对象,这必须先创建一个Object对象,然后在创建一个Fruit对象,最后在创建Apple对象,这是Java中的继承树的执行顺序。所以你方法父类的属性和方法时,其实质还是属于父类本身的。

希望对你有所帮助!

作者: 张宁    时间: 2013-3-7 12:47
重载和覆盖的概念别混淆了
重载分为在一个类中重载,和在子类和父类中重载
1.在一个类中定义多个具有相同签名的方法,这些方法必须具有不同的参数列表,比如一个类的构造函数。    2.在父类和子类中,子类由于继承而拥有了父类的某些方法,此时在子类再定义具有相同签名的方法(必须具有不同的参数列表),这个地方很容易和重写相混淆,因此千万注意。这两种都是重载。一般人说同一个类中是把父类忽略掉而已。所以说Dog里边的sleep()方法当然属于重载了。对于父类继承子类,你 new 一个子类,这个子类也就同事拥有了父类和子类里边的内容。可以供你调用。

作者: Walking Walking    时间: 2013-3-7 13:00
第一点应该是重载。重载是函数名相同参数列表不同,重写要求子父类的方法要一模一样。

作者: 黄玉昆    时间: 2013-3-7 13:09
本帖最后由 黄玉昆 于 2013-3-7 13:18 编辑

你自己都说了:方法重载是指在同一个类中有多个同名但不同参数的方法。那么子类和父类能在一个类中吗?读懂定义中的每个修饰语的含义,就清晰了
你可以看看这篇文章:http://blog.163.com/sunflower123 ... 212010102051746420/
对于重写和覆盖,注意:
定义范围:
重写:在同一个类中
覆盖:继承父类的子类中
参数:
重写:同名,同返回类型,不同参数类型即参数签名,不同参数个数
覆盖:函数名,返回类型,参数类型,参数个数必须都相同
作者: chuanyueing    时间: 2013-3-7 13:15
黄玉昆 发表于 2013-3-7 13:09
你自己都说了:方法重载是指在同一个类中有多个同名但不同参数的方法。那么子类和父类能在一个类中吗?读懂 ...

嗯,有道理,谢啦!这俩天看的视频有点快都快蒙圈啦
作者: chuanyueing    时间: 2013-3-7 13:15
张文彬 发表于 2013-3-7 11:18
我好像在某些资料上看过说子类继承仅仅是在运行时可以使用继承来的东西,也就是说它使用的还是父类的,子类 ...

这么好的回答应该给个技术分:)
作者: 夏晓彤    时间: 2013-3-7 13:43
是重载。子类覆盖父类方法,子类里就有一个public void sleep(){};方法,子类本身有public  void sleep( int time){}方法,既然方法重载是指在同一个类中有多个同名但不同参数的方法,这不就是重载吗
作者: lzw123451    时间: 2013-3-7 13:46
  对于类的方法(包括从父类中继承的方法)如果有两个方法的方法名相同,但参数不一致,那么可以说,一个方法是另一个方法的重载方法。

        重载方法满足以下条件

        方法名相同

        方法的参数类型,个数,顺序至少有一项不相同

        方法的返回类型可以不相同

        方法的修饰符可以不相同

注意哦!资料上说的子类继承父类,有同名不同参数的方法也是重载哦!!!上面的仁兄们可能没看清楚,实际上你的同名不同参方法只要在编译器不报错,都构成重载,因为重载的定义就是同一个方法名可以传不同的参数,只要你能实现这个效果,不是重载也是重载,和重载一个效果。
作者: 范德农    时间: 2013-3-7 17:36
逐条回答吧。
1、请问子类Dog的sleep方法算不算是重载的??
我觉的这个问题可能涉及到重载(overlosad)和重写(overriding)概念的区别,在这里是重载,因为子类继承了父类的方法,虽然不算是它自己拥有的,但在客观上它拥有两个方法名参数不同的函数,
自然是重载。
2、子类继承了父类,那么父类的公有成员是在子类中有一份拷贝呢还是说仅仅是在子类调用的时候才存在在子类中,或者是说子类继承父类,仅仅是在访问时可以使用父类的成员但子类本身并不具有这些成员??
这个问题挺有意思的,大家都知道extend英文的中文意思是扩充,也就是说如果把父类当做游戏的话,子类可以看做父类这个游戏的资料片,是在父类基础的补充版本,自然本身没必要拥有这些父类的属性,另外大家也都知道在创造子类对象的时候,都要调用父类构造器,如果子类本身就可以拥有父类的这些属性的话,又何必再调用父类构造器初始化呢,很明显,子类本身是没有父类属性的,它只是可以随时调用父类的属性,而供它调用属性的这个父类对象在它被创造时就已经偷偷创造出并与它绑定了,这么说可能不是很严谨,但是意思是没错的。

作者: 范德农    时间: 2013-3-7 17:37
版主,这个问题的回答真不好给代码,看在这么认真回答的份上,给个技术分呗。
作者: amen0205    时间: 2013-3-8 02:42
你说的第一种情况也是重载    重载没有规定一定要在一个类中吧   第二个  我理解是去父类中调用相应方法   不会copy一份  假如  会copy的话 那当copy的那份发生了变化 是不是就和父类的不一样了啊   不可以的     




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2