it-swarm.com.de

Warum beschwert sich der Compiler nicht, wenn ich versuche, eine statische Methode zu überschreiben?

Ich weiß, dass wir statische Methoden in Java nicht überschreiben können, aber kann jemand den folgenden Code erklären?

class A {
    public static void a() { 
        System.out.println("A.a()");
    }
}   

class B extends A {
    public static void a() {
        System.out.println("B.a()");
    }
}

Wie konnte ich die Methode a() in der Klasse B überschreiben?

34
user2395360

Sie haben hier nichts außer Kraft gesetzt. Versuchen Sie, die Annotation @Override Vor public static void a() in die Klasse B zu setzen, und Java wird einen Fehler auslösen.

Sie haben gerade eine Funktion in der Klasse B mit dem Namen a() definiert, die sich von der Funktion a() in der Klasse A unterscheidet (in keiner Beziehung).

Da B.a() denselben Namen wie eine Funktion in der übergeordneten Klasse hat, wird A.a() [As ausgeblendet gezeigt von Eng. Fouad]. Zur Laufzeit verwendet der Compiler die tatsächliche Klasse der deklarierten Referenz, um zu bestimmen, welche Methode ausgeführt werden soll. Beispielsweise,

B b = new B();
b.a() //prints B.a()

A a = (A)b;
a.a() //print A.a(). Uses the declared reference's class to find the method.

Sie können statische Methoden in Java nicht überschreiben. Denken Sie daran, dass static Methoden und Felder der Klasse und nicht den Objekten zugeordnet sind. (Obwohl dies in einigen Sprachen wie Smalltalk möglich ist).

Ich habe hier einige gute Antworten gefunden: Warum lässt Java das Überschreiben statischer Methoden nicht zu?

54
goblinjuice

Das heißt hiding a method, wie im Java Tutorial Overriding and Hiding Methods angegeben:

Wenn eine Unterklasse eine Klassenmethode mit der gleichen Signatur wie eine Klassenmethode in der Superklasse definiert, verbirgt die Methode in der Unterklasse die in der Superklasse.

9
Eng.Fouad

static Methoden werden nicht vererbt, daher wird die separate Kopie der Methode von B verwendet

static beziehen sich auf class und nicht auf den Zustand von Object

6
Jigar Joshi

Sie haben die Methode a() nicht überschrieben, da static Methoden nicht vererbt werden. Wenn du @Override, du hättest einen Fehler gesehen.

A.Java:10: error: method does not override or implement a method from a supertype
    @Override
    ^
1 error

Das hindert Sie jedoch nicht daran, statische Methoden mit derselben Signatur in beiden Klassen zu definieren.

3
rgettman

Die Auswahl der aufzurufenden Methode hängt auch vom deklarierten Typ der Variablen ab.

B b = null;
b.a(); // (1) prints B.a()
A a = new B();
a.a(); // (2) prints a.a() 

Bei (1) würde das System, wenn es sich um die Identität von b kümmerte, einen NPE auslösen. und bei (2) wird der Wert von a ignoriert. Da a als A deklariert ist, wird A.a() aufgerufen.

2
Eric Jablow

Ihre Methode wird nicht überschrieben. Sie versuchen lediglich, die Annotation @Override vor Ihre Methode in der abgeleiteten Klasse zu setzen. es wird Ihnen einen Kompilierungszeitfehler geben. Java erlaubt es Ihnen nicht, statische Methoden zu überschreiben.

1
user1374185

Während die Antwort von goblinjuice akzeptiert wurde, dachte ich, dass der Beispielcode verbessert werden könnte:

public class StaticTest {
    public static void main(String[] args) {
        A.print();
        B.print();
        System.out.println("-");

        A a = new A();
        B b = new B();
        a.print();
        b.print();
        System.out.println("-");

        A c = b;
        c.print();
    }
}

class A {
    public static void print() {
        System.out.println("A");
    }
}

class B extends A {
    public static void print() {
        System.out.println("B");
    }
}

Produziert:

A
B
-
A
B
-
A

Wenn B print() überschrieben hätte, hätte es B in die letzte Zeile geschrieben.

1
David Newcomb

Statische Methoden werden nach ihrem Klassennamen aufgerufen, sodass wir kein Klassenobjekt erstellen müssen. Wir rufen es nur mit dem Klassennamen auf, damit wir statische Methoden nicht überschreiben können

beispielsweise

class AClass{
public static void test(){

 } 
}

class BClass extends AClass{
public static void test(){}

}

class CClass extends BClass{
public static void main(String args[]){

AClass aclass=new AClass();

aclass.test(); // its wrong because static method is called 
               // by its class name it can't accept object
}
}

wir nennen es einfach

AClass.test();

bedeutet, dass statische Klassen nicht überschrieben werden können, wenn sie überschrieben werden.

0
javaCode555