質問: new ManagerOv2(); System.out.println("--------スーパークラス--------"); System.out.println("名前:" + m2.getName()); System.out.println(); System.out.println("--------サブクラス--------"); System.out.println("名前:" + m2.getName()); System.out.println("給与:" + m2.getSalary()); } } ``` --------スーパークラス-------- 名前: 名無し --------サブクラス-------- 名前:【マネージャー】名無し 給与:5000000 上記のように表示させたいのですが、このコードを実行すると、 --------スーパークラス-------- 名前:【マネージャー】名無し --------サブクラス-------- 名前:【マネージャー】名無し 給与:5000000 のように表示されてしまいます。 また、一番下のコードを ``` System.out.println("給与:" + ((ManagerOv2) m2).getSalary()); ``` 上記のようにサブクラスにキャストして表示していたのですが、この書き方はプログラミング的にどうなのか疑問に感じております。 インスタンス化についてよく分かっていない部分もあるのですが、どうすれば正しく表示されるのでしょうか?
回答: ご質問された話は、「インスタンスに関して」**というよりは「継承とオーバーライドに関して」**というお題かと思います。 参考になるリンク: superクラスのメソッドの呼び出し 上記のリンクにあるとおり、(サブクラスの**外部**から)、オーバーライドされたメソッドを呼び出すことはできません。もちろん、オーバーライドされていないメソッドであれば呼び出せます。また、サブのクラスの**メソッド内からであれば**呼び出すことは可能です。 よって、次のように表示されてしまいます。というかそうしたいがための継承、オーバーラードだったりします。 --------スーパークラス-------- 名前:【マネージャー】名無し つまり、継承とメソッドのオーバーライドでなにをするかというと、スーパークラスの処理にサブクラスで**処理を追加したり**、**まるごと処理を変えてしまったり**します。 で、代わりに参考になるそれらしいサンプルコードを書いてみました。 ``` ManagerOv manager = new ManagerOv(); System.out.println("--------サブクラス--------"); System.out.println("名前:" + manager.getName()); // サブクラスでオーバーライドした内容が表示されます System.out.println("給与:" + manager.getSalary()); // スーパークラスのメソッドを呼び出します StaffOv staff = manager; // staffはStaffOvだけど、実際の中身(インスタンス)は、ManagerOv System.out.println("--------スーパークラス--------"); System.out.println("名前:" + staff.getName()); // インスタンスがManagerOvなので、そのクラスでオーバーライドしたメソッドでの内容が表示されます System.out.println("給与:" + staff.getSalary()); // メソッドを呼び出します ``` ###### 結局、インスタンスや継承、オーバーライドというのは? その他いろいろ書こうとしたのですが、私が教えるのに不慣れでややこしくなりそうだったのでやめました。 次のキーワードで、平易な解説記事を探してみてください * Java インスタンス * Java 継承 * Java オーバーライド