黑马程序员技术交流社区

标题: 方法的重写和重载 [打印本页]

作者: 杨千里    时间: 2012-9-3 12:05
标题: 方法的重写和重载
方法的重写和重载有什么区别,他们的返回值类型又当如何?
我是菜菜,光弄迷糊。请详解一下  谢谢
作者: 周兴华    时间: 2012-9-3 12:14
方法的重写发生在继承中,子类继承父类时,子类中的方法与父类中的方法有完全相同的返回值类型,方法名,参数个数以及参数类型。这样就可以实现对父类方法的覆盖。

方法的重载发生在同一个类中,一个类中可以定义有相同的名字,但参数列表(参数的类型,个数,顺序)不同的多个方法。调用时,会根据不同的参数列表来选择对应的方法。类中定义的普通方法和构造方法都可以重载。

作者: 孙岳    时间: 2012-9-3 12:15
重载是方法名相同,参数的个数或类型不同,跟返回值没关系,调用的时候选择参数列表对应的方法。
重写是子类继承父类的方法,但是要实现的功能与父类不同,所以要重写该方法,也就是对父类方法的覆盖。
作者: 小黑马    时间: 2012-9-3 12:18
首先我们来看什么是Overload:重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

出一个问题

/*
void show(int a,char b,double c){}
a.   void show(int x,char y,double z){}//没有,因为和原函数一样。
b.   int show(int a,double c,char b){}//重载,因为参数类型不同。注意:重载和返回值类型没关系。
c.   void show(int a,double c,char b){}//重载,因为参数类型不同。注意:重载和返回值类型没关系。
d.   boolean show(int c,char b){}//重载了,因为参数个数不同。
e.   void show(double c){}//重载了,因为参数个数不同。
f.    double show(int x,char y,double z){}//没有,这个函数不可以和给定函数同时存在与一个类中。

*/

所以总结几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响;
          那什么是Override:重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了

1、子类方法的名称和参数和父类一致。

2、子类覆盖父类的方法时,只能比父类抛出更少的异常。

3、父类不能是private,那子类就不能重写父类,相当于重新的一个类。

4、子类的访问权限要比父类权限大
作者: 王舜民    时间: 2012-9-3 12:58
其实相关帖子里面就很多;

Java 允许同一个类里定义多个同名方法,只要参数列表不同即可!如果同一个类中包含了两个或者两个以上方法的方法名相同,但形参列表不同,则被称为方法重载。
方法重载的要求就是:两同一不同。同一个类中方法名相同,参数列表不同。至于方法的其他部分,如方法的返回值类型、修饰符等,与方法的重载没有任何关系!

子类包含与父类同名方法的现象被称为方法重写,也称为方法覆盖。
方法重写要遵循:两同两小一大的规则。两同即方法名相同,参数列表相同。两小指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出异常类应比父类方法抛出的异常类更小或相等。一大指的是子类方法的访问权限应比父类方法更大或相等。尤其需要指出的是,覆盖 方法和被覆盖的方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法!

这个解释的很给力。
作者: 王宝龙    时间: 2012-9-3 13:05
首先说一下重载,假如我们定义了一个这样的类
  1. class Person//定义一个Person类
  2. {
  3.         private String name;
  4.         private int age;
  5.         public Person(String name)//这是其中一个构造方法,使用这个构造方法只需这样Preson(“Jim”)
  6.         {
  7.                
  8.         }
  9.         public Person(String name,int age)//这是另一个构造方法,使用时应该这样Person(“Jim",18)
  10.         {
  11.                 this.name=name;
  12.                 this.age=age;
  13.         }
  14.         public void SayHello()//定义一个方法
  15.         {
  16.                 System.out.println("我是"+name+"我的年龄是"+age);//输出姓名和年龄
  17.         }
  18. }
复制代码
上面的类里有两个构造方法其中一个是Person(String name,int age)、Person(String name);也就是说一个类中如果有两个以上的构造方法,我们在使用时用不同构造方法进行初始化这叫做重载;而如果有多个构造函数,构造函数之间的区别就是传参数的数量不同或者类型不同函数名字是相同的。
然后再说重写;
假如有一个类继承了Person类如下:
  1. class Chinese extends Person//定义一个Chinese类继承Person类
  2. {
  3.         public Chinese(String name,int age)
  4.         {
  5.                 super(name,age);
  6.         }
  7.         public void SayHello()
  8.         {
  9.                 System.out.println("我是中国人");
  10.         }
  11. }
复制代码
很明显上一个Person类中有一个
public void SayHello()
        {
System.out.println("我是"+name+"我的年龄是"+age);//输出姓名和年龄
        }
但是在这个类中我们把SayHello()类进行了重写
public void SayHello()
        {
                System.out.println("我是中国人");
        }
这就叫做重写。
总结,重写是发生在继承或直线接口时;
而重载是在类初始化对象时;




作者: 杨卫腾    时间: 2012-9-3 14:05
总结:
    重载:一句话,函数名相同,参数列表个数不同,参数列表的类型不同的函数。这就会重载。
    重写:子类在继承父类抽象方法时,必须要重写父类的方法,或者实现接口时必须重写其中的方法。
作者: 黑马-王康    时间: 2012-9-3 14:43

没事哈,都是从菜菜过来的。

1)方法重载。你仅要记住overload,只于函数参数个数或类型有关,于返回值无关。

需要满足三个条件中的一种即可:
①参数个数不同;
②或者参数类型不同;
③或者参数顺序不同。

2)方法重写override:在继承时使用。
特点:这要求子父类函数一模一样且子类权限必须>=父类权限。



希望对你有帮助哟。
作者: 夏天    时间: 2012-9-3 14:54
其实简单说,重载只看参数列表。重写发生在继承或接口上,重写除了{}里面可以不一样,其他必须都跟要重写的函数一样。
作者: 夏天    时间: 2012-9-3 14:56
还有个权限,子类重写父类,访问权限必须大于等于父类
作者: 张飞年    时间: 2012-9-3 14:57
首先说重载(Overload),重载是为了在同一类中实现同一个函数实现不同的功能。所谓重载是得具备一定的条件的,1、重载是在同一个类中,这是范围 2、重载是具有相同的函数名,这是它的一个特征 3、拥有相同函数名却非得是不同的参数列表,包括有无参数,参数个数,参数类型,参数次序等的不同 4、子类返回值类型可以不相同,修饰符也可以不同 5方法的异常类型和数目不会对重载构成影响。
总的来说重载时只能通过不同的参数样式来区分。如:fun(int a,String b)    fun(String b,int a)
覆写(Override),它是覆盖一个方法并对其重写,以求达到不同的目的。我们最熟悉的就是对接口的实现覆写,这是个典型的用法,另外在继承是=中也可能会在子类覆盖父类中的方法。覆写要注意以下几点:
1、覆覆写的方法和标志必须要被覆盖的方法标志完全匹配,才能达到覆盖的效果。
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致。
3 、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。如 :private void fun(ArrayList list)   与子类中的 private void fun(ArrrayList list)就是两个方法
作者: 杨千里    时间: 2012-9-3 14:59
多谢各位,我现在已经明白了




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