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

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

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

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

Q&A

解決済

3回答

2126閲覧

キャストの理解があいまいです。

k_mail

総合スコア90

Java

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

0グッド

0クリップ

投稿2016/02/21 01:41

Java SE7 Silver の資格を目指し勉強中です。
分からない点は
・もしクラスBをインスタンス化していた場合は実行できるのか(例外が発生しないのか)
です。

1 class A{
2 void hellow(){
3 System.out.println("A");
4 }
5 }

1 class B extends A{
2 void hello(){
3 System.out.println("B");
4 }
5 }


これらのクラスを利用する以下のプログラムを実行したときの結果は?

1 public class Main{
2 public static void main(String[] args){
3 A a = new A();
4 B b = (B) a;
5 b.hello();
6 }
7 }

回答は「実行時に例外がスローされる」です。

これは、クラスBがstaticクラスではなく、インスタンスクラスであり、クラスBをインスタンス化していない場合は、スローされるのでしょうか。

もし、クラスBを事前にインスタンス化していたら、4行目でキャストをしているので、
「B」がコンソールに表示できるのではと思いました。

見当違いな質問で分かりにくいかもしれませんが、返信を頂けたら嬉しいです。

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

4 B b = (B) a;

この部分を、

Java

1 B b = a;

と書くと当然

bash

1$ javac Sample.java 2Sample.java:18: エラー: 不適合な型: AをBに変換できません: 3 B b = a; 4 ^ 5エラー1個 6make: *** [Sample.class] エラー 1 7make: ターゲット `run' はエラーにより再 make できませんでした. 8

といったエラーになりますよね。
このエラーはキャストでは解決されません。
単に、エラーの露見が実行時に先延ばしされるだけです。

Java のキャストというのは、

「エラーを解決する」機能ではありません。
「型(のインスタンスの内容)を変換する」機能でもありません(プリミティブ型に関しては変換する場合もあります)

「別の型に見えるかもしれないけれど、本当はこの型だからここは見逃してね」
ということをコンパイラに伝えるだけの機能です。
それが嘘ならばどこかで問題が生じます。

投稿2016/02/21 03:46

編集2016/02/21 03:51
kozuchi

総合スコア1193

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

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

0

変数aは"new A()"でオブジェクトの生成しました。なので正真正銘のAクラスのオブジェクトです。BはAのサブクラスですから、変数aはBへのキャストはできないので"ClassCastException"の例外が発生します。だと思います・・・

投稿2016/02/21 02:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

aはAクラスのインスタンスであり、Bクラスの情報を持っていません。そのため、Bクラスのインスタンスとして扱うことが出来ないので、実行時例外になります。

投稿2016/02/21 02:07

swordone

総合スコア20651

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

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

k_mail

2016/02/21 02:17

うまく質問できないのですが、 ポリモーフィズムの考え方で、「インスタンスがどのようなメソッドやフィールドを持っていたとしても『型』で定義されているもの以外は使えない」とありました。 なので、4行目でBの型で扱うとしているので、インスタンスよりも型を優先するのではと思いました。
swordone

2016/02/21 02:21

4行目でBの型で扱おうとしていますが、そもそもその扱おうとしている対象がAクラスのインスタンスであり、Bのクラスが持つべき情報を持っていません(正確に言うなら持っていることが保証されていない)。Bとして扱おうにも、Bの持つ何かが欠けている状態で扱うことは不可能なのです。
k_mail

2016/02/21 02:36

おそらく、理解できたと思います。 ただ、不安もあるので、また、似たような問題がないか調べてみます。 いつもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問