黑马程序员技术交流社区

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

作者: 大梅    时间: 2011-12-20 12:18
标题: 关于重载
class Father{
        public Father(){}
        public void print(){
                System.out.println("I`m father");
        }
}
class Son extends Father
{
        public Son(String name,int age){
                System.out.println(name+" "+age);
        }
               public void print(String s){
                System.out.println(s);
        }
}

这两个类中的print方法算重载吗?
作者: 冯瑞君老师    时间: 2011-12-20 12:27
本帖最后由 f64412300 于 2011-12-20 12:30 编辑

你看完就有答案了;

重载:

(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。
  (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
  (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。



重写:
(1)父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
  (2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
  (3)子类函数的访问修饰权限不能少于父类的;
作者: t_mac    时间: 2011-12-20 12:33
算,方法名一样,参数个数不同 是重载的一种方式
作者: 曾运    时间: 2011-12-20 12:39
本帖最后由 曾运 于 2011-12-20 13:25 编辑

不是方法的重写!
(1)方法的重写发生在父类和子类对象中
(2)方法的重写要求被重写的子类方法与父类中的【返回值类型】 【方法名称】  【参数个数】以及【参数类型】都完全一致
(3)重写的方法不能降低访问权限,如父类的方法是用public 修饰的话,子类的方法也必须用public 用其他private protected修饰就降低了访问权限

显然 你写的代码中不满足第二点,子类中的同名方法是带参数的。这样子类不是重写方法,而是子类新增的方法。
作者: 曾运    时间: 2011-12-20 12:51
看看代码你就明白了。
  1. class  OverrideDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Son son=new Son("张三",23);
  6.                 son.print();//输出结果是: I`m father 显然还是父类pirnt方法定义的内容
  7.                 son.print("new method!");//输出结果是 new method! 该方法是子类新定义的print方法
  8.         }
  9. }


  10. class Father{
  11.         public Father(){}
  12.         public void print()
  13.                 {
  14.          System.out.println("I`m father");
  15.         }
  16. }
  17. class Son extends Father
  18. {
  19.         public Son(String name,int age)
  20.                 {
  21.             System.out.println(name+" "+age);
  22.         }

  23.                 /*
  24.                  通过继承子类拥有了父类的 print()方法
  25.                  
  26.                  public void print()
  27.                 {
  28.          System.out.println("I`m father");
  29.         }
  30.                
  31.                
  32.                
  33.                 */
  34.                
  35.             public void print(String s)//子类新定义的print方法,带参数的
  36.                 {
  37.            System.out.println(s);
  38.         }
  39. }
复制代码

作者: hello world    时间: 2011-12-20 12:53
是重载,重载方法必须满足的条件:
1.方法名相同
2.方法的参数类型、个数、顺序至少有一项不相同。
3.方法的返回类型可以不相同。
4.方法的修饰符可以不相同。
由于子类继承了父类,当然就父类中继承了print()方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法),所有这两个类中的print方法是重载的。
作者: 为梦而战    时间: 2011-12-20 12:58
应该算重载,因为子类继承了父类的print()方法,相当于子类中也有print()方法了,这时在子类中再定义一个print(String s)方法,因为参数类型不一样,和子类继承过来的print()方法重载了!
作者: t_mac    时间: 2011-12-20 13:22
本帖最后由 t_mac 于 2011-12-20 13:23 编辑
曾运 发表于 2011-12-20 12:39
不是方法的重载!
(1)方法的重载发生在父类和子类对象中
(2)方法的重载要求被重载的子类方法与父类中的 ...


这位同学你说的是重写吧? 你可能把重载与重写搞混了,建议你好好看看它们的区别。不过你这个重写总结的很给力。
作者: 曾运    时间: 2011-12-20 13:27
t_mac 发表于 2011-12-20 13:22
这位同学你说的是重写吧? 你可能把重载与重写搞混了,建议你好好看看它们的区别。不过你这个重写总结的 ...

嗯 是override 不是overload 我失误、错误
作者: 杨银川    时间: 2011-12-20 13:34
重载应该是在同一个类中,你写的是子类继承父类的方法,是重写或覆盖。
作者: 舒远    时间: 2011-12-20 13:35
本帖最后由 舒远 于 2011-12-20 13:39 编辑

肯定不是重载:重载是一个类中的方法与方法之间的关系,重写是发生在父子类之间的关系。但是你的子类继承了父类的print方法。所以你的子类有两个print方法,一个有参(自定义的子类方法),一个无参(来自父类)。从严格意义上来说,父子类之间是不具备重载方法的概念的。但是你的子类的两个方法也具备一个类中的方法重载的条件。硬要说他们构成了重载也不为过。只能说子类的print和从父类继承过来的print构成了重载。不能说子类的方法和父类的方法构成了重载。
你的例子在李刚老师《疯狂java讲义》中有提到过。这就是父子类方法“重载”的现象。
作者: t_mac    时间: 2011-12-20 13:38
曾运 发表于 2011-12-20 13:27
嗯 是override 不是overload 我失误、错误

呵呵, 这样的问题很容易弄混,经过这次,我觉得你以后都不会混了,感谢楼主吧
作者: 海中的游弋草    时间: 2011-12-20 13:41
方法重载
方法重载是让类以统一的方式处理不同类型数据的一种手段。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法, 这就是多态性

方法重写(overiding method)  
在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

以上你所描述的代码程序  应该属于方法重写或覆盖,因为这两个方法在两个类中实现,并且这两个类又有继承关系。所以应该属于重写或覆盖。


作者: 应国炎    时间: 2011-12-20 13:50
本帖最后由 应国炎 于 2011-12-20 14:01 编辑

我觉得既不属于"重载",也不属于"覆写" .

重载的作用范围是:一个类中(不包括子父类)
覆写的作用范围是:子父类,但是需要返回值,方法名,参数都要相同才酸是覆写

所以两个条件都不满足,只能算是一个新的方法




如果硬要说是重载似乎也可以,如果继承后算一个类的话.




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