2013-04-17 16 views
6

メソッドがパブリックであるかパッケージ保護されているクラスでパッケージ保護されているかどうかに違いがあるのだろうかと思います。パッケージ保護クラスのパブリックメソッドには何らかの理由がありますか?

class Example { 
    public void test() {} 
} 

代わりに

class Example { 
    void test() {} 
} 

Iは、最大の視認性は、クラスによって与えられると思います。そして、メソッドは可視性を減らすだけで、可視性を高めることは効果がありません。

しかし、それは有効な構文なので、おそらく私は何かを見過ごしてきましたか?

+0

は、私は、継承には影響を行いません保護+公共の組み合わせをtheresのC++で知って、私の推測では、ここでは同じパッケージ内のクラスのための効果を有することです。 – Infested

答えて

5

publicクラスにサブクラス化すると、サブクラスインスタンスがpublicの場合、パッケージ外のコードはtest()メソッドにアクセスできます。

例:良い質問ザッツ

package A; 
class Example { 
    public void test() {} 
} 

package A; 
public class SubExample extends Example { 
} 

package B; 
import A.SubExample; 
class OutsidePackage { 
    public void some method(SubExample e){ 
    // Had test been defined with default access in class Example 
    // the below line would be a compilation error. 
    e.test(); 
    } 
} 
+0

私に例を教えてもらえますか?私はあなたに従うことができません。 – tangens

+0

私はリフレクションを使って例を構築しようとしました。しかし、例外 'java.lang.IllegalAccessExceptionが発生します:Class other.Otherはmodifier "public"でクラスexample.Exampleのメンバーにアクセスできません。だからクラスのパッケージ保護は、その公開メソッドも保護されているようです。 – tangens

+0

良い例です、ありがとうございます。メンバーがパッケージで保護されているか公共であるかによって、実際には違いが生じます。 – tangens

5

Exampleに何らかのインターフェースを実装した場合は、そのような場合のアクセスを減らすことができないため、公開する必要があります。すべてのインタフェースメソッドは、デフォルトでpublicです。

+0

良い点。クラスが既にパッケージ保護されている場合、あなたは常にあなたの "パッケージ保護された"メソッドをpublicにしますか? – tangens

+0

すべてではありません。それがポイントなので、私はコンストラクタをpublicにしません。 – duffymo

0

書かれているとおり、何もしません。サブクラスまたはインタフェースの実装の場合は、他の場所でpublic宣言されているメソッドを実装またはオーバーライドしている可能性があります。

+0

実際には違いがあります。 @ noob-unchainedの答えを見てください。 – tangens

関連する問題