作为一名Java开发人员,当我有一天意外地使用new关键字而不是覆盖时,我对结果感到有些惊讶.
似乎new关键字在继承树中删除了该级别的方法的"虚拟性",因此在子类的实例上调用一个方法,该方法被下载到父类,将不会解析为该方法的实现.儿童班.
这种行为有哪些实际用例?
澄清:我理解父母不是虚拟的时候使用new.我更好奇为什么编译器允许组合新的和虚拟的.
以下示例说明了不同之处:
using System;
public class FooBar
{
public virtual void AAA()
{
Console.WriteLine("FooBar:AAA");
}
public virtual void CCC()
{
Console.WriteLine("FooBar:CCC");
}
}
public class Bar : FooBar
{
public new void AAA()
{
Console.WriteLine("Bar:AAA");
}
public override void CCC()
{
Console.WriteLine("Bar:CCC");
}
}
public class TestClass
{
public static void Main()
{
FooBar a = new Bar();
Bar b = new Bar();
Console.WriteLine("Calling FooBar:AAA");
a.AAA();
Console.WriteLine("Calling FooBar:CCC");
a.CCC();
Console.WriteLine("Calling Bar:AAA"); …Run Code Online (Sandbox Code Playgroud) c# ×1