1

私は SCJP を勉強しています。勉強中に、最初は非常に簡単に思える問題を見つけましたが、解決できず、答えがわかりません。演習 ( OCP Java SE 6 Programmer Practice Exams、Bert Bates および Kathy Sierra から取得) には、次のように記載されています。

与えられた:

import java.util.*;
public class MyPancake implements Pancake {
  public static void main(String[] args) {
    List<String> x = new ArrayList<String>();
    x.add("3");x.add("7");x.add("5");
    List<String> y = new MyPancake().doStuff(x);
    y.add("1");
    System.out.println(x);
  }

  List<String> doStuff(List<String> z) {
    z.add("9");
    return z;
  }
}

interface Pancake {
  List<String> doStuff(List<String> s);
}


What is the most likely result?

A. [3, 7, 5]

B. [3, 7, 5, 9]

C. [3, 7, 5, 9, 1]

D. Compilation fails.

E. An exception is thrown at runtime

答えは次のとおりです。

D is correct. MyPancake.doStuff() must be marked public. If it is, then C would be
correct.

A, B, C, and E are incorrect based on the above.

doStuff メソッドはクラス MyPancake 内にあるため、main メソッドはそれにアクセスする必要があるため、私の推測では C でした。

質問を再考すると、静的コンテキストから new を呼び出すときに、doStuff が非公開の場合、非公開メソッドにアクセスできない可能性があります。これは本当ですか?これはよくわかりません。

とにかく、パッケージプライベートの doStuff メソッドにアクセスできると思います。私は間違っていると思いますが、理由はわかりません。

私たちを手伝ってくれますか?

ありがとうございました!

4

3 に答える 3

4

コンパイルに失敗する理由について答えが得られないのは非常に悲しいことですが、幸いなことに、コンパイラがあれば、自分で調べることができます。

Test.java:11: error: doStuff(List<String>) in MyPancake cannot implement doStuff
(List<String>) in Pancake
  List<String> doStuff(List<String> z) {
               ^
  attempting to assign weaker access privileges; was public
2 errors

基本的に、インターフェイス メンバーは常にパブリックであるため、パブリック メソッドを使用してインターフェイスを実装する必要があります。メソッドの呼び出しの問題ではなく、インターフェイスの実装の問題です。「実装」部分を外せば問題なく動作します。

Java言語仕様のセクション9.1.5から:

すべてのインターフェイス メンバーは暗黙的にパブリックです。§6.6 の規則に従って、インターフェイスが public または protected と宣言されている場合、インターフェイスが宣言されているパッケージの外部からアクセスできます。

于 2011-11-15T23:52:43.380 に答える
2

Pancake インターフェイスを実装する場合。

クラス MyPancake でメソッド doStuff() の実装を提供しています

MyPancake クラスでメソッド doStuff() の実装を提供する場合は、インターフェイス内のすべてのメンバー変数とメソッドがデフォルトで public であるため、それを public として定義する必要もあります。

したがって、アクセス修飾子を指定しないと、可視性が低下します。

于 2011-11-15T23:54:04.697 に答える
2

メソッドを定義するとき

List<String> doStuff(List<String> s);

Pancake インターフェースで、実際に言っていることは次のとおりです。

public List<String> doStuff(List<String> s);

インターフェイス内のすべてのメソッドは、明示的にそのようにマークしなくても、常にパブリックであるためです。

現在、クラス MyPancake には doStuff(List s) メソッドに割り当てられたデフォルトのアクセス権があり、そのためインターフェースに従わず、コードはコンパイルされません。

于 2011-11-15T23:54:14.213 に答える