正解
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.