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

© 路边小色狼 中级黑马   /  2013-9-5 15:30  /  1266 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 路边小色狼 于 2013-9-5 16:48 编辑

class Fu
         {
        int x=1;
         }
class Zi extends Fu
        {
        int x=2;
         }
class DuoTai
        {
public static void main(String[] args)
        {
       Fu f=new Zi();
       System.out.println(f.x);//打出来结果是1
}
}
--------------------------------------------------------------------------------
class Fu
         {
     int  fuZhi()            //做一个赋值的方法,x=1
              {
               int x=1;
               return x;
              }
         }
class Zi extends Fu
        {
     int fuZhi()           //做一个赋值的方法。x=2
              {
            int x=2;
            return x;
              }
         }
class DuoTai
        {
public static void main(String[] args)
        {
       Fu f=new Zi();
       System.out.println(f.fuZhi());//打出来结果是2
}
}


为什么前者不覆写,后者却覆写了????

评分

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

查看全部评分

4 个回复

倒序浏览
占个位置  
回复 使用道具 举报
前边的那个是父类引用指向了子类的对象,变量调用的是父类的,后边的那个是重写了父类的方法,使用的是子类方法里边的变量。
回复 使用道具 举报
本帖最后由 IfWhileCaseFor 于 2013-9-5 16:22 编辑

附上我的理解:
引用变量只能调用声明该变量所用到的类中的方法,例如我们有 Object p = new Person()则p只能调用Object类中的方法,不能调用Person类中的而方法;对象的属性则没有多态性;Fu类中int x = 1;就是一个对象的属性--实例属性而非类的成员属性,satic修饰的属性为类的成员属性;
  1. public class TestDemo24{
  2.         public static void main(String[] args){
  3.                 Base ss = new SubBase24();        //编译时与运行时类型不同导致多态发生
  4.                 System.out.println("输出SS的book属性  "+ss.book);        //输出的为父类Base的book属性,而非子类的book属性
  5.                 ss.base();        //此处调用父类的base方法
  6.                 ss.test();        //此处调用子类的重写的父类test方法
  7.                 //ss.sub();  父类不包含sub方法,此处会报错
  8.         }
  9. }
  10. class Base24{                        //定义父类Base24
  11.         public int book = 6;                        //父类的book属性为6
  12.         public void base(){
  13.                 System.out.println("父类的普通方法");
  14.         }
  15.         public void test(){
  16.                 System.out.println("父类被覆盖的方法");
  17.         }
  18. }
  19. class SubBase24 extends Base{
  20.         public String book = "天才程序员";//重新定义父类中的book属性
  21.         public void test(){        //重写父类的test方法
  22.                 System.out.println("子类重写父类的test方法");
  23.         }
  24.         public void sun(){
  25.                 System.out.println("子类的普通方法");
  26.         }
  27. }
复制代码
输出结果为
  1. 输出SS的book属性  6
  2. 父类的普通方法
  3. 子类重写父类的test方法
复制代码
仅为个人理解,谢谢!

评分

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

查看全部评分

回复 使用道具 举报
多态不是有个口诀么 Fu f = new Zi();
非静态成员函数:编译时期看左边,运行时期看右边
静态或非静态成员变量:编译运行都看左边。

希望对你有帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马