2015-10-13 2 views
1

Когда я хочу определить новую реализацию не виртуального метода, тогда я мог бы использовать ключевое слово new в ключе C# или shadow в VB. Например:Что такое VB «Shadow» или C# «новое» ключевое слово Equivalent в Java?

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 

Теперь мой вопрос:

Что такое VB Shadow (или C# new) Ключевое слово эквивалент в Java?

+2

Обратите внимание, что вы не * переопределяете метод в этом случае, вы определяете новую реализацию, начиная с этой точки в иерархии классов. Это другое. Переопределение имеет весьма специфическую семантику, особенно то, как вызовы этого метода обрабатываются для переменных, которые имеют супертип. И затенение реализации метода супертипа имеет другую семантику. – Joey

+0

@Joey Я редактирую свой вопрос для новой реализации вместо ключевого слова override. Спасибо за внимание. – Behzad

ответ

5

Первичный ответ на ваш вопрос, вероятно, «нет». Детали:

Методы Java являются «виртуальными» (по терминологии C#) по умолчанию; они могут быть переопределены в подклассах. Специального ключевого слова не требуется для исходного метода. При определении переопределения полезно (но не требуется) использовать аннотацию @Override, чтобы компилятор предупредил вас, если вы не переопределяете, когда думаете, что находитесь, и поэтому люди, читающие код (и JavaDoc), знают, что ты делаешь.

т.д .:

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

Обратите внимание, что нет никакого специального ключевого слова на method в Parent.

Если 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) 
    } 
}