A. staticなメソッドからは、staticなメソッドを呼び出せない
これは誤りです。staticメソッドは、同じクラス内の他のstaticメソッドを呼び出すことができます。実際にはこれは非常に一般的な実践です。
B. staticなメソッドからは、staticではないフィールドにアクセスできる
これも誤りです。staticメソッドはクラスレベルで定義されているため、インスタンス(オブジェクト)に属している非staticフィールドには直接アクセスできません。staticメソッドから非staticフィールドにアクセスするには、オブジェクトのインスタンスを明示的に参照する必要があります。
C. staticなメソッドからは、staticではないメソッドを呼び出せる
これは誤りです。staticでないメソッドは特定のインスタンスに属しているため、staticメソッドからはそれらを直接呼び出すことはできません。インスタンスメソッドを呼び出すには、そのクラスのオブジェクトを作成し、そのオブジェクトを通じてメソッドを呼び出す必要があります。
D. staticなメソッドからは、staticなフィールドにアクセスできる
これは正しいです。staticメソッドは、そのクラスのstaticフィールドに直接アクセスすることができます。
E. staticではないメソッドからは、staticなフィールドにアクセスできる
これも正しいです。非static(インスタンス)メソッドは、そのクラスのstaticフィールドにアクセスすることができます。
F. staticではないメソッドからは、staticなメソッドを呼び出せない
これは誤りです。非staticメソッドは、同じクラスのstaticメソッドを問題なく呼び出すことができます。staticメソッドはクラスに属するため、インスタンスに依存しないからです。
追記
もちろん、各選択肢に対するJavaコードの例を示します。
まず、基本となるクラスExampleClassを定義し、それぞれの選択肢に対する説明をコードで表現します。
static int staticField = 10; // staticなフィールド
int instanceField = 20; // staticでないフィールド
// staticなメソッド
static void staticMethod() {
System.out.println(“Inside staticMethod”);
// A. staticなメソッドから、staticなメソッドを呼び出せる
anotherStaticMethod();
// B. staticなメソッドからは、staticでないフィールドにアクセスできない
// System.out.println(instanceField); // コンパイルエラーになる
// C. staticなメソッドからは、staticでないメソッドを呼び出せない
// instanceMethod(); // コンパイルエラーになる
// D. staticなメソッドからは、staticなフィールドにアクセスできる
System.out.println(staticField); // 正しい
}
// 別のstaticなメソッド
static void anotherStaticMethod() {
System.out.println(“Inside anotherStaticMethod”);
}
// staticでないメソッド
void instanceMethod() {
System.out.println(“Inside instanceMethod”);
// E. staticでないメソッドからは、staticなフィールドにアクセスできる
System.out.println(staticField); // 正しい
// F. staticでないメソッドからは、staticなメソッドを呼び出せない
// この設問は間違い。
// staticでないメソッドからは、staticなメソッドを呼び出せる
}
}
このクラスを使って動作を示すメインメソッドを作成します。
public static void main(String[] args) {
ExampleClass.staticMethod(); // staticメソッドの呼び出し
ExampleClass example = new ExampleClass();
example.instanceMethod(); // staticでないメソッドの呼び出し
}
}
このMainクラスを実行すると、ExampleClass内のstaticMethodとinstanceMethodが呼び出され、各メソッド内でのフィールドや他のメソッドへのアクセスが可能かどうかが示されます。staticメソッドからstaticでないフィールドやメソッドにアクセスする部分(BとC)はコメントアウトしてあり、これらをアンコメントするとコンパイルエラーになることがわかります。これはstaticコンテキストから非staticコンテキストへの直接アクセスができないことを示しています。