このコードを実行すると、派生クラスの表示メソッドが呼び出されています
virtualサブクラス メソッドを使用するには、メソッドを as として指定する必要がある C++ や C# などの他のプログラミング言語でプログラミングしたようです。privateJava では、 、 、finalおよびを除くすべてのメソッドstaticが仮想です。
これを知っていると、クラスはすでにクラスからメソッドをChildオーバーライドしているため、これを行うと:displayParent
Parent a1 = new Child();
a1.display();
a1.displaydisplayは、実際のオブジェクト参照クラス (この場合は )のメソッドを実行します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を使用してください。
より詳しい情報:
中間の親クラスがそれをオーバーライドするときに祖先クラスのメソッドにアクセスする方法は?
これがあなたの本当の質問だとすれば、答えは簡単です。できません。