设为首页 加入收藏

TOP

成员变量和方法的override的详解
2011-06-09 13:00:03 来源: 作者: 【 】 浏览:74次 评论:0
原题:
//file: MyMain.class
class Base
{
int a=10;
public void show()
{
  System.out.println(a);
}
}
class Ext extends Base
{
int a=200;
public void show(String s)
{
  System.out.println(s);
}
}
public class MyMain
{
public static void main(String[] argv)
{
  Ext obj=new Ext();
  obj.show();
  obj.show("OK");
}
}
请问,执行上面程序,运行是什么?
========================
关于这道题目,我给出了一个简单的原则,现在有空顺便说
清楚一点这个有趣的现象。
首先要说明,我认为,属性并非不可以override,
成员变量是可以override的,但是成员变量是在编译时解析的
(而方法是在运行时解析的)
这样一来,当子类要引用父类对象的属性时,实际上它会屏蔽
自己的同名属性,只去访问父类对象的属性,所以直接引用
变量名和通过方法来获取变量的效果是不一样的,
这里有个非常好的例子,有时间好好看看,想想
public class Shadow {
  public static void main(String s[]) {
    S1 s1 = new S1();
    S2 s2 = new S2();
    System.out.println(s1.s); // prints S1
    System.out.println(s1.getS()); // prints S1
    System.out.println(s2.s); // prints S2
    System.out.println(s2.getS()); // prints S2
    s1 = s2;
    System.out.println(s1.s); // prints S1, not S2 -
                      // since variable is resolved at compile time
    System.out.println(s1.getS()); // prints S2 -
                     // since method is resolved at run time
  }
}
class S1 {
  public String s = "S1";
  public String getS() {
    return s;
  }
}
class S2 extends S1{
  public String s = "S2";
  public String getS() {
    return s;
  }
}

您看到此篇文章时的感受是:
Tags: 责任编辑:administrator
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到QQ空间
分享到: 
上一篇值得关注:Java 1.4 即将发布版本.. 下一篇给所有刚学JAVA以及常来此版的兄弟

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

相关栏目

最新文章

图片主题

热门文章

推荐文章

相关文章

广告位