wake-up-neo.com

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

Ich würde gerne wissen:

  1. Warum können statische Methoden in Java nicht überschrieben werden?
  2. Können statische Methoden in Java überladen werden?
49
giri

Statische Methoden können nicht im exakten Sinne des Wortes überschrieben werden, statische statische Methoden können jedoch ausgeblendet werden

In der Praxis bedeutet dies, dass der Que-Compiler entscheidet, welche Methode zur Kompilierzeit und nicht zur Laufzeit ausgeführt wird, wie dies bei überschriebenen Instanzmethoden der Fall ist.

Für ein ordentliches Beispiel schauen Sie hier .

Und das ist eine Java-Dokumentation, die den Unterschied zwischen overriding - Instanzmethoden und hiding (statischen) Klassenmethoden erklärt.

Overriding: Überschreiben in Java bedeutet einfach, dass die jeweilige Methode basierend auf dem Laufzeittyp des Objekts und .__ aufgerufen wird. nicht auf den Kompilierzeit-Typ davon (was bei Überschreiben von statischen Methoden der Fall ist.)

Hiding: Übergeordnete Klassenmethoden, die statisch sind, sind nicht Teil einer untergeordneten Klasse (obwohl sie zugänglich sind), sodass keine Frage von .__ besteht. es überschreiben Selbst wenn Sie eine andere statische Methode in einer Unterklasse hinzufügen, wird Diese statische Methode der Unterklasse ist identisch mit der in ihrer übergeordneten Klasse ist einzigartig und unterscheidet sich von der statischen Methode in ihrer übergeordneten Klasse.

67
opensas

Statische Methoden können nicht überschrieben werden, da nichts zu überschreiben ist, da es sich um zwei verschiedene Methoden handeln würde. 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.

24
VolatileDream

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

Deshalb 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);
9
Thilo

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

6
Kumar Manish

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

4
Manoranjan

Wenn ich die Methode mit dem SubClass-Namen MysubClass aufrufe, wird in der Subclass-Methode angezeigt, 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
    }
}
2
Dalee Bisen

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

2
user2481001

static-Methoden sind class-Methoden.

Das Versteckkonzept wird für static-Methoden verwendet.

Siehe: http://www.coderanch.com/how-to/Java/OverridingVsHiding

2
NarutoUzumaki

Statische Methoden ist eine Methode, deren einzelne Kopie von allen Objekten der Klasse gemeinsam genutzt wird. Eine statische Methode gehört zur Klasse und nicht zu den Objekten. Da statische Methoden nicht von den Objekten abhängen, muss der Java-Compiler nicht warten, bis die Objekte erstellt werden.

Wenn Methoden überladen werden, sollten Methoden in derselben Klasse enthalten sein, um sie zu überladen. Sogar wenn sie als statisch deklariert sind, können sie überladen werden als

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

Im Falle eines Überschreibens der Methode fungieren jedoch die Methode in der Oberklasse und die Methode in der Unterklasse als andere Methode. Die Superklasse hat eine eigene Kopie und die Unterklasse hat eine eigene Kopie, so dass sie nicht unter Methodenüberschreibung fällt.

2
Pravin Kamble

From Warum lässt Java statische Methoden nicht überschreiben?

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

Es gab zwei Überlegungen, die das Design von Java beeinflussten. Ein Grund zur Besorgnis war die Performance: Smalltalk hatte viel Kritik daran geübt, es sei zu langsam (Müllsammlung und polymorphe Aufrufe gehören dazu), und Javas Schöpfer waren entschlossen, dies zu vermeiden. Eine andere war die Entscheidung, dass die Zielgruppe für Java C++ - Entwickler waren. Wenn statische Methoden so funktionieren, wie sie es tun, haben C++ - Programmierer den Vorteil, dass sie vertraut sind, und waren auch sehr schnell, da nicht bis zur Laufzeit gewartet werden muss, um herauszufinden, welche Methode aufgerufen wird.

1
Tejas Bagade
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.

Statische Methode gehört nur zur Klasse.

1
shivakrishna

Die statische Methode hat den Zweck, auf die Methode einer Klasse zuzugreifen, ohne dafür eine Instanz zu erstellen.

0
Sathesh

Sie können eine statische Methode überladen, eine statische Methode jedoch nicht überschreiben. Tatsächlich 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, hat also nichts mit diesen Konzepten zu tun. Das Umschreiben der statischen Methode ähnelt eher einer Abschattung.

0
charles_ma

Ich entwerfe einen Code für das Überschreiben einer statischen Methode. Ich denke, es ist leicht zu überschreiben. Bitte machen Sie mir klar, wie es nicht in der Lage ist, statische Member zu überschreiben. 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
Nitin

Überladen wird auch als statisches Binden bezeichnet. Sobald das Word-Static verwendet wird, bedeutet dies eine statische Methode kann keinen Laufzeit-Polymorphismus anzeigen .

Wir können eine statische Methodenicht überschreiben, aber das Vorhandensein verschiedener Implementierungen derselben statischen Methode in einer Oberklasse 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 von dem Objekt, auf das verwiesen wird, d. H. Die statische Methode gehört nur zu einer Klasse und nicht zu ihren Instanzen. Daher wird der Methodenaufruf zum Zeitpunkt des Kompilierens selbst entschieden.

Während bei Methodenüberladungstatische Methodeniff überladen werden können, haben sie unterschiedliche Parameter oder Typen. Wenn zwei Methoden denselben Namen und dieselbe Parameterliste haben, können sie nicht nur mit dem Schlüsselwort 'static' unterschiedlich definiert werden.

0
Geetika Agarwal

Das ist eigentlich ziemlich einfach zu verstehen - Alles, was als statisch markiert ist, gehört nur zur Klasse. Beispielsweise können statische Methoden nicht in der Unterklasse geerbt werden, da sie zu der Klasse gehören, in der sie deklariert wurden. Statisches Schlüsselwort angeben.

Die beste Antwort, die ich auf diese Frage gefunden habe, ist:

http://www.geeksforgeeks.org/can-we-overload-oder-override-static-methods-in-Java/

0
hitesh141

Da statische Methoden nicht Teil der Klasse sind, ist es nicht möglich, statische Methoden zu überschreiben

0
Pavan T

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

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 Gerätetest. Dies ist jedoch nicht überschreibend. Dies erklärt etwas, das eine Namenskollision hat. 

Wenn wir versuchen, die Statik von einer Instanz der Klasse aus zu erreichen (keine gute Praxis), dann 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 Statik durch den deklarierten Typ Parent anstelle des tatsächlichen Typs des Objekts aufgelöst. Bei Nichtstatiken wird dies richtig aufgelöst, da eine nicht statische Methode eine Methode ihres übergeordneten Elements überschreiben kann.

0
user2500552