抽象的な方法はstaticやnativeやsynchronizの原因や誤解ではない.


抽象的な方法がstaticやnativeやsynchronizではない理由について、ネット上で見たことがある.これらのキーワードの意味とabstractキーワードとの競合について説明します.
1、abstractは抽象的で、方法は宣言だけで実現されず、彼の実現はそのクラスを宣言するサブクラスに入れて実現することを指す.
2、staticは静的で、クラスに属してオブジェクトに属しない方法や属性であるが、クラスもオブジェクトであり、classファイルが仮想マシンにロードされた後に発生するオブジェクトであり、通常は単一の例であることが知られている.仮想マシン全体にこのようなクラスオブジェクトが1つしかありません(もちろん、新しいクラスローダでも新しいクラスのオブジェクトが生成されます).
3、synchronizedは同期であり、相対スレッドのロックである.
4、nativeローカルメソッド、このメソッドは抽象メソッドと類似しており、メソッド宣言のみであり、実装方法はないが、抽象メソッドとは異なり、仮想マシンを介さずに特定の実装をローカルシステムの関数ライブラリに移行し、javaが他の言語と通信するメカニズムと言える.
次に著者らは、競合の原因を1つずつ分析した.
まずabstractとstaticは、実際には彼らの役割と属性を見ると分かりやすく、abstractは実現していないが、staticは必ず実現しなければならない.abstractのクラスはオブジェクトを生産できないが、staticはクラスに属しているが、クラスはすでに存在する対象であり、この2つのキーワードにはこの上に重要な矛盾点があるからだ.
synchronizedは同期ですが、同期には具体的な操作が必要です.abstractのようにメソッド宣言だけでは、同期に何かが問題になります.もちろん、抽象的な方法は布団クラスが継承された後、同期を追加することができます.
native、これ自体がabstractと衝突しています.彼らはメソッドの宣言で、サブクラスへの移行を実現する方法と、ローカルオペレーティングシステムへの移行を実現する方法です.同時に現れると、実装をサブクラスに移行し、実装をローカルオペレーティングシステムに移行することに相当するが、いったい誰が具体的な方法を実現するのだろうか.
著者らはsynchronizedとnativeキーワードの衝突の原因を分析する筆者に異議はなく,static衝突の原因が鍵である.
3段目の赤い文字が表示されている部分では、著者は「クラスもオブジェクトである」と述べ、JVMクラスのロードメカニズムを少し知っている人であれば、これは問題ありません.後の原因部分では,著者らは「abstractのクラスはオブジェクトを生成できないが,staticはクラスに属し,クラスはすでに存在するオブジェクトである」と述べ,これにも異議はない.キーは後で、著者は「この2つのキーワードがこのキーで矛盾している」と述べた.この言葉に対して、著者はクラスオブジェクトとインスタンスオブジェクトの概念を混同した.
抽象クラスかどうかにかかわらず、このクラスを使用すると、仮想マシンは常にメソッド領域にクラスのランタイム構造を記述するためにクラスのClassオブジェクトを作成します.コードを書いて簡単なテストをします.以下のようにします.
public class MonitorVehicleTracker {
	public static void main(String[] args){
		System.out.print(Door.class.getClassLoader());	
	}
}
abstract class Door{
	public static  void set() {
		System.out.print("123");
	}
}

実行結果:
        sun.misc.Launcher$AppClassLoader@15253d5
抽象クラスDoorは確かにロードされている(Classオブジェクトにアクセスできるため)、アプリケーションクラスローダによってロードされていることがわかります.
すなわち、「abstractクラスはオブジェクトを生成できない」という意味は、abstractクラスがメソッド領域に対応するClassオブジェクトを持つことを意味するが、このClassオブジェクトはインスタンスオブジェクトを生成できない.したがって、著者らはこの点でabstractとstaticの矛盾を分析することは正しくない.
では、abstractとstaticが同時に使用できない理由は一体何なのでしょうか.
抽象的な方法の存在の意味は布団類が覆われ,多態性を実現することであることが知られている.静的メソッドはメモリに1部しかないので、サブクラスは継承できますが、書き換えはできません.参照アクセスオブジェクトのフィールドまたは静的メソッドを使用する場合、参照タイプ(type)は、現在の参照が実際にどのクラスを表しているかではなく、実際にどのフィールドにアクセスしているかを決定します.サブクラスの静的メソッドは、マルチステートを完全に体現しません.したがって、メソッドが抽出され、静的であれば、抽象クラス、抽象メソッド自体の意味を覆します.
子クラスが親クラスを上書きできない静的メソッドについては、参照タイプによってどのクラスにアクセスする静的メソッドが決定されます.テストコードは次のとおりです.
public class MonitorVehicleTracker {
	public static void main(String[] args){
		Door door = new AlarmDoor();
		door.get();
	}
}
abstract class Door{
	public static  void get() {
		System.out.print("Door");
	}
}
class AlarmDoor extends Door{
	public static void get(){
		System.out.print("AlarmDoor");
	}
}
運行結果は自明ではなく、興味のある人は自分でテストすることができます.