黑马程序员技术交流社区

标题: 子类非静态方法为什么不能覆盖父类静态方法 [打印本页]

作者: 爱上这格调    时间: 2013-9-12 00:50
标题: 子类非静态方法为什么不能覆盖父类静态方法
本帖最后由 杨增坤 于 2013-9-13 08:50 编辑

class Fu
{
       static void show()
       {
              System.out.println("fu run");
       }
}  
class Zi extends Fu
{
        void show()
       {
             System.out.println("zi run");
       }
}
编译时结果   Zi中的show()无法覆盖Fu中的show()    不是说非静态方法可以访问静态方法的吗   那么为什么非静态的子类方法不能覆盖静态的父类方法那


作者: 李锡碧    时间: 2013-9-12 01:05
重写:
1.子类覆盖父类,必须保证子类权限 >= 父类权限,才可以覆盖。否则,编译失败。
2.静态只能覆盖静态。

记住:
重载:只看同名函数的参数列表。
重写:父类和子类方法要一模一样。

  1. <p align="left">class Fu
  2. {
  3.         static void show()
  4.         {
  5.                System.out.println("fu run");
  6.         }
  7. }  
  8. class Zi extends Fu
  9. {
  10.          static  void show()
  11.         {
  12.               System.out.println("zi run");
  13.         }
  14. }</p>
复制代码


作者: lonely_zb    时间: 2013-9-12 01:15
你的子类根本就没有重写父类的方法,怎么会存在调用了父类的方法诶....

正如上楼所说:

重载:只看同名函数的参数列表。
重写:父类和子类方法要一模一样
作者: 神之梦    时间: 2013-9-12 01:35
本帖最后由 神之梦 于 2013-9-12 17:34 编辑
谁说非静态方法可以访问静态方法

我脑袋短路了


作者: 梦航    时间: 2013-9-12 02:00
这样理解,你能拿老爸的身体当做自己的来用吗?
作者: 周文斌    时间: 2013-9-12 02:07
谁说非静态方法可以访问静态方法

很明确的告诉楼上,非静态方法确实可以调用静态方法。
java中的各种规则都来源于实际操作可能性,比如为了封装,有了private等权限,当private修饰时,类外不可直接访问,比如静态方法不能调用非静态方法和非静态变量,那是因为静态方法在程序加载时就已经被加载进内存了(顺序:类——类中静态成员——类中非静态成员——构造器),非静态方法调用静态方法没有任何现实意义和逻辑上不允许,相反他是有一定需求的。。

lz的问题:
覆盖,即重写。

重写的要求是:要和父类中的方法一模一样包括 修饰符,返回值,函数名,参数(数量,顺序,类型),然后还要权限大于父类(1楼所说)。
由于要求一模一样,那么自然静态方法为了覆盖其父类的某个方法,那么该方法也得用static修饰咯~~

看lz“好像觉得非静态方法由于能调用静态方法,那么必然能覆盖静态方法的语气”,是不是觉得非静态方法“权限”要大一些?事实上没有这么一说,静态方法不能调用非静态方法我上面说了。你觉得不信,可以将父类中的static拿到子类中,会发现也编译不了,这个原因,纯粹是因为不符合java关于重写(覆盖)的规则而已~~

希望对你有帮助,求分~~{:soso_e112:}
作者: Yuan先生    时间: 2013-9-12 10:06
静态方法只与定义时所在的类相关,在编译期就已经绑定到某个类,引用属于哪个类就会调用哪个类的静态方法,可以继承,但不能在子类中被同名方法覆盖.
作者: 陶智第    时间: 2013-9-12 11:24
非静态方法可以调用静态方法。因为静态方法在内存中是属于共享方法
静态方法和非静态方法在内存中存在的位置不一样。
静态方法存在于方法区中,而非静态方法存在于堆内存中。
因为他们在内存中的位置不一样,所以非静态方法不能覆盖静态方法
作者: 吴一磊    时间: 2013-9-12 12:55
子类覆盖父类方法必须要父类和子类方法要一模一样,而且子类权限必须要大于等于父类权限,父类是 static void show(),子类也必须是 static void show()




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