前提・実現したいこと
Java Silverの試験の勉強をしています。
実務経験は一切ありません。
日本サード・パーティ株式会社作成の問題集をやって、学習していますが、調べてもわからないことが出てきたので、
こちらに質問させていただきます。
実現したいことは、私の認識があっているかを確認することです。
問題文とその回答
問題文:このコードをコンパイル、および実行すると、どのような結果になりますか。一つ選択してください。
A. N67-10
B. Gold
C. SnackPine
D. null
答えはDのようです。 私はCだと思いました。
該当のソースコード
Java
1class Fruits{ 2 protected String name; 3 protected static Fruits fruits; 4 Fruits(){ 5 fruits = this; 6 } 7 protected String getName(){ 8 return fruits.name; 9 } 10} 11class Painapple extends Fruits { 12 protected String name; 13 Painapple(String name){ 14 super.name = name; 15 } 16 protected String getName(){ 17 return this.name; 18 } 19} 20class Test extends Fruits{ 21 public static void main(String args[]){ 22 Fruits fruits = new Painapple("N67-10"); 23 fruits.name = "Gold"; 24 fruits.fruits.name = "SnackPine"; 25 System.out.println(fruits.getName()); 26 } 27} 28
私の理解
この場合、変数fruitsの型はFruitsでインスタンスはPainapple型で作成しているため、
ポリモーフィズムが関わる問題だと認識しております。
なので、 fruits.name = "Gold";でGoldが代入されるのはclass Painapple extends Fruitsにて定義したnameだと思いました。
fruits.fruits.name = "SnackPine";についても同様で、
ポリモーフィズムの考え方からサブクラスであるPainappleクラスのname変数に代入されると思いました。
ただ、問題集の解説文だと、Fruitsクラスのname変数に代入しているとのことです。
なので、解説文によるとPainappleクラスのname変数には何も入らずに、結果的にNullが表示されるとのことです。
私のポリモーフィズムの理解は、
継承するクラスにおいて同じ名前で同じ修飾子がついてる場合、
スーパークラスにおいて定義されたメソッドや変数は呼び出されず、
基本的に継承したクラスにおいて定義したメソッドや変数が呼び出される。
仮にスーパークラスでの定義したものを呼び出したければsuper.(メソッド名、変数名)が必要だということです。
すみません、初めての投稿でして、いろいろとルールに則っていない部分もあるかもしれませんが、ご容赦ください。
以上よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/24 03:36