連載
» 2008年01月15日 00時00分 公開

ソースコードで学ぶ SJC-P 5.0 ドリル(2):Java SE 5.0の新機能、staticインポートを習得する (2/2)

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

正解

 E

解説

 staticインポートの構文は以下のとおりです。importとstaticを逆にするとコンパイルエラーとなります。

import static パッケージ名.クラス名.static変数名;
import static パッケージ名.クラス名.staticメソッド名;
import static パッケージ名.クラス名.*;

 選択肢B、D、Fは、importとstaticが逆に記述されているので、すべてコンパイルエラーです。選択肢Aは、パッケージ名しか記述していないのでコンパイルエラーです。選択肢Cは、パッケージ名およびクラス名は記載されていますが、staticメンバを記載していないのでコンパイルエラーです。

【問題】
 
 次のソースコードがあります。
 1.package com.it;
 2.public class Calc {
 3.  public static int sum(int x, int y) {
 4.    return x + y;
 5.  }
 6.}
 また別のファイルとして次のソースコードがあります。
 1.[     (1)     ]
 2.class Test {
 3.  public static void main(String[] args) {
 4.    System.out.println(sum(10,10));
 5.  }
 6.}
 Testクラスを正しくコンパイル、実行し、実行結果として20を出力する
ために、空欄?に入るソースコードはどれですか? 1つ選択してください。
A.import static com.it.*;
B.static import com.it.*;
C.import static com.it.Calc;
D.static import com.it.Calc;
E.import static com.it.Calc.sum;
F.static import com.it.Calc.sum;

さらにもう一歩

 staticインポートでは、あるクラスのstaticメンバをすべてインポートするために*(ワイルドカード)を使用することも可能です(ソースコード3-2)。

package com.it.sjcp;
public class StaticTest2 {
  public static int VAL = 1000; // static 変数
  public static void method() { // static メソッド名
    System.out.println("Hello SJCP");
  }
}
ソースコード3-1 staticメンバを提供しているクラス
import static com.it.sjcp.StaticTest2.*; // ワイルドカードの使用
class Sample2 {
  public static void main(String[] args) {
    System.out.println(VAL);
    method(); // メソッド、変数ともに利用可能
  }
}
ソースコード3-2 staticメンバを利用しているクラス


 しかし、ワイルドカードを使用し、複数のクラスのstaticメンバをstaticインポートする場合、修飾部分を除いて同じ名前のものがあるとコンパイルエラーとなります。

 例えば、ソースコード4-2にあるように、java.langパッケージに属するMathクラスにはPIというstatic定数があります。また独自に作成したクラスでPIというstatic定数を用意します。これらのstaticメンバを使用するクラス(Sample3クラス)でワイルドカードを使用してstaticインポートを行っていますが、コンパイルエラーとなります。

package com.it.sjcp;
public class StaticTest3 {
  public static final double PI = 300.0;
……
}
ソースコード4-1 com.it.sjcp.StaticTest3クラス
package java.lang;
public final class Math {
  public static final double PI = 3.14159265358979323846;
……
}
ソースコード4-2 java.lang.Mathクラス
import static com.it.sjcp.StaticTest3.*;
import static java.lang.Math.*;
class Sample3 {
  public static void main(String[] args) {
    // StaticTest3クラスとMathクラスの両方にPI変数がある
    System.out.println(PI); 
  }
}
ソースコード4-3 staticメンバを利用しているクラス
                             ↓コンパイルエラー
C:\Sample>javac Sample.java
Sample.java:6: PI の参照はあいまいです。com.it.sj
cp.StaticTest3 の 変数 PI と java.lang.Math の 変
数 PI が両方適合します。
	System.out.println(PI);
			              ^
エラー 1 個
C:\Sample>
ソースコード4-3の実行結果 どちらのクラスのPIを使用するか判断できずコンパイルエラー

 もし、Sample3クラス(ソースコード4-3)でMathクラスのPIを使用したいのであれば、Sample3クラスの1〜2行目を以下(ソースコード5)のように修正します。

import static com.it.sjcp.StaticTest3.*;
import static java.lang.Math.PI;
ソースコード5


筆者紹介

山本道子

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



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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