Java中是否有类似于C#中的'new'修饰符的等效方法?

8

2
可能在C#中应该避免使用new。也许重新设计会更好? - horgh
2个回答

4

不需要。

C#中使用new来隐藏/屏蔽基类的非虚函数。你需要在C#中使用这个关键字,因为你不能重写非虚函数。

在Java中,默认情况下所有函数都是虚函数,因此你可以随时重写它们,无需像new这样的关键字。

希望这可以帮助到您。


2
(然后有人把一个方法设为final。。) - user166390

2
在C#中,如果您想要覆盖基类的任何方法,则需要将其设置为“abstract”、“virtual”或者是“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();

相比于典型的覆盖,你可以看到新关键字的区别:

如果扩展类被转换为父类类型,那么重写函数(返回地球而不是世界)仍然有效,而新函数则不会生效(不会返回Hi而不是Hello)。


当转换为通用(顶级)类型时,需要了解基类方法的使用。+1 个示例。 - Destrictor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接