私は過去 2 日間でポリモーフィズムを学びました。これには当然メソッドの書き換えが含まれます。作者がコードをいじる過程で、エラーの種類に「この静的メソッドは Fu からインスタンス メソッドを隠すことができません」と記載されていることがわかり(下図)、上書き(書き換え)以外にも、も隠れています さまざまな情報を検索した後、最終的により詳細な記事を見つけ、私の疑問の多くが解決されました。転送して、後で戻って読みたくなるかもしれません。
1. コンパイル時型と実行時型
Java参照変数にはコンパイル時型と実行時型の2つの型があります
type: 宣言された型 変数が使用されるときに使用される型が実行時の型を決定します
: 変数が指すオブジェクトの型によって決定されます
コンパイル時の型と実行時の型が一致しない場合、いわゆるポリモーフィズムが発生します。サブクラスは実際には特別な親クラスであるため、Java では、型変換を行わずに、サブクラス オブジェクトを親クラス参照変数に直接割り当てることができます。これは、システムによって自動的に完了する上方変換と呼ばれます。 例えば、Father f = new Son(); Son は Father のサブクラスです 変数 f を参照すると、コンパイル時の型と実行時の型が不一致になります。コンパイル時の型は Father です。型であり、実行時の型は Son 型ですWhen 変数のコンパイル時の型と実行時の型が一致しない場合、変数が参照するオブジェクトのインスタンスが変数を通じてアクセスされると、インスタンス変数は、変数が宣言されている型によって決まります。 変数を介して参照されるオブジェクトのメソッドにアクセスする場合、メソッドの動作は参照されるオブジェクトの実際の型によって決まります。2. 非表示とカバー
上書き: サブクラスは親クラスのメソッドをオーバーライドします。メソッド名とパラメーターの型が完全に同じである必要があり (パラメーターをサブクラスにすることはできません)、戻り値と例外は親クラスの例外と同じか小さいか (つまり、親クラスのサブクラスです)、アクセス修飾子は親クラスより大きいか同じです。
上書きはインスタンスメソッドですメソッドをクロスカバーすることはできません: サブクラスのインスタンスメソッドは親クラスの静的メソッドをオーバーライドできません。)
Hide
: 親クラスとサブクラスが同じ属性またはメソッドを持つ場合名前 (メソッド隠蔽の形式は 1 つだけです。つまり、親クラスとサブクラスが同じ静的メソッドを持つということです)、同じ名前を持つ親クラスの属性またはメソッド形式は消えていますが、実際にはまだ存在します。非表示は静的メソッドとメンバー変数(静的変数とインスタンス変数)用です
(1)非表示が発生すると、宣言された型がどのクラスであるか、動的バインディングの代わりに、対応するクラスの属性またはメソッドが呼び出されます。
(2) プロパティは非表示のみ可能で、上書きはできません
(3) 変数は相互非表示にできます: サブクラスのインスタンス変数/静的変数は、親クラスのインスタンス/静的変数を非表示にできます3.非表示と上書き
(1) 隠し属性の場合、サブクラスが親クラスに強制変換された後、親クラスの属性にアクセスします
強制変換がない場合、サブクラスは親クラスの属性にアクセスする必要があります。親クラス スーパー キーワードを使用します (2) オーバーライドされたメソッド、サブクラスが親クラスに強制的に変換された後も、サブクラス自体のメソッドは引き続き呼び出されます サブクラスが親クラスのメソッドにアクセスしたい場合、スーパーキーワードを使用できます関連記事:Javaでequalsをオーバーライドするより深い方法の概要
以上がJava における非表示とオーバーライドの概要とそれらの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。