連載
» 2008年03月18日 00時00分 公開

基本データ型の型変換を習得するソースコードで学ぶ SJC-P 5.0 ドリル(7)(2/2 ページ)

[山本道子,有限会社 Ray]
前のページへ 1|2       

解答

 A

解説

 3行目では、char型で宣言された変数num1に「a」の値が格納されており、int型で宣言された変数num2には「10」の値が格納されています。char型は、Unicodeで表現できる1文字を表す際に使用されますが、数値として解釈すると符号なし整数(0〜65535)を表します。

 3.     char num1 = 'a';  int num2 = 10;

 4行目では、print()メソッドを呼び出しています。print()メソッドはオーバーロードされていますが、char型の引数を取るメソッドがないため、暗黙変換が適用され7行目のint型の引数を取るprint()メソッドが呼び出されます。

 4.     print(num1);
            : 
 7.   public static void print(int c) {
 8.     System.out.println("int    : " + c);
 9.   }

 5行目もprint()メソッドを呼び出していますが、引数はint型であるため、7行目のprint()メソッドが呼び出されます。

 5.     print(num2); 

 実行結果は、それぞれ「97」と「10」と出力します。「char num1 = 'a'」に対する出力結果が「97」となります。これはint型への暗黙の型変換が行われたことにより、アスキーコードで「a」に割り当てられた「97」が表示されるためです。

int    : 97
int    : 10

【問題】
 次のプログラムをコンパイルし、実行するとどうなりますか?
1つ選択してください。
 1. public class Test{
 2.   public static void main(String[] args) {
 3.     char num1 = 'a';  int num2 = 10;
 4.     print(num1);
 5.     print(num2);
 6.   }
 7.   public static void print(int c) {
 8.     System.out.println("int    : " + c);
 9.   }
10.   public static void print(double d) {
11.     System.out.println("double : " + d);
12.   }
13. }
A. int    : 97
   int    : 10
B. int    : 97
   double : 10.0
C. double : 97.0
   double : 10.0
D. コンパイルエラー
E. 実行時エラー

さらにもう一歩

 暗黙変換やキャストによる明示的な変換は、配列に対しても使用可能です。ただし、基本データ型の配列であっても、配列自体は参照型として扱われるため、参照型の型変換のルールが適用されます。

図4 配列の型変換 図4 配列の型変換

 図4では、int型の配列をjava.lang.Object型の変数へ代入可能です。しかし、double型の配列で宣言された変数には格納することができず、コンパイルエラーとなります。このように、配列に格納している値が基本データ型であっても、配列自体は参照型になるため、配列の型変換は参照型のルールが適用されます。(※参照型の型変換については次回解説します)。

class Sample2 {
  public static void main(String[] args) {
    Object obj = new int[] {10, 20, 30};
    print(obj);
    // *** 以下はコンパイルエラー **
    // double[] obj = new int[] {10, 20, 30};
  }
  public static void print(Object obj) {
    int[] array = (int[])obj;
    for(int num : array) {
      System.out.println(num);
    }
  }
  /*** 以下はコンパイルエラー ** 
  public static void print(double[] obj) {
    int[] array = (int[])obj;
    for(int num : array) {
      System.out.println(num);
    }
  }
  **/
}
サンプルコード2 

C:\sample>java Sample2
10
20
30
C:\sample>
サンプルコード2の実行結果


筆者紹介

山本道子

有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。