Die Verwendung von Schlüsselwörtern in abstrakten Klassen und Schnittstellen

Statische Methode: Wenn Sie statische Änderungsmethoden in einer Schnittstelle verwenden möchten, müssen Sie über einen Methodenkörper (nach Java8) verfügen. Abstrakte Methoden abstrakter Klassen können keine statischen Methoden verwenden. Zusammenfassend können Sie in diesem Fall statisch in der Methode verwenden. Denken Sie nur daran, ob auf die Methode über den Klassennamen zugegriffen werden kann.

Statische Variable: Die in der Schnittstelle verwendete statische Variable muss initialisiert werden, da die von der Schnittstelle deklarierte Variable standardmäßig public static final ist. Die statische Variable der abstrakten Klasse kann initialisiert werden, ohne initialisiert zu werden (standardmäßig als Mitgliedsvariable).

abstract  class TestAbstract {
    static int i;
    static abstract void run();//报错,无法使用static
}
interface  TestInterface{
    static int i;//报错,需要初始化
    static void run();//报错,无方法体
}
class TASon extends  TestAbstract{
    public static void main(String[] args) {
        System.out.println(i);//结果为0
    }
}

Native Methode: Abstrakte Methoden können nicht durch native Methoden geändert werden. Native Methoden sind Methoden, die durch nativen Code (Nicht-Java-Code) implementiert werden. Dies bedeutet, dass diese Methoden tatsächlich Methodenkörper haben und abstrakte Methoden noch nicht implementiert wurden, sodass abstrakte Methoden nicht beides sein können Realisiert und nicht realisiert ...

public native int hashCode();//Object中的hashCode方法,虽然没法显式看到方法体,但是native却暗示了方法体的存在
abstract void run();//显然的指明了这个方法无实现体

Synchronisierte Methode: Eine abstrakte Methode kann nicht explizit als synchronisiert deklariert werden. Dies bedeutet jedoch nicht, dass sie nicht synchronisiert verwenden kann (oder dass sie keine Synchronisierung erreichen kann). Wie in der folgenden Methode gezeigt, können Sie die Abstraktion sehen Die Methode kann die Implementierungsmethode ihrer eigenen Unterklasse vollständig synchronisieren (wenn die Synchronisierung auch explizit deklariert werden kann), dies bedeutet jedoch nicht, dass die abstrakte Methode synchronisieren kann. Es ruft tatsächlich "unbekannten" Code in der Sperre auf, was an sich sehr gefährlich ist. Dies ist das Geheimnis des Deadlocks und so weiter. (Mit einem Wort, es ist unsicher? Sie müssen den Schreiber den Methodenkörper sehen lassen, um synchron zu schreiben?)

abstract class TestAbstract {
    public synchronized void m() {
        print();//如果abstract可以显式声明synchronized的话应该就是这种感觉吧
    }

    abstract void print();
    
    synchronized abstract void print2();//报错
}

Erzwingen Sie die Synchronisation abstrakter Methoden in abstrakten Klassen

abstract class TestAbstract {
    public synchronized void m() {
        print();
    }

    public abstract void print();
}

public class TASon extends TestAbstract {

    @Override
    public void print() {
        System.out.print("aaaaaaaaaa");
        System.out.print("bbbbb");
    }

    public void test() {
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    m();
                }
            }
        }.start();
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    m();
                }
            }
        }.start();
    }

    public static void main(String[] args) {
        new TASon().test();
    }
}

Nachdem Sie die m-Methode aufgerufen haben, können Sie versuchen, die Druckmethode erneut aufzurufen, und Sie können feststellen, dass letztere mehr a und weniger b ist (ohne die Ergebnisse des ersten und letzten Teils der Konsole zu beachten, reicht die Vorderseite aus, dass der Puffer nicht ausreicht, und die Rückseite Ist das Ergebnis einer gewaltsamen Unterbrechung des Betriebs)

Ich wollte ursprünglich der Testmethode @ Test-Annotationen hinzufügen. Es gibt zwei Probleme: Zum einen kann der Test nicht gestartet werden, wenn die Klasse nicht öffentlich ist, und zum anderen wird die Ausführung nach einer Weile gestoppt (selbst wenn ich eine Endlosschleife verwende, wird sie nicht behoben).

Ich denke du magst

Origin blog.csdn.net/weixin_44463178/article/details/108785847
Empfohlen
Rangfolge