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

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

ただいまの
回答率

89.99%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,231

k_mail

score 77

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」がコンソールに表示できるのではと思いました。

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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/21 11:17

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

    キャンセル

  • 2016/02/21 11:21

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

    キャンセル

  • 2016/02/21 11:36

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

4         B b = (B) a; 

この部分を、

B b = a;

と書くと当然

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


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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る