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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦冲 黑马帝   /  2011-11-4 11:02  /  2751 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Parent {

  2.         public static String say() {
  3.                 return "parent static say";
  4.         }

  5.         public String say2() {
  6.                 return "parent say";
  7.         }
  8. }

  9. public class Child extends Parent {
  10.         public static String say() {
  11.                 return "child static say";
  12.         }

  13.         public String say2() {
  14.                 return "child say";
  15.         }
  16. }

  17. public class OverrideTest {

  18.         public static void main(String[] args) {
  19.                 Parent p = new Child();
  20.                 System.out.println(p.say());
  21.                 System.out.println(p.say2());

  22.         }

  23. }
复制代码
结果:
parent static say
child say

为什么p.say()却是调用父类Parent的方法呢?

9 个回复

倒序浏览
因为你那个是父类的引用啊 这是多态较为常见的用法
回复 使用道具 举报
实验已经说明 override 不会覆盖 静态方法(因为静态方法会在类初始化前进行初始化),只会覆盖普通方法{:soso_e100:}

回复 使用道具 举报
静态方法不能被覆盖,当然调用父类的了
回复 使用道具 举报
static 的属性和方法都是不能覆盖的,因为static修饰的部分都是与对象无关的,它与对象没有依赖关系只与类有关,在类加载进来时就已经存在了。
你的对象引用变量是Parent,在编译时变量p就是指向Parent类的,虽然你new的是Child对象。

评分

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

查看全部评分

回复 使用道具 举报
在多态中成员函数的特点 :
在编译时期 : 参阅引用型变量所属的类中是否有调用的方法 , 如果有 , 编译通过 , 如果没有 , 编译失败 .
在运行时期 : 参阅对象所属的类中是否有调用方法 .
简单总结就是编译时看左边 , 运行时看右边 .
在多态中 , 成员变量的特点 :( 非静态的 )
无论编译和运行 , 都参考左边 ( 引用型变量所属的类 )

评分

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

查看全部评分

回复 使用道具 举报
吉许 黑马帝 2011-11-4 11:33:09
7#
一个: 一个(  连接被识别成表情了.囧囧
回复 使用道具 举报
白倩 黑马帝 2011-11-4 11:35:34
8#
Parent p = new Child();
这句话是子类引用指向了父类,
你那个方法是静态的,override不会覆盖static 方法,
如果你想让它覆盖父类方法把方法前的static修饰符去掉就会得到你想要的结果。

评分

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

查看全部评分

回复 使用道具 举报
喻尚健 黑马帝 2011-11-4 13:06:02
9#
JAVA静态方法形式上可以重写,但从本质上来说不是JAVA的重写。因为静态方法只与类相关,不与具体实现相关,声明的是什么类,则引用相应类的静态方法(本来静态无需声明,可以直接引用)。
Parent p = new Child();编译时类型为父类,所以p.say()调用的是父类的方法;say2()是实例方法,运行时类型为child(),所以执行的是子类的方法。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Parent p = new Child();
java静态方法,override不会覆盖static 方法
要想覆盖父类的方法,需去掉static。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马