wake-up-neo.net

Werden statische Methoden in Java vererbt?

Ich las Ein Programmierhandbuch für Java ™ SCJP-Zertifizierung von Khalid Mughal.

Im Kapitel Vererbung wird dies erklärt

Die Vererbung der Mitglieder ist eng mit der angegebenen .__ verbunden. Zugänglichkeit. Wenn ein Superklassenmitglied unter seinem einfachen Namen erreichbar ist in der Unterklasse (ohne die Verwendung einer zusätzlichen Syntax wie "super"), dass Mitglied gilt als vererbt

Es wird auch erwähnt, dass statische Methoden nicht vererbt werden. Aber der Code unten ist perfekt:

class A
{
    public static void display()
    {
        System.out.println("Inside static method of superclass");
    }
}

class B extends A
{
    public void show()
    {
        // This works - accessing display() by its simple name -
        // meaning it is inherited according to the book.
        display();
    }
}

Wie kann ich display() in der Klasse B direkt verwenden? Darüber hinaus funktioniert B.display() auch.

Trifft die Erklärung des Buches nur auf Instanzmethoden zu?

118
Algorithmist

Alle Methoden, auf die zugegriffen werden kann, werden von Unterklassen geerbt. 

Von der Sun Java Tutorials :

Eine Unterklasse erbt alle öffentlichen und geschützten Mitglieder ihres übergeordneten Elements, unabhängig davon, in welchem ​​Paket sich die Unterklasse befindet. Wenn sich die Unterklasse im selben Paket befindet wie ihr übergeordnetes Element, erbt sie auch die package-private-Mitglieder des übergeordneten Elements. Sie können die geerbten Mitglieder unverändert verwenden, ersetzen, ausblenden oder durch neue Mitglieder ergänzen

Der einzige Unterschied zu geerbten statischen (Klassen-) Methoden und geerbten nicht-statischen (Instanz-) Methoden besteht darin, dass beim Schreiben einer neuen statischen Methode mit derselben Signatur die alte statische Methode nur versteckt und nicht überschrieben wird.

Von der Seite Auf der Differenz zwischen Überschreiben und Verstecken. 

Die Unterscheidung zwischen Verstecken und Überschreiben hat wichtige Auswirkungen. Die Version der überschriebenen Methode, die aufgerufen wird, ist die in der Unterklasse. Die Version der versteckten Methode, die aufgerufen wird, hängt davon ab, ob sie von der Superklasse oder der Unterklasse aus aufgerufen wird

155
yincrash

Wenn das Buch wirklich sagt, ist es falsch. [1]

Die Java-Sprachspezifikation Nr. 8.4.8 lautet:

8.4.8 Vererbung, Überschreibung und Ausblenden

Eine Klasse C erbt von ihrer direkten Oberklasse alle konkreten Methoden m (sowohl statisch als auch Instanz) der Oberklasse, für die alle der folgenden Bedingungen zutreffen:

  • m ist ein Mitglied der direkten Oberklasse von C.

  • m ist öffentlich, geschützt oder mit Paketzugriff in demselben Paket wie C deklariert.

  • Keine in C deklarierte Methode hat eine Unterschrift (§8.4.2) der Signatur von m.

[1] Das heißt es nicht in meiner Ausgabe, 1. Auflage, 2000.

14
user207421

Sie können den Unterschied im folgenden Code feststellen, der geringfügig über Ihren Code hinausgeht.

class A {
    public static void display() {
        System.out.println("Inside static method of superclass");
    }
}

class B extends A {
    public void show() {
        display();
    }

    public static void display() {
        System.out.println("Inside static method of this class");
    }
}

public class Test {
    public static void main(String[] args) {
        B b = new B();
        b.display();

        A a = new B();
        a.display();
    }
}

Dies liegt daran, dass statische Methoden Klassenmethoden sind.

A.display () und B.display () rufen die Methode ihrer jeweiligen Klassen auf.

8
Gaurav

B.display () funktioniert, weil die statische Deklaration die Methode/den Member der Klasse und nicht einer bestimmten Klasseninstanz (aka Object) angehört. Sie können mehr darüber lesen hier .

Beachten Sie außerdem, dass Sie eine statische Methode nicht überschreiben können. Sie können Ihre statische Methode mit derselben Signatur deklarieren lassen, das Verhalten kann jedoch anders sein als erwartet. Dies ist wahrscheinlich der Grund, warum es nicht als vererbt gilt. Sie können das problematische Szenario und die Erklärung hier auschecken.

5
Kai

Dieses Konzept ist nicht so einfach, wie es aussieht. Wir können auf statische Member ohne Vererbung zugreifen, was HasA-Relation ist. Wir können auf statische Member zugreifen, indem Sie auch die übergeordnete Klasse erweitern. Das bedeutet nicht, dass es sich um eine ISA-Beziehung (Vererbung) handelt. Tatsächlich gehören statische Member zur Klasse und statisch ist kein Zugriffsmodifizierer. Solange die Zugriffsmodifizierer den Zugriff auf die statischen Member zulassen, können sie in anderen Klassen verwendet werden. Wenn es öffentlich ist, ist es innerhalb desselben Pakets und auch außerhalb des Pakets zugänglich. Privat können wir es nirgendwo verwenden. Standardmäßig können wir es nur innerhalb des Pakets verwenden. Aber für den Schutz müssen wir die Superklasse erweitern. Daher hängt es nicht davon ab, statisch zu sein, um die statische Methode auf eine andere Klasse anzuwenden. Dies hängt von den Zugriffsmodifizierern ab. Meiner Meinung nach können statische Mitglieder darauf zugreifen, wenn die Zugriffsmodifizierer dies zulassen. Ansonsten können wir sie wie von Hasa-Relation verwenden. Und hat eine Beziehung, keine Erbschaft. Wieder können wir die statische Methode nicht überschreiben. Wenn wir eine andere Methode verwenden können, sie aber nicht überschreiben können, dann ist es die HasA-Beziehung. Wenn wir sie nicht überschreiben können, wird es keine Vererbung sein. Der Schreiber war also zu 100% korrekt.

2
Noman_ibrahim

Alle öffentlichen und geschützten Member können von jeder Klasse geerbt werden, während die Standard- oder Package-Member auch von der Klasse innerhalb desselben Pakets wie der der Superklasse übernommen werden können. Es hängt nicht davon ab, ob es sich um ein statisches oder ein nicht statisches Mitglied handelt.

Es ist jedoch auch richtig, dass statische Elementfunktionen nicht an der dynamischen Bindung beteiligt sind. Wenn die Signatur dieser statischen Methode sowohl in der übergeordneten als auch in der untergeordneten Klasse identisch ist, gilt das Konzept der Spiegelung, nicht der Polymorphismus.

0
shubham

Statische Methoden in Java werden vererbt, können jedoch nicht überschrieben werden. Wenn Sie dieselbe Methode in einer Unterklasse deklarieren, blenden Sie die Superklassenmethode aus, anstatt sie zu überschreiben. Statische Methoden sind nicht polymorph. Zum Zeitpunkt des Kompilierens wird die statische Methode statisch verknüpft.

Beispiel:

public class Writer {
    public static void write() {
        System.out.println("Writing");
    }
}

public class Author extends Writer {
    public static void write() {
        System.out.println("Writing book");
    }
}

public class Programmer extends Writer {

    public static void write() {
        System.out.println("Writing code");
    }

    public static void main(String[] args) {
        Writer w = new Programmer();
        w.write();

        Writer secondWriter = new Author();
        secondWriter.write();

        Writer thirdWriter = null;
        thirdWriter.write();

        Author firstAuthor = new Author();
        firstAuthor.write();
    }
}

Sie erhalten Folgendes:

Writing
Writing
Writing
Writing book
0
Aleksey Bykov

Die statische Methode wird in der Unterklasse vererbt, ist jedoch kein Polymorphismus. Wenn Sie die Implementierung der statischen Methode schreiben, wird die Klassenmethode des übergeordneten Elements ausgeblendet und nicht überschrieben. Denken Sie, wenn es nicht vererbt wird, wie können Sie ohne classname.staticMethodname(); darauf zugreifen können?

0
user4016405

Sie können statische Methoden überschreiben, aber wenn Sie versuchen, Polymorphismus zu verwenden, arbeiten sie nach Klassenbereich (im Gegensatz zu dem, was wir normalerweise erwarten).

public class A {

    public static void display(){
        System.out.println("in static method of A");
    }
}

public class B extends A {

    void show(){
        display();
    }

     public static void display(){
        System.out.println("in static method of B");
    }

}
public class Test {

    public static void main(String[] args){
        B obj =new B();
        obj.show();

        A a_obj=new B();
        a_obj.display();


    }


}

Im ersten Fall ist o/p die "in statische Methode von B" # erfolgreiche Überschreibung Im zweiten Fall ist o/p "in der statischen Methode von A" # statische Methode - Polymorphismus wird nicht berücksichtigt

0
Manav Garekar

Statische Methoden werden in Java vererbt, nehmen jedoch nicht am Polymorphismus teil. Wenn wir versuchen, die statischen Methoden zu überschreiben, blenden sie die statischen Methoden der Superklasse aus, anstatt sie zu überschreiben. 

0
Praveen Kumar