黑马程序员技术交流社区

标题: 为什么静态只能被静态重写 [打印本页]

作者: I空空    时间: 2014-12-24 12:25
标题: 为什么静态只能被静态重写
为什么静态只能被静态重写啊,虽然我也明白子父类中的静态方法都是随着类的加载而加载,在子类中重写父类的静态方法,我就偏偏把写成成员方法不可以吗,思路有点乱
作者: kerner    时间: 2014-12-24 12:42
静态方法和private和 final修饰的方法不能被重写,在编译期间就已经确定调用了。
作者: 青衫禅客    时间: 2014-12-24 13:44
静态和非静态的内存存储位置都不一样,你怎么重写,就像你准备来我家把我干掉,但是你进的我邻居家,找都找不到我,怎么干
作者: 樊小乐    时间: 2014-12-24 14:52
JAVA静态方法形式上可以重写,但从本质上来说不是JAVA的重写。因为静态方法只与类相关,不与具体实现相关,声明的是什么类,则引用相应类的静态方法(本来静态无需声明,可以直接引用),看下例子:
  1. class Base{
  2.         static void a( ){System.out.println("A");  }
  3.                  void b( ){System.out.println("B"); }
  4. }
  5. public class  Inherit extends Base{
  6.           static void a( ){System.out.println("C");  }
  7.                   void b( ){System.out.println("D"); }
  8.            public static void main(String args[]){
  9.                     Base b=new Base();
  10.                     Base  c=new Inherit();
  11.                     b.a();
  12.                     b.b();
  13.                     c.a();
  14.                     c.b();
  15.          }
  16. }
复制代码

以上输出的结果是:A
                           B
                           A
                           D
       非静态方法 按重写规则调用相应的类实现方法,而静态方法只与类相关。
       所谓静态,就是在运行时,虚拟机已经认定此方法属于哪个类。
专业术语有严格的含义,用语要准确."重写"只能适用于实例方法.不能用于静态方法.对于静态方法,只能隐藏(刚才的例子可以重写那只是形式上的 ,并不满足多态的特征,所以严格说不是重写)。
      静态方法的调用不需要实例化吧..  不实例化也就不能用多态了,也就没有所谓的父类引用指向子类实例.因为不能实例化 也就没有机会去指向子类的实例。所以也就不存在多态了。
作者: abathe    时间: 2014-12-24 16:50
kerner 发表于 2014-12-24 12:42
静态方法和private和 final修饰的方法不能被重写,在编译期间就已经确定调用了。 ...

这样理解靠谱
作者: 找寻小龙猫    时间: 2014-12-24 20:49
樊小乐 发表于 2014-12-24 14:52
JAVA静态方法形式上可以重写,但从本质上来说不是JAVA的重写。因为静态方法只与类相关,不与具体实现相关 ...

好详细。。赞
作者: 新鲜感    时间: 2014-12-24 20:52
这是很明显的区别, 对象存在前就存在了
作者: 陈召    时间: 2014-12-24 21:22
看到前排的解释很给力啊,很有毕姥爷的风范。
作者: Rain2692    时间: 2014-12-24 21:24
嘿嘿。。。
作者: reyzarc    时间: 2014-12-24 21:29
板凳解释得很详细了。一句话就是是静态优先于对象而存在~
作者: 小僧玄奘    时间: 2014-12-25 11:48
静态方法属于类方法。 成员方法是对象的方法。
作者: chudaming213    时间: 2014-12-25 20:09
青衫禅客 发表于 2014-12-24 13:44
静态和非静态的内存存储位置都不一样,你怎么重写,就像你准备来我家把我干掉,但是你进的我邻居家,找都找 ...

这兄弟说中了
作者: Honelyboy    时间: 2014-12-25 21:09
静态方法不创建对象就可以被类名调用,其实静态方法不存在重写的。之所以要重写是因为创建了对象。
作者: 侯鹏成    时间: 2014-12-25 21:52
楼上说的对               
作者: 7788665544    时间: 2014-12-25 22:21
Honelyboy 发表于 2014-12-25 21:09
静态方法不创建对象就可以被类名调用,其实静态方法不存在重写的。之所以要重写是因为创建了对象。 ...

这个写的不错,静态方法优先于对象存在。。
作者: 陈强fly    时间: 2014-12-26 01:29
感觉学的太浅了,好像什么都会,又觉得什么都不会。
作者: kk8023    时间: 2014-12-26 08:56
靠谱,赞一个。。。。。
作者: enjoy    时间: 2014-12-26 10:41
静态方法出现的早,类方法出现的晚。静态的可以不用实例化类直接使用
作者: 只会金克斯    时间: 2014-12-26 22:29
青衫禅客 发表于 2014-12-24 13:44
静态和非静态的内存存储位置都不一样,你怎么重写,就像你准备来我家把我干掉,但是你进的我邻居家,找都找 ...

老毕特性暴露无遗
作者: 西风烈123    时间: 2014-12-26 22:44
这是静态的特性  就如非静态可以调用静态但反之不可以
作者: 疯狂的学渣    时间: 2014-12-26 22:48
涨知识了,我的理解是,保留父类的属性,在重写他的内容。
作者: 黑马-李权88    时间: 2014-12-26 22:51
静态方法执行前期绑定,并且不可被override,你这样实际上是重新定义了一个static方法,和上面的方法不是override关系,就好像你试图override一个private方法一样。不信你可以在public static void bark() 前面加上个@Override标记,就会有错误提示了。
作者: I空空    时间: 2014-12-26 22:54
青衫禅客 发表于 2014-12-24 13:44
静态和非静态的内存存储位置都不一样,你怎么重写,就像你准备来我家把我干掉,但是你进的我邻居家,找都找 ...

哈哈,你这回复的太经典了,一语命中




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