黑马程序员技术交流社区

标题: 一个关于静态方法覆盖,重载的问题 [打印本页]

作者: 吴扬    时间: 2012-6-27 02:23
标题: 一个关于静态方法覆盖,重载的问题
本帖最后由 吴扬 于 2012-6-28 02:03 编辑

下面是一段有关个静态方法覆盖和重载的代码,有些小问题不是很明白

  1. public class TestA{
  2.         
  3.         public static void method(int i)
  4.         {
  5.                 System.out.println(i);
  6.         }

  7. }
  8. public class TestB extends TestA{
  9. public static void method(int i)//B类覆盖A类中的method方法,但是如果这里去掉static,就会报错,静态方法如果要被覆盖的话还是只能被静态修饰吗?为什么?
  10. {
  11.   System.out.println(i);
  12. }

  13. public void method(int i,int j)//B类重载A类的method方法,不管这里有没有static修饰,都不会报错。为什么重载方法就可以不加static呢?不太明白!
  14. {
  15.   System.out.println(i + j);
  16. }

  17. }
复制代码

作者: 孙飞    时间: 2012-6-27 06:27
静态方法在类的加载时就已经存在,而非静态是在系统运行时加载具体内容才会存在,所以当类加载时只有子类中的静态存在,那么怎么去重写一个不存在 的方法呢。记住一句结论:重载只看同名函数的参数列表,重写必须是一模一样。它们的相同点是函数名都相同,不同点如下:
方法重载发生在同一个类的内部的方法内,而方法重写发生在继承关系中,子类重写了父类的方法
方法重载不要求方法的返回类型一致与否 而方法重写要求返回类型必须一致
方法重载要求方法的参数签名必须不一致,而方法重写要求方法的参数签名必须一致
方法重载对方法的访问权限和抛出异常没有限制,而方法重写对方法的访问权限和抛出异常有限制


作者: 常佳杰    时间: 2012-6-27 07:27
你必须清楚重写和重载的概念,你的那个重写好像是不行的..下边有解释

重载(overload),方法名称必须相同,参数必须不同,可以有不同的访问修饰符....
重写(overload),方法名称必须相同,参数也要相同...


重写方法的规则如下:
1. 参数列表:必须与被重写方法的参数列表完全匹配。
2. 返回类型:必须与超类中被重写的方法中声明的返回类型或子类型完全相同
3. 访问级别:一定不能比被重写方法强,可以比被重写方法的弱。
4. 非检查异常:重写方法可以抛出任何非检查的异常,无论被重写方法是否声明了该异常。
5. 检查异常:重写方法一定不能抛出新的检查异常,或比被重写方法声明的检查异常更广的检查异常
6. 不能重写标志为final,static的方法

重载方法的规则:
1. 参数列表:被重载的方法必须改变参数列表。
2. 返回类型:可以改变返回类型。
3. 修饰符:可以改变修饰符
4. 异常:可以声明新的或者更广泛的异常
作者: 史卜坤    时间: 2012-6-27 07:41
不可以的,静态方法只能控制静态变量(他们本身没有),静态方法不能被重载和覆盖,通过类名引用是推荐的方法,非静态方法不可以被重载成静态方法。
作者: 黑马-王言龙    时间: 2012-6-27 08:46
本帖最后由 wyl530274554 于 2012-6-27 09:22 编辑

继承中
1、就覆盖的角度看,子类的方法要和父类的方法声明一模一样,只是内容不同
     如果你B类的第一个方法去掉static,由于方法声明不一样,即不构成覆盖,和继承来的method()是同名方法,那当调用子类的method()时,jvm会不知道调用的是哪一个  (继承的一个、自己的一个)
2、B类的第二个method方法由于参数列表里的内容和父类不同,所以它和从父类继承来的方法构成了重载,当调用时,传入的参数不同,那jvm就能识别是调用的哪个方法

如何判断是重载还是重写?
重载:同名方法的参数列表不同(即参数的类型或个数不同即可)
重写(覆盖):子父类方法声明要一样
作者: 李文龙    时间: 2012-6-27 09:00
覆盖与重载的概念楼主没弄的太清楚。
覆盖也就是重写,要求函数声明必须一模一样,除了函数内部的算法实现不相同外,函数的参数个数,参数类型,返回值,多个不同类型参数之间的排列顺序必须是一模一样的。
重载的要求是不能一样,包括参数的个数不一样,参数的类型不一样,参数的返回值不一样,或者多个不同类型参数之间的排列顺序不一样,只要其中有一样是不同的,就算是重载了。
弄清楚了这点区别,相信楼主就能很轻易的明白为什么重写需要static,重载不需要static了,这就是一个在函数声明上是否相同的地方,相同为覆盖,不同为重载。
作者: 余清兰    时间: 2012-6-27 09:55
public static void method(int i)//B类覆盖A类中的method方法,但是如果这里去掉static,就会报错,静态方法如果要被覆盖的话还是只能被静态修饰吗?为什么?
因为静态方法只能覆盖静态方法,覆盖要求是要两个方法一模一样,什么都一样。静态方法是随着该类一加载就存在了方法区,非静态的方法要对象调用了才存在内存中,一个先来后到的原理,所以非静态不可能覆盖静态的。
public void method(int i,int j)//B类重载A类的method方法,不管这里有没有static修饰,都不会报错。为什么重载方法就可以不加static呢?不太明白!
这不是重载了父类的方法,重载是必须在同一个类中,所以子类不可能重载父类的方法,你这里是重载了子类的method方法,重载是与返回值和修饰符无关的,只要是同名函数,参数个数和参数类型不同,并且在同一个类中,才是重载。


作者: 吴扬    时间: 2012-6-28 02:02
谢谢大家的解答,看来对于重载和重写还是没有完全掌握,还得复习下!




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