Java SE8 Bronze取得のため勉強しているのですが、解説書の抽象クラスについて突入したところで インスタンス(およびインスタンス化) が、どういうものなのか分からなくなりました。
まずは以下コードをご覧ください。
Java
1abstract class Sub1 { 2 void put1() { 3 System.out.println("Sub1"); 4 } 5} 6class Sub2 extends Sub1 { 7 void put2() { 8 System.out.println("Sub2"); 9 } 10} 11class Main { 12 public static void main(String[] args) { 13 Sub2 instance = new Sub2(); 14 instance.put1(); 15 instance.put2(); 16 } 17}
このコードが動作するということは分かります。Sub1を継承したSub2があり、MainにおいてSub2のアドレスを参照する変数instanceを宣言。instanceからput1()とput2()を呼び出しています。そう、これは分かるんです。問題は次の2つです。
Java
1abstract class Sub1 { 2 void put1() { 3 System.out.println("Sub1"); 4 } 5} 6class Sub2 extends Sub1 { 7 void put2() { 8 System.out.println("Sub2"); 9 } 10} 11class Main { 12 public static void main(String[] args) { 13 Sub1 instance = new Sub2(); 14 instance.put1(); //何故か正常に動作する 15 } 16}
Java
1abstract class Sub1 { 2 void put1() { 3 System.out.println("Sub1"); 4 } 5} 6class Sub2 extends Sub1 { 7 void put2() { 8 System.out.println("Sub2"); 9 } 10} 11class Main { 12 public static void main(String[] args) { 13 Sub1 instance = new Sub2(); 14 instance.put2(); //何故かコンパイルエラー 15 } 16}
この2つの処理がどうして正常終了とコンパイルエラーという異なる結果になるのかが、さっぱり分かりません。これが両者コンパイルしたとき「Sub1型の変数にSub2のインスタンスは突っ込めません」というエラーが共通で出たならば「Sub1とSub2で型が違うんだから、そりゃそうだよね~」と納得できるのですが、どうして型が違うのにインスタンス化できて、そのうえで呼び出すメソッドの違いで正常終了とコンパイルエラーという異なる結果になるのでしょうか。
長くなりましたが、ご回答のほど、よろしくお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/09 07:37