抽象クラスおよびインターフェースでのキーワードの使用

静的メソッド:インターフェイスで静的変更メソッドを使用する場合は、メソッド本体(java8の後)が必要です。抽象クラスの抽象メソッドは静的を使用できません。要約すると、この場合、メソッドでstaticを使用できますか?クラス名を介してメソッドにアクセスできるかどうかを考えてみてください。

静的変数:インターフェイスで宣言された変数はデフォルトでpublic static finalであるため、インターフェイスで使用される静的変数を初期化する必要があります。抽象クラスの静的変数は、初期化せずに初期化できます(デフォルトではメンバー変数として)

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

ネイティブメソッド:抽象メソッドはネイティブメソッドで変更できません。ネイティブメソッドはネイティブコード(非Javaコード)によって実装されるメソッドです。つまり、これらのメソッドには実際にメソッド本体があり、抽象メソッドはまだ実装されていないため、抽象メソッドを両方にすることはできません。実現し、実現していません...

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

同期メソッド:抽象メソッドを明示的に同期として宣言することはできませんが、これは同期を使用できないことを意味するわけではありません(または、同期を実現できないことを意味するわけではありません)。次のメソッドに示すように、抽象化を確認できます。このメソッドは、それ自体のサブクラスの実装メソッドを完全に同期できます(同期を明示的に宣言できる場合)が、これは、抽象メソッドが同期できる必要があるという意味ではありません。実際には、ロック内の「不明な」コードを呼び出しますが、これはそれ自体が非常に危険です。これがデッドロックなどの秘密です(つまり、安全ではありませんか?同期して書き込むには、ライターにメソッド本体を表示させる必要がありますか?)

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

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

抽象クラスの抽象メソッドの同期を強制します

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

mメソッドを呼び出した後、printメソッドを再度呼び出すと、後者の方がaとbが少ないことがわかります(コンソールの最初と最後の部分の結果を無視すると、前面はバッファーが不足しており、背面は強制停止した結果です)

もともと@Testアノテーションをテストメソッドに追加したかったのですが、2つの問題があります。1つはクラスが公開されていないとテストを開始できないこと、もう1つはしばらくすると実行が停止することです(無限ループを使用しても解決されません)。

おすすめ

転載: blog.csdn.net/weixin_44463178/article/details/108785847