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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔增阳 中级黑马   /  2014-3-24 21:59  /  1605 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔增阳 于 2014-3-25 19:12 编辑

请问重写override和隐藏new有什么区别?

评分

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

查看全部评分

4 个回复

倒序浏览
父类引用指向子类对象时 ,Base b=new Sub();
若子类override 父类的方法,当b.子类方法() 调用时,执行的是覆盖父类的子类的方法体
若子类new 父类的方法,当b.子类方法()调用时,执行的是被隐藏的父类的方法体

评分

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

查看全部评分

回复 使用道具 举报
override是子类重写了父类的方法,但是父类还可以调用自己的方法
而隐藏new则是子类隐藏了父类的方法,父类自己的方法调用不到了

评分

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

查看全部评分

回复 使用道具 举报
new为显式隐藏父类方法,override是重写。
隐藏父类方法执行里氏转换后会执行父类方法。如:
Base b=new Sub();执行父类方法。
重写时,执行里氏转换后,会根据父类中子类对象的不同执行不同的方法。如:
Base b=new Sub1();
Base b=new Sub2();分别执行Sub1和Sub2的方法。

评分

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

查看全部评分

回复 使用道具 举报
参照下面的代码看看:
  1.     class A
  2.     {
  3.         public void F()        //非虚方法
  4.         { Console.Write(" A.F"); }

  5.         public virtual void G()        //虚方法
  6.         { Console.Write(" A.G"); }
  7.     }
  8.     class B : A        //A类为B类的基类
  9.     {
  10.         new public void F()        //重写基类的同名非虚方法F(),使用new
  11.         { Console.Write(" B.F"); }

  12.         public override void G()        //覆盖基类的同名虚方法G(),使用override
  13.         { Console.Write(" B.G"); }
  14.     }
  15.     class Test
  16.     {
  17.         static void Main()
  18.         {
  19.             B b = new B();
  20.             A a = b;        //因为B类继承于A类,所以可以用 A类的引用变量 来引用 B类的对象
  21.             //也就相当于
  22.             //int i;
  23.             //object ob = i;

  24.             a.F();        //F()在派生类中被new重写了,但在此还是调用基类A的F(),显示A.F

  25.             a.G();        //G()在派生类中被override覆盖,也就隐藏了基类的G()方法,
  26.          //所以调用的是派生类B中的G(),显示B.G
  27.         }
  28.     }
复制代码



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