是否有一个Java等同于C#中的'new'修饰符?

时间:2013-01-16 06:02:55

标签: c# java polymorphism

  

可能重复:
  Is there a ‘new’ modifier for methods in Java?

在c#中,子类的方法可以是modified as new

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

Java中是否有相同的关键字?

2 个答案:

答案 0 :(得分:4)

没有

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

在Java中,默认情况下所有函数都是虚函数,因此您可以始终覆盖它们,并且不需要像new这样的关键字。

希望这有帮助。

答案 1 :(得分:2)

在C#中,您要从baseclase覆盖的任何方法都需要abstractvirtualoverride本身。 new关键字确实没有覆盖。它有点不同:

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

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,则重写函数(返回Earth而不是World)仍然有效,而新函数不是(Hi不返回而不是Hello)。