A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨增坤 于 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()    不是说非静态方法可以访问静态方法的吗   那么为什么非静态的子类方法不能覆盖静态的父类方法那

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

9 个回复

倒序浏览
重写:
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>
复制代码

评分

参与人数 2技术分 +1 黑马币 +30 收起 理由
EYE_SEE_YOU + 1
杨晓燕 + 30 很给力!

查看全部评分

回复 使用道具 举报
你的子类根本就没有重写父类的方法,怎么会存在调用了父类的方法诶....

正如上楼所说:

重载:只看同名函数的参数列表。
重写:父类和子类方法要一模一样
回复 使用道具 举报
本帖最后由 神之梦 于 2013-9-12 17:34 编辑
谁说非静态方法可以访问静态方法

我脑袋短路了

回复 使用道具 举报
这样理解,你能拿老爸的身体当做自己的来用吗?
回复 使用道具 举报
谁说非静态方法可以访问静态方法

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

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

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

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

希望对你有帮助,求分~~{:soso_e112:}

点评

感谢指正,是我记错了  发表于 2013-9-12 17:33

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
EYE_SEE_YOU + 1
吕振中 + 10 很给力!

查看全部评分

回复 使用道具 举报
静态方法只与定义时所在的类相关,在编译期就已经绑定到某个类,引用属于哪个类就会调用哪个类的静态方法,可以继承,但不能在子类中被同名方法覆盖.
回复 使用道具 举报
非静态方法可以调用静态方法。因为静态方法在内存中是属于共享方法
静态方法和非静态方法在内存中存在的位置不一样。
静态方法存在于方法区中,而非静态方法存在于堆内存中。
因为他们在内存中的位置不一样,所以非静态方法不能覆盖静态方法

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
子类覆盖父类方法必须要父类和子类方法要一模一样,而且子类权限必须要大于等于父类权限,父类是 static void show(),子类也必须是 static void show()

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马