2011-11-15 8 views
1

私はSCJPを勉強していますが、勉強している間、最初はとても簡単だったようですが、解決できませんでした。コンストラクタをコールした後にmainからプライベートパッケージメソッドを呼び出す

を考える:(OCPのJava SE 6プログラマー実践試験、バート・ベイツとキャシーシエラから取られた)運動は、次のように述べてい

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. 

私の推測はCでした。なぜなら、doStuffメソッドはMyPancakeクラスの中にあるから、メインメソッドはそれにアクセスできるはずです。

静的コンテキストからnewを呼び出すとき、doStuffがプライベートであった場合、プライベートメソッドにアクセスできないことがあります。これは本当ですか?私はこれについては分かりません。

しかし、とにかく、私はまだそれがpackage-private doStuffメソッドにアクセスできると思います。 私は間違っていると思うが、私は理由を知らない。

お手伝いできますか?

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

答えて

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 

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

section 9.1.5 of the Java Language Specificationから:

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

+0

ありがとうございます!私はメモを見直すことに集中していましたが、私はそれをコンパイルしようとはしませんでした。インターフェイスのメンバーは常に公開されていることを覚えておく必要があります。 – pablof

2

あなたがPancakeインターフェイスを実装するとき。あなたはまた、パブリックとしてそれを定義する必要があり、あなたのMyPancakeクラスのメソッドdoStuff()の実装を提供する場合

あなたは、あなたのクラスMyPancake

方法doStuff()の実装を提供しているすべてのメンバ変数理由インタフェース内のメソッドは、デフォルトで公開されます。

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

+0

ありがとうございます。私は問題が以前の可視性にあることに気がつきました。 – pablof

2

あなたはパンケーキインターフェイスで

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

メソッドを定義するとき、何が本当に言っていることは次のとおりです。

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

インタフェースのすべてのメソッドは、あなたがドン場合でも、常に公開されたよう」それらを明示的にマークする。

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

+0

ご協力いただきありがとうございます!私はインターフェイスの常設メンバーを忘れていました。 – pablof

関連する問題