黑马程序员技术交流社区
标题:
重写和隐藏
[打印本页]
作者:
崔增阳
时间:
2014-3-24 21:59
标题:
重写和隐藏
本帖最后由 崔增阳 于 2014-3-25 19:12 编辑
请问重写override和隐藏new有什么区别?
作者:
张变
时间:
2014-3-24 22:11
父类引用指向子类对象时 ,Base b=new Sub();
若子类override 父类的方法,当b.子类方法() 调用时,执行的是覆盖父类的子类的方法体
若子类new 父类的方法,当b.子类方法()调用时,执行的是被隐藏的父类的方法体
作者:
cancle
时间:
2014-3-25 09:18
override是子类重写了父类的方法,但是父类还可以调用自己的方法
而隐藏new则是子类隐藏了父类的方法,父类自己的方法调用不到了
作者:
百川
时间:
2014-3-25 10:45
new为显式隐藏父类方法,override是重写。
隐藏父类方法执行里氏转换后会执行父类方法。如:
Base b=new Sub();执行父类方法。
重写时,执行里氏转换后,会根据父类中子类对象的不同执行不同的方法。如:
Base b=new Sub1();
Base b=new Sub2();分别执行Sub1和Sub2的方法。
作者:
心灵苦旅
时间:
2014-3-25 13:31
参照下面的代码看看:
class A
{
public void F() //非虚方法
{ Console.Write(" A.F"); }
public virtual void G() //虚方法
{ Console.Write(" A.G"); }
}
class B : A //A类为B类的基类
{
new public void F() //重写基类的同名非虚方法F(),使用new
{ Console.Write(" B.F"); }
public override void G() //覆盖基类的同名虚方法G(),使用override
{ Console.Write(" B.G"); }
}
class Test
{
static void Main()
{
B b = new B();
A a = b; //因为B类继承于A类,所以可以用 A类的引用变量 来引用 B类的对象
//也就相当于
//int i;
//object ob = i;
a.F(); //F()在派生类中被new重写了,但在此还是调用基类A的F(),显示A.F
a.G(); //G()在派生类中被override覆盖,也就隐藏了基类的G()方法,
//所以调用的是派生类B中的G(),显示B.G
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2