2010-03-26 18 views
5

Java nicht überwiegendes von statischen Methoden erlauben aber,Statische Methoden und deren zwingende

class stat13 
{ 
    static void show() 
    { 
     System.out.println("Static in base"); 
    } 
    public static void main(String[] ar) 
    { 
     new next().show(); 
    } 
} 


class next extends stat13 
{ 
    static void show() 
    { 
     System.out.println("Static in derived"); 
    } 
} 

überschreibt hier noch nicht fertig?

+0

bitte bedenken Sie, die Frage bearbeiten ... Code ist nicht so lesbar. – RubyDubee

+0

danke pgras für die Bearbeitung der Frage können Sie mir nur sagen, wie Sie Formatierung getan haben? – abson

Antwort

4

Dies ist "Verbergen", nicht "Überschreiben". Um dies zu sehen, ändern Sie die main Methode auf die folgenden:

public static void main (String[] arghh) { 
    next n = new next(); 
    n.show(); 
    stat13 s = n; 
    s.show(); 
} 

Dieser Druck sollte:

Static in derived 
Static in base 

Wenn es wirklich war überwiegendes los, dann würden Sie sehen:

Static in derived 
Static in derived 

Es wird allgemein als schlechter Stil erachtet, eine statische Methode unter Verwendung eines Instanztyps aufzurufen ... wie Sie es tun ... weil es leicht zu denken ist, dass Sie eine Instanzmethode aufrufen und verwirrt werden zu denken, dass das Überschreiben geschieht. Ein Java-Checker/-Code-Audit-Tool wird dies typischerweise als einen Style-Fehler/potentiellen Fehler kennzeichnen.

9

Nein, Sie überschreiben nichts - Sie sind nur versteckt die ursprüngliche Methode.

Es ist bedauerlich, dass Java Ihnen erlaubt, eine statische Methode über eine Referenz aufzurufen. Ihr Anruf es einfacher geschrieben als:

next.show(); 

Wichtig ist, würde dieser Code noch die ursprüngliche Version in stat13 nennen:

public static void showStat(stat13 x) 
{ 
    x.show(); 
} 
... 
showStat(new next()); 

Mit anderen Worten, die Bindung an die richtige Methode ist bei compile- getan Zeit, und hat nichts mit dem Wert von x zu tun - was normalerweise mit dem Überschreiben wäre.

1

Java gibt keinen Compiler-Fehler dafür. aber diese Methode verhält sich nicht wie das, was Sie erwarten ... besser erklärt here

0

Überschreiben geschieht, wenn eine Kindklasse eine eigene Implementierung für eine Methode bereitstellt, so dass die Kindklasseninstanz aufgerufen wird. Das operative Wort hier ist - Beispiel.

Statische Methoden werden im Zusammenhang mit der Klasse aufgerufen, z.

stat13.show(...); 

ODER

next.show(...); 

FWIW, Ihr Beispielcode ist kein Beispiel vorran.

0

Das Überschreiben geschieht auf der Objektebene. für ex obj1. overridedmenthod(). und es gibt kein Konzept, eine Klassenmethode zu überschreiben, dh ... statische Methode ex: Class.overriledmethod().

und dieses Konzept des Überschreibens einer statischen Methode wird als Verbergen von Methoden bezeichnet.

probieren Sie ein einfaches Beispiel aus.