質問編集履歴

2 修正

k499778

k499778 score 521

2015/09/27 02:17  投稿

[Java] ダウンキャストの仕組みについて
現在Java Silverの資格を取るために黒本を勉強しています。
そこでダウンキャストの理解についてつまづいてしまいました。
以下のコードは実行時に例外がスローされ、ClassCastExceptionが発生します。
そうなるのはわかったのですが、なぜそうなるかがわかりません。
```java
public class aa{
   public static void main(String[] args){
   cc c=new cc(){};
   bb b= (bb)c;
   }
}
class bb extends cc{
}
class cc{
   void b(){
       System.out.println("ccクラスです。");
   }
}
```
黒本 p277にはbbインスタンスにはccインスタンスの差分が含まれていないため、例外が発生する。
といったようなことが書いています。
**そうすると以下は差分がないため、例外が発生しないような気がするのです。**
**もしくはデフォルトコンストラクタがその差分に当たるのでしょうか?**
**もしそうなら継承の関係においてダウンキャスト時に例外がスローされないケースはあるのでしょうか?**
**そもそも私の黒本の解説の解釈に少し誤りがあるのでしょうか?**
いまいちスッキリ理解できていないのでもし分かる方がいれば教えていただきたいです。
実際の試験時は「継承のダウンキャストは実行時に例外が発生する」ととりあえず解答しようと思いますが、このままだと腑に落ちないし、もしそうでないときもあるのならと思い、しっかり理解したいと思いました。
実際の試験時は「継承のダウンキャストは実行時に例外が発生する」ととりあえず解答しようと思いますが、このままだと腑に落ちないし、もしそうでないときもあるのならと思い、しっかり理解したいと思いました。
追記
```java
class A{
   void hello(){
       System.out.println("A");
   }
}
class B extends A{
   void hello(){
       System.out.println("B");
   }
}
public class Main{
   public static void main(String[] args){
   A a=new A();
   B b= (B)a;
   b.hello();
   }
}
```
  • Java

    17967 questions

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

1 修正

k499778

k499778 score 521

2015/09/26 18:06  投稿

[Java] ダウンキャストの仕組みについて
現在Java Silverの資格を取るために黒本を勉強しています。
そこでダウンキャストの理解についてつまづいてしまいました。
以下のコードは実行時に例外がスローされ、ClassCastExceptionが発生します。
そうなるのはわかったのですが、なぜそうなるかがわかりません。
 
黒本 p277にはbbインスタンスにはccインスタンスの差分が含まれていないため、例外が発生する。  
といったようなことが書いています。  
 
**そうすると以下は差分がないため、例外が発生しないような気がするのです。**  
**もしくはデフォルトコンストラクタがその差分に当たるのでしょうか?**  
 
**もしそうなら継承の関係においてダウンキャスト時に例外がスローされないケースはあるのでしょうか?**  
 
**そもそも私の黒本の解説の解釈に少し誤りがあるのでしょうか?**  
 
いまいちスッキリ理解できていないのでもし分かる方がいれば教えていただきたいです。  
 
実際の試験時は「継承のダウンキャストは実行時に例外が発生する」ととりあえず解答しようと思いますが、このままだと腑に落ちないし、もしそうでないときもあるのならと思い、しっかり理解したいと思いました。  
```java
public class aa{
   public static void main(String[] args){
   cc c=new cc(){};
   bb b= (bb)c;
   }
}
class bb extends cc{
}
class cc{
   void b(){
       System.out.println("ccクラスです。");
   }
}
```
```
黒本 p277にはbbインスタンスにはccインスタンスの差分が含まれていないため、例外が発生する。
といったようなことが書いています。
**そうすると以下は差分がないため、例外が発生しないような気がするのです。**
**もしくはデフォルトコンストラクタがその差分に当たるのでしょうか?**
**もしそうなら継承の関係においてダウンキャスト時に例外がスローされないケースはあるのでしょうか?**
**そもそも私の黒本の解説の解釈に少し誤りがあるのでしょうか?**
いまいちスッキリ理解できていないのでもし分かる方がいれば教えていただきたいです。
実際の試験時は「継承のダウンキャストは実行時に例外が発生する」ととりあえず解答しようと思いますが、このままだと腑に落ちないし、もしそうでないときもあるのならと思い、しっかり理解したいと思いました。
  • Java

    17967 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る