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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 聽聽我dē❤ 中级黑马   /  2012-11-12 18:39  /  2768 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 聽聽我dē❤ 于 2012-11-13 09:17 编辑

在多态中,父类和子类有同名的静态方法,在调用时是这样写的Fu f=new zi();那是会运行父类的静态方法那还是会运行子类的静态方法,为什么???

5 个回复

倒序浏览
我们假设Fu f=new zi();"="号作为"左边","="右边作为"右边",在多态中有以下特点:
(1)静态成员函数的特点:无论编译和运行,都参考左边(引用型变量所属的类),就是会运行父类的静态方法。
(2)非静态函数的特点:在编译时期,参阅左边(引用型变量所属的类)是否有调用的方法,如果有,编译通过,如果没有编译失败。
      在运行时期,调用的是子类的方法,
      简单总结一下:非静态成员函数在多态调用时,编译看左边,运行看右边
(3)对于成员变量的特点:无论编译和运行,都参考左边(引用型所属的类),即运行父类的成员变量。
例如:
class Fu{
     int num=3;
}
class Zi extends Fu{
     int num=8;
}
class Test{
   public static void main(String []args){
       Fu f=new Zi();
       System.out.println(f.num);
       Zi z=new Zi();
      System.out.println(z.num);
  }
}
运行结果为:3,8
回复 使用道具 举报
java 寻找执行方法的原则是:从对象所属的类开始,寻找匹配的方法执行,如果当前类中没有匹配的方法,则逐层向上依次在父类或祖先类中寻找匹配方法,直到Object类.
回复 使用道具 举报
邵天强 发表于 2012-11-12 19:12
我们假设Fu f=new zi();"="号作为"左边","="右边作为"右边",在多态中有以下特点:
(1)静态成员函数的特 ...

非常赞同!
回复 使用道具 举报
首选,即便是同名的静态方法,但是在内存的方法区中,也是分别根据类名保存的。所以不会冲突,但是如果是非静态的方法,那么调用的就是子类的方法了,同样的方法因为子类对象中重写了父类中的方法,所以父类的引用指向子类的实例对象。就好比你这个父类是人,实例对象是子类的男人。当你调用父类引用的撒尿后,自然调用的就是男人的站着撒尿的方式,你这个对象是男人。。不是女人,和太监。。

点评

说的很抽象。  发表于 2012-11-13 09:03

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 很给力!鼓励一下 。

查看全部评分

回复 使用道具 举报
在继承中有一点比叫特别:
那就是同名的静态方法是不能覆盖的,这一点你的验证代码就可以看到,
同样,静态的变量也是不能覆盖的,如:
class Fu{
static int num=3;
}
class Zi extends Fu{
static int num=4;

}
通过引用父类的对象建立子类的对象的话,你得到的结果结果num=3;
因为在内存中静态成员在类开始加载时就存在于类中一特殊的内存中,它没有实例对象,它会一直存在而不改变,知道程序运行结束!

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

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