2013-01-16 10 views
7

Mögliche Duplizieren:
Is there a ‘new’ modifier for methods in Java?Gibt es ein Java-Äquivalent zum "neuen" Modifikator in C#?

In C#, kann ein Verfahren modified as new sein der Unterklasse.

Eine Verwendung des neuen Modifikators zum expliziten Verbergen eines von einer Basisklasse geerbten Elements.

Gibt es dasselbe Java-Schlüsselwort?

+5

Kurze Antwort: Nein –

+2

Wahrscheinlich ist diese Verwendung von 'new' in C# zu vermeiden. Vielleicht wäre es besser, neu zu gestalten? – horgh

Antwort

4

Nr

In C# Sie neu verwenden zu verstecken/shadow nicht-virtuelle Funktionen einer Basisklasse. Sie benötigen dieses Schlüsselwort in C#, da Sie Funktionen, die nicht virtuell sind, nicht überschreiben können.

In Java sind alle Funktionen standardmäßig virtuell, daher können Sie sie jederzeit überschreiben und es ist kein Schlüsselwort wie neu erforderlich.

Hoffe, das hilft.

+1

(Und dann geht jemand und macht eine Methode 'final' ..) –

2

In C# muss jede Methode, die Sie von der Basisklasse überschreiben möchten, abstract, virtual oder override selbst sein. Das neue Keyword führt keine Überschreibung durch. Es funktioniert irgendwie anders:

Wenn Sie eine Funktion mit dem new-Schlüsselwort deklarieren und die Funktion einer Basisklasse ausblenden, wird diese Implementierung nur verwendet, wenn Sie ein Objekt desselben Kindtyps haben. Beispiel:

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"; 
     } 
    } 

Dies führt zu:

 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(); 

Sie den Unterschied des neuen Keywords im Vergleich sehen können zu einer typischen Überschreibung: Wenn die abgeleitete Klasse zu einem Eltern Classtype gegossen wird, das übergeordnete Funktionen (Earth anstelle von World zurückgeben) werden weiterhin wirksam sein, während die neuen Funktionen nicht funktionieren (Hi wird NICHT anstelle von Hello zurückgegeben).

+0

+1 für die Beispiele. Gut zu wissen, dass Basisklassenmethoden verwendet werden, wenn sie in generische (Topclass-) Typen umgewandelt werden. – Destrictor

Verwandte Themen