質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

2回答

2320閲覧

Javaのインスタンス化と変数のデータ型の関係

AGadget

総合スコア60

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2019/08/09 07:07

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で型が違うんだから、そりゃそうだよね~」と納得できるのですが、どうして型が違うのにインスタンス化できて、そのうえで呼び出すメソッドの違いで正常終了とコンパイルエラーという異なる結果になるのでしょうか。

長くなりましたが、ご回答のほど、よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

どうして型が違うのにインスタンス化できて

(「どうして型が違うのに代入できるのか」ですよね)

Sub2 extends Sub1と書くと、Sub2型のインスタンスはSub1型として扱えます。
なのでSub2型のインスタンスをSub1型の変数に代入できます。

呼び出すメソッドの違いで正常終了とコンパイルエラーという異なる結果に

Sub1型の変数として宣言したので、Sub1型に定義されていない操作は出来ません。

投稿2019/08/09 07:19

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2019/08/09 07:37

ご回答ありがとうございます! Sub2型をSub1型として「も」扱えるということですね。 この分野の理解が足りていないので勉強を続けたいと思います。
guest

0

ベストアンサー

これが両者コンパイルしたとき「Sub1型の変数にSub2のインスタンスは突っ込めません」というエラーが共通で出たならば「Sub1とSub2で型が違うんだから、そりゃそうだよね~」と納得できるのですが、

まず、ここの認識を正しましょう。クラス継承は、is-a関係とも呼ばれるように、子クラスは親クラスの特殊なバリエーションなのです。つまり、子クラスは親クラスとして扱える、ということになります。

呼び出すメソッドの違いで正常終了とコンパイルエラーという異なる結果になるのでしょうか。

Sub1型の変数に入れてある以上、呼び出せるメソッドはSub1から生えているものに限られます。put2Sub2にしかないので、コンパイルエラーとなります。

投稿2019/08/09 07:12

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2019/08/09 07:36

ご回答ありがとうございます! なるほど……もう少し、子クラスと親クラスの関係について勉強を進めてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問