Kann ich statische Methoden in Java überschreiben und überladen?


Antworten:


97

Statische Methoden können nicht im genauen Sinne des Wortes überschrieben werden, sie können jedoch übergeordnete statische Methoden ausblenden

In der Praxis bedeutet dies, dass der Compiler entscheidet, welche Methode zur Kompilierungszeit und nicht zur Laufzeit ausgeführt werden soll, wie dies bei überschriebenen Instanzmethoden der Fall ist.

Ein gutes Beispiel finden Sie hier .

In dieser Java-Dokumentation wird der Unterschied zwischen dem Überschreiben von Instanzmethoden und dem Ausblenden von (statischen) Klassenmethoden erläutert .

Überschreiben: Überschreiben in Java bedeutet einfach, dass die bestimmte Methode basierend auf dem Laufzeittyp des Objekts und nicht auf dem Kompilierungszeittyp des Objekts aufgerufen wird (was bei statischen Methoden zum Überschreiben der Fall ist).

Ausblenden: Übergeordnete Klassenmethoden, die statisch sind, sind nicht Teil einer untergeordneten Klasse (obwohl auf sie zugegriffen werden kann), sodass es keine Frage gibt, sie zu überschreiben. Selbst wenn Sie einer Unterklasse eine andere statische Methode hinzufügen, die mit der in der übergeordneten Klasse identisch ist, ist diese statische Methode der Unterklasse eindeutig und unterscheidet sich von der statischen Methode in der übergeordneten Klasse.


2
Vielen Dank, Ihr Link hat mir geholfen, meine Antwort herauszufinden. Ich habe dies in Ihrem angegebenen Link gelesen: "Überschreiben in Java bedeutet einfach, dass die bestimmte Methode basierend auf dem Laufzeittyp des Objekts und nicht auf dem Typ der Kompilierungszeit des Objekts aufgerufen wird (was bei statischen Methoden zum Überschreiben der Fall ist). "" Dies war die Antwort, nach der ich gesucht habe. Vielen Dank.
Mital Pritmani

2
Ich fand ausführlichere Erklärungen auf CodeRanch
realPK

Damit diese Antwort wirklich vollständig ist, sollten Sie wahrscheinlich den zweiten Teil der Frage beantworten.
Tim M.

29

Statische Methoden können nicht überschrieben werden, da nichts zu überschreiben ist, da es sich um zwei verschiedene Methoden handelt. Zum Beispiel

static class Class1 {
    public static int Method1(){
          return 0;
    }
}
static class Class2 extends Class1 {
    public static int Method1(){
          return 1;
    }

}
public static class Main {
    public static void main(String[] args){
          //Must explicitly chose Method1 from Class1 or Class2
          Class1.Method1();
          Class2.Method1();
    }
}

Und ja, statische Methoden können wie jede andere Methode überladen werden.


2
Können Sie mehr Licht auf statische Methoden werfen, die nicht überschrieben werden können, weil es nichts zu überschreiben gibt ? Was bekommt jemand dabei: Klasse1 c1 = neue Klasse2 (); Klasse2 c2 = neue Klasse2 (); Erwarte ich Methode1 () von Klasse2, die in beiden Fällen aufgerufen wird, oder NICHT?
RealPK

Für eine statische Methode gibt es nichts zu überschreiben, da statische Methoden zur Kompilierungszeit verknüpft sind, im Gegensatz zu normalen Methoden, deren Ausführung zur Laufzeit festgelegt wird. Sie können NICHT erwarten c1.Method1()und c2.Method1()dieselbe Funktion aufrufen. Tatsächlich warnt Sie der Compiler, dass das Aufrufen statischer Funktionen auf diese Weise keine kluge Sache ist.
VolatileDream

Korrigieren Sie mich, wenn ich immer noch verwirrt bin - 1. ClassName.methodName () ist die beste Methode, um statische Methoden in Java aufzurufen. 2. Der Referenztyp ist wichtig, wenn es um statische Methoden geht, und NICHT der instanziierte Typ KANN NICHT überschrieben werden, obwohl der Code so aussieht, als würde er die Methode überschreiben.
RealPK

In jeder Hinsicht richtig. Ich habe hier ein kleines Demo-Beispiel zusammengestellt .
VolatileDream

1
In Java können wir die Klasse der obersten Ebene nicht statisch machen. Nur verschachtelte Klassen können statisch sein. Die oben vom Benutzer angegebene Lösung ist völlig falsch.
user1001

15

Statische Methoden können nicht überschrieben werden, da sie zur Laufzeit nicht auf der Objektinstanz ausgelöst werden. Der Compiler entscheidet, welche Methode aufgerufen wird.

Aus diesem Grund erhalten Sie beim Schreiben eine Compiler-Warnung

 MyClass myObject = new MyClass();
 myObject.myStaticMethod();
 // should be written as
 MyClass.myStaticMethod()
 // because it is not dispatched on myObject
 myObject = new MySubClass();
 myObject.myStaticMethod(); 
 // still calls the static method in MyClass, NOT in MySubClass

Statische Methoden können überladen werden (dh Sie können für mehrere Methoden denselben Methodennamen verwenden, sofern sie unterschiedliche Parametertypen haben).

 Integer.parseInt("10");
 Integer.parseInt("AA", 16);

1
In Delphi können statische Methoden überschrieben werden - sie haben nur einen Zeiger auf VMT anstelle einer Objektinstanz (und das obige Beispiel würde einen Aufruf ausführen MySubClass.myStaticMethod).
Ha.

8

Übergeordnete Klassenmethoden, die statisch sind, sind nicht Teil einer untergeordneten Klasse (obwohl auf sie zugegriffen werden kann), sodass es keine Frage gibt, sie zu überschreiben. Selbst wenn Sie einer Unterklasse eine andere statische Methode hinzufügen, die mit der in der übergeordneten Klasse identisch ist, ist diese statische Methode der Unterklasse eindeutig und unterscheidet sich von der statischen Methode in der übergeordneten Klasse.


4

Statische Methoden können nicht überschrieben werden, da sie nicht Teil des Objektstatus sind. Sie gehören vielmehr zur Klasse (dh sie sind Klassenmethoden). Es ist in Ordnung, statische (und endgültige) Methoden zu überladen.


3

Wenn ich die Methode unter Verwendung des Unterklassennamens MysubClass aufrufe, zeigt die Unterklassenmethode an, was bedeutet, dass die statische Methode überschrieben werden kann oder nicht

class MyClass {
    static void myStaticMethod() {
        System.out.println("Im in sta1");
    }
}

class MySubClass extends MyClass {

    static void  myStaticMethod() {
        System.out.println("Im in sta123");
    }
}

public class My {
    public static void main(String arg[]) {

        MyClass myObject = new MyClass();
        myObject.myStaticMethod();
        // should be written as
        MyClass.myStaticMethod();
        // calling from subclass name
        MySubClass.myStaticMethod();
        myObject = new MySubClass();
        myObject.myStaticMethod(); 
        // still calls the static method in MyClass, NOT in MySubClass
    }
}

3

Statische Methoden sind Methoden, deren einzelne Kopie von allen Objekten der Klasse gemeinsam genutzt wird. Die statische Methode gehört eher zur Klasse als zu den Objekten. Da statische Methoden nicht von den Objekten abhängen, muss der Java Compiler nicht bis zur Objekterstellung warten. Um die statische Methode aufzurufen, verwenden wir eine Syntax wie ClassName.method ().

Im Falle einer Methodenüberladung sollten sich Methoden in derselben Klasse befinden, um sie zu überladen. Auch wenn sie als statisch deklariert sind, können sie wie folgt überladen werden:

   Class Sample
    {
         static int calculate(int a,int b,int c)
           {
                int res = a+b+c;
                return res;
           }
           static int calculate(int a,int b)
           {
                int res = a*b;
                return res;
           }
}
class Test
{
   public static void main(String []args)
   {
     int res = Sample.calculate(10,20,30);
   }
}

Beim Überschreiben von Methoden fungieren die Methode in der Superklasse und die Methode in der Unterklasse jedoch als unterschiedliche Methoden. Die Superklasse hat eine eigene Kopie und die Unterklasse hat eine eigene Kopie, sodass sie nicht unter das Überschreiben von Methoden fällt.


3

Überladen wird auch als statische Bindung bezeichnet. Sobald das Wort statisch verwendet wird, bedeutet dies, dass eine statische Methode keinen Laufzeitpolymorphismus anzeigen kann .

Wir können eine statische Methode nicht überschreiben, aber das Vorhandensein verschiedener Implementierungen derselben statischen Methode in einer Superklasse und ihrer Unterklasse ist gültig. Es ist nur so, dass die abgeleitete Klasse die Implementierungen der Basisklasse verbirgt.

Bei statischen Methoden hängt der Methodenaufruf von der Art der Referenz ab und nicht davon, auf welches Objekt verwiesen wird. Das heißt, die statische Methode gehört nur zu einer Klasse und nicht zu deren Instanzen. Daher wird der Methodenaufruf zur Kompilierungszeit selbst entschieden.

Während bei Methodenüberladung statische Methoden überladen werden können, wenn sie unterschiedliche Anzahlen oder Arten von Parametern haben. Wenn zwei Methoden denselben Namen und dieselbe Parameterliste haben, können sie nicht nur mit dem Schlüsselwort 'static' unterschiedlich definiert werden.


Eine Methodensignatur ist der Methodenname sowie die Anzahl, der Typ und die Reihenfolge ihrer Parameter . Das heißt, selbst wenn die Reihenfolge der Parameter in der Methode geändert wird, kann sie erfolgreich überladen werden.
iCantC

2

Nein, statische Methoden können nicht überschrieben werden, da sie Teil einer Klasse und nicht eines Objekts sind. Man kann aber statische Methoden überladen.



1
class SuperType {

    public static void  classMethod(){
        System.out.println("Super type class method");
    }
    public void instancemethod(){
        System.out.println("Super Type instance method");
    }
}


public class SubType extends SuperType{


    public static void classMethod(){
        System.out.println("Sub type class method");
    }
    public void instancemethod(){
        System.out.println("Sub Type instance method");
    }
    public static void main(String args[]){
        SubType s=new SubType();
        SuperType su=s;
        SuperType.classMethod();// Prints.....Super type class method
        su.classMethod();   //Prints.....Super type class method
        SubType.classMethod(); //Prints.....Sub type class method 
    }
}

Dieses Beispiel für das Überschreiben statischer Methoden

Hinweis: Wenn wir eine statische Methode mit Objektreferenz aufrufen, wird die statische Methode des Referenztyps (Klasse) aufgerufen, nicht die statische Methode der Objektklasse.

Die statische Methode gehört nur zur Klasse.


Statische Methoden werden nicht überschrieben , sondern ausgeblendet . Weitere
Informationen finden

0

Der eigentliche Zweck der Verwendung der statischen Methode besteht darin, auf die Methode einer Klasse zuzugreifen, ohne eine Instanz dafür zu erstellen. Es macht keinen Sinn, wenn wir diese Methode überschreiben, da auf sie über classname.method () zugegriffen wird.


0

Nein, Sie können eine statische Methode nicht überschreiben. Die Statik wird gegen die Klasse aufgelöst, nicht gegen die Instanz.

public class Parent { 
    public static String getCName() { 
        return "I am the parent"; 
    } 
} 

public class Child extends Parent { 
    public static String getCName() { 
        return "I am the child"; 
    } 
} 

Jede Klasse hat eine statische Methode getCName (). Wenn Sie den Klassennamen aufrufen, verhält er sich wie erwartet und jeder gibt den erwarteten Wert zurück.

@Test 
public void testGetCNameOnClass() { 
    assertThat(Parent.getCName(), is("I am the parent")); 
    assertThat(Child.getCName(), is("I am the child")); 
} 

Keine Überraschungen bei diesem Unit-Test. Dies wird jedoch nicht außer Kraft gesetzt. Dies deklariert etwas, das eine Namenskollision aufweist.

Wenn wir versuchen, die Statik von einer Instanz der Klasse aus zu erreichen (keine gute Praxis), zeigt dies wirklich:

private Parent cp = new Child(); 
`enter code here`
assertThat(cp.getCName(), is("I am the parent")); 

Obwohl cp ein untergeordnetes Element ist, wird die statische Aufladung durch den deklarierten Typ Parent anstelle des tatsächlichen Objekttyps aufgelöst. Bei nicht statischen Methoden wird dies korrekt behoben, da eine nicht statische Methode eine übergeordnete Methode überschreiben kann.


0

Sie können eine statische Methode überladen, eine statische Methode jedoch nicht überschreiben. Eigentlich können Sie eine statische Methode in Unterklassen umschreiben, dies wird jedoch nicht als Überschreibung bezeichnet, da die Überschreibung mit Polymorphismus und dynamischer Bindung zusammenhängen sollte. Die statische Methode gehört zur Klasse und hat also nichts mit diesen Konzepten zu tun. Das Umschreiben der statischen Methode ähnelt eher einem Schatten.


0

Ich entwerfe einen Code zum Überschreiben statischer Methoden. Ich denke, er kann leicht überschrieben werden. Bitte machen Sie mir klar, dass statische Elemente nicht überschrieben werden können. Hier ist mein Code.

class Class1 {
    public static int Method1(){
          System.out.println("true");
          return 0;
    }
}
class Class2 extends Class1 {
    public static int Method1(){
   System.out.println("false");
          return 1;
    }

}
public class Mai {
    public static void main(String[] args){
           Class2 c=new Class2();
          //Must explicitly chose Method1 from Class1 or Class2
          //Class1.Method1();
          c.Method1();
    }
}


0

Da jede statische Methode Teil der Klasse nicht der Instanz ist, ist es nicht möglich, die statische Methode zu überschreiben


0

Von Warum erlaubt Java das Überschreiben statischer Methoden nicht?

Das Überschreiben hängt von einer Instanz einer Klasse ab. Der Punkt des Polymorphismus besteht darin, dass Sie eine Klasse unterklassifizieren können und die Objekte, die diese Unterklassen implementieren, unterschiedliche Verhaltensweisen für dieselben Methoden aufweisen, die in der Oberklasse definiert (und in den Unterklassen überschrieben) sind. Eine statische Methode ist keiner Instanz einer Klasse zugeordnet, sodass das Konzept nicht anwendbar ist.

Es gab zwei Überlegungen, die das Design von Java beeinflussten. Eines war ein Problem mit der Leistung: Smalltalk wurde vielfach kritisiert, weil es zu langsam sei (Garbage Collection und polymorphe Aufrufe gehören dazu), und Javas Entwickler waren entschlossen, dies zu vermeiden. Ein weiterer Grund war die Entscheidung, dass die Zielgruppe für Java C ++ - Entwickler waren. Wenn statische Methoden so funktionieren, wie sie funktionieren, sind sie für C ++ - Programmierer vertraut und sehr schnell, da Sie nicht bis zur Laufzeit warten müssen, um herauszufinden, welche Methode aufgerufen werden soll.


-1

Auf keinen Fall können wir statische Methoden in Java überschreiben. Weil JVM die korrekte überschriebene Methode basierend auf dem Objekt zur Laufzeit mithilfe der dynamischen Bindung in Java auflöst.

Die statische Methode in Java ist jedoch eher der Klasse als dem Objekt zugeordnet und wird während der Kompilierungszeit aufgelöst und verbunden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.