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