8

可能重复:
Java 中的方法是否有“新”修饰符?

在 c# 中,子类的方法可以修改为 new

new 修饰符的一种用法是显式隐藏从基类继承的成员。

Java中有相同的关键字吗?

4

2 回答 2

4

不。

在 C# 中,您使用 new 来隐藏/隐藏基类的非虚拟函数。您在 C# 中需要这个关键字,因为您不能覆盖非虚拟函数。

在 Java 中,默认情况下所有函数都是虚拟的,因此您可以随时覆盖它们,并且不需要诸如 new 之类的关键字。

希望这可以帮助。

于 2013-01-16T06:26:20.350 回答
2

在 C# 中,您想要从基类覆盖的任何方法都需要是abstractvirtual或者override本身。new 关键字实际上并没有进行覆盖。它的工作方式有点不同:

如果你用 new 关键字声明一个函数,隐藏一个基类的函数,那么只有当你有一个相同子类型的对象时才会使用这个实现。例子:

class TopClass
    {
        public String getHello()
        {
            return "Hello";
        }

        public virtual String getWorld()
        {
            return "World";
        }
    }

    class ChildClass : TopClass
    {
        public new String getHello()
        {
            return "Hi";
        }

        public override string getWorld()
        {
            return "Earth";
        }
    }

这将导致:

        TopClass tc = new TopClass();
        Console.WriteLine(tc.getHello() + " " + tc.getWorld()); // Hello World

        ChildClass cc = new ChildClass();
        Console.WriteLine(cc.getHello() + " " + cc.getWorld()); // Hi Earth

        TopClass tc2 = new ChildClass();
        Console.WriteLine(tc2.getHello() + " " + tc2.getWorld()); // Hello Earth

        Console.ReadLine();

您可以看到 new 关键字与典型覆盖相比的区别:如果将扩展类强制转换为父类 ClassType,则覆盖函数(返回地球而不是世界)仍然有效,而新函数则无效 (不返回 Hi 而不是 Hello)。

于 2013-01-16T06:51:18.483 回答