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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张艳艳 中级黑马   /  2013-1-6 00:27  /  3293 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张艳艳 于 2013-1-9 14:45 编辑

看到一些资料说是父类中的static方法不能被子类所覆写,自己写了个小程序,也没看到任何错误提示,我写得这个到是不是覆写,谁能深入解释一下
到底怎么才是覆写
class fu{
static void print(){
  System.out.println("fu");
}

}
class zi extends fu{

static void print(){
  System.out.println("zi");
}
}
public class fuxie {
  public static void main(String[] args)
     {
   fu.print();//打印fu
   zi.print();//打印zi
     }
}

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1 半夜了还没休息,鼓励一下

查看全部评分

7 个回复

倒序浏览
首先要明确的是什么是复写?当父子类中出现了一模一样的函数,就叫做复写

复写的要求或者说什么叫一模一样的函数:必须是父子类之间,方法名相同,参数列表相同,返回类型一致

不能复写的情况,如果父类中的方法是用private修饰,那么子类就无法复写父类中的方法。就算子类中有一个方法与父类方法名相同,参数列表以及返回值都相同,依然不是重写,只是相当于在子类中重新定义了一个方法,可以加static关键字。

static修饰的函数:父类中static修饰的函数也可以被复写,只是子类中复写的函数也必须要用static来修饰。
回复 使用道具 举报
在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法
回复 使用道具 举报
static 修饰符修饰的方法存储在属于这个类的单独空间里,在类加载的时候就已经存在了,他是存在于这个类文件的,全局的,所以对于static的方法或变量应该用类名来引用。而重写是体现在对象上,当new一个子类对象时,父类中被重写的方法将不会在对象中出现了,而static类型的将会全局存在,无法覆盖。看下下面的例子
  1. class Fu {
  2.         static void print() {
  3.                 System.out.println("fu");
  4.         }
  5.         public void foo(){
  6.                 System.out.println("父类。。。");
  7.         }

  8. }

  9. class Zi extends Fu {

  10.         static void print() {
  11.                 System.out.println("zi");
  12.         }
  13.         public void foo(){
  14.                 System.out.println("子类。。。");
  15.         }
  16. }

  17. public class FuXie{
  18.         public static void main(String[] args) {
  19.                 Fu.print();// 打印fu
  20.                 Zi.print();// 打印zi
  21.                 Zi z=new Zi();
  22.                 z.print();
  23.                 Fu f=new Zi();
  24.                 f.print();
  25.                 f.foo();
  26.         }
  27. }
复制代码
f的类型是父类的,所以调用静态方法f.print();时会打印  “fu”
f所指向的内存地址是子类new出来的,所以调用普通方法f.foo();时会打印  “子类。。。”
回复 使用道具 举报
最简单的办法,尝试加上一个@Override就能验证你那个问题了。
回复 使用道具 举报
这个毕老师讲过的,静态只能覆盖静态,
回复 使用道具 举报
静态可以覆写的,只是静态只能覆写静态,因为静态是随着类的加载而加载,生命周期最长,和对象无关,
所以如果子类的对象不是静态的话,无法覆写父类中的静态,
覆写的前提是:子父类中的方法必须一模一样,包括返回值类型。所以楼主写的是覆写。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
shuima 初级黑马 2016-6-27 22:29:50
8#
黑马刘杰 发表于 2013-1-6 20:17
static 修饰符修饰的方法存储在属于这个类的单独空间里,在类加载的时候就已经存在了,他是存在于这个类文 ...

你这说的是多态吧!父类调用的static还是父类的方法,而对于非static ,则调用的是子类的方法,但是static似乎也能够被重写,不过我在书上看过,上面写static方法不能被重写
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马