このコードを実行すると、派生クラスの表示メソッドが呼び出されています
virtual
サブクラス メソッドを使用するには、メソッドを as として指定する必要がある C++ や C# などの他のプログラミング言語でプログラミングしたようです。private
Java では、 、 、final
およびを除くすべてのメソッドstatic
が仮想です。
これを知っていると、クラスはすでにクラスからメソッドをChild
オーバーライドしているため、これを行うと:display
Parent
Parent a1 = new Child();
a1.display();
a1.display
display
は、実際のオブジェクト参照クラス (この場合は )のメソッドを実行しますChild#display
。
コードを修正するa1
には、 の初期化をnew に変更しParent
ます。
Parent a1 = new Parent();
a1.display();
より詳しい情報:
編集後a1
、コンソールで印刷するときに問題に直面するようになりまし9
た。おそらく8
. ここで行っているのは、フィールドを非表示にすることです。フィールドはオーバーライドされないため、変数の値は、i
変数に対して宣言された実際のクラス タイプによって異なります。a1
として宣言したのでParent
、a1.i
は の値を取りますParent#i
。
このコードを修正するa1
には、変数の型をChild
次のように変更します。
Child a1 = new Child();
System.out.println(a1.i);
a1.display();
または、さらに良い解決策:フィールドをオーバーライドしようとしないでください。さらに悪いことに、他のクラスからクラス フィールドに直接アクセスしようとせず、代わりにそれぞれのgetterとsetterを使用してください。
より詳しい情報:
中間の親クラスがそれをオーバーライドするときに祖先クラスのメソッドにアクセスする方法は?
これがあなたの本当の質問だとすれば、答えは簡単です。できません。