【问题标题】:What is the VB "Shadow" or C# "new" keyword Equivalent in Java?Java中等效的VB“Shadow”或C#“new”关键字是什么?
【发布时间】:2015-10-13 09:16:17
【问题描述】:

当我想定义一个非虚方法的新实现时,我可以在 C# 中使用 new 关键字或在 VB 中使用 shadow 关键字。例如:

C#代码:

public class Animal
{
    public void MyMethod()
    {
        //Do some thing
    }
}

public class Cat : Animal
{
    public new void MyMethod()
    {
        //Do some other thing
    }
}

VB代码:

Public Class Animal
    Public Sub MyMethod()
        'Do some thing
    End Sub
End Class

Public Class Cat
    Inherits Animal

    Public Shadows Sub MyMethod()
        'Do some other thing
    End Sub
End Class

现在,我的问题是:

Java 中等效的 VB Shadow(或 C# new)关键字是什么?

【问题讨论】:

  • 请注意,在这种情况下,您并没有覆盖该方法,而是从类层次结构中的这一点开始定义一个新的实现。那不一样。覆盖具有非常特定的语义,尤其是如何处理对超类型变量的调用该方法。并且遮蔽超类型的方法实现具有不同的语义。
  • @Joey 我将我的问题编辑为新的实现,而不是覆盖关键字。感谢您的注意。

标签: java c# vb.net shadow


【解决方案1】:

您问题的主要答案可能是“没有”。详情:

Java 的方法默认是“虚拟的”(在 C# 术语中);它们可以在子类中被覆盖。原始方法不需要特殊关键字。在定义覆盖时,使用@Override 注释很有用(但不是必需),这样编译器会在你认为你没有覆盖时发出警告,因此人们阅读代码(和 JavaDoc)知道你在做什么。

例如:

class Parent {
    public void method() {
    }
}
class Child extends Parent {
    @Override
    public void method() {
    }
}

请注意,methodParent 中没有特殊关键字。

如果 Java 方法标记为 final(非虚拟,C# 默认值),则根本无法覆盖它。在这种情况下,没有与 C# 的 new 等效的东西。例如:

class Parent {
    public final void method() {
    }
}
class Child extends Parent {
    @Override                   // <== Won't compile, you simply can't override
    public void method() {      // <== final methods at all (even if you added
                                // <== "final" to the declaration)
    }
}

【讨论】:

    猜你喜欢
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2010-12-29
    • 2011-03-11
    • 1970-01-01
    • 2015-05-16
    • 2011-03-27
    相关资源
    最近更新 更多