解答
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では、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を設立し、システム開発、インストラクタ、執筆などを手掛けている。
Copyright © ITmedia, Inc. All Rights Reserved.