25
class MyClass 
{
    public static final int num=90;
}
  • 非パブリック クラスでパブリック メンバーを作成できるのはなぜですか?
  • 私が知らないこのメンバーにアクセスする別の方法はありますか (クラス名以外)?
4

4 に答える 4

18

あなたの質問はmembersに関するものだったので、フィールドとメソッドの両方に対処します (非静的。Anthony Accioly の回答は、静的フィールドも含む別の適切なユース ケースに触れています)。

多くの場合、これは言語の文法のあいまいな結果にすぎませんが (特に、スニペットの例のように、非パブリック クラスのパブリックフィールド)、パブリックメソッドを非パブリック クラスで使用できるようにする必要がある非常に正当な理由があります。公開クラス。

Mik378 の回答を拡張して、たとえば次のように考えます (不自然な例):

import ...;

class BleebleAscendingComparator implements Comparator<Bleeble> {
    @Override public int compare (Bleeble o1, Bleeble o2) { ... }
}

class BleebleDescendingComparator implements Comparator<Bleeble> {
    @Override public int compare (Bleeble o1, Bleeble o2) { ... }
}

public class BleebleView {  
    public enum SortMode { ASC, DESC };
    public Comparator<Bleeble> getDisplayOrderComparator (SortMode mode) {
        if (mode == SortMode.ASC)
            return new BleebleAscendingComparator();
        else
            return new BleebleDescendingComparator();
    }
}

これらの実装の 1 つをそのコンテキストの外部で直接インスタンス化することはできませんComparatorが、 のパブリック メソッドをオーバーライドする必要がありComparator、それらの機能にはComparatorインターフェイスを介してアクセスできます。

これと同じ理由が、たとえば内部クラスにprivateも当てはまります。protectedメソッドを宣言できなければ、継承するインターフェースのメソッドや継承するクラスをpublicオーバーライドする方法がありません。public

実際の例:

  • これは、匿名の内部クラスで public メソッドをオーバーライドするたびに (たとえば、 anonymous でオーバーライドするたびに)public void actionPerformed使用しActionListenerます。

  • に格納したい非公開クラスを検討してくださいHashMap。その非パブリック クラスの publicequals()とをオーバーライドすると、クラスが非パブリックであるという事実に関係なく、 の実装でそれらにアクセスできます。hashCode()HashMap

  • オーバーライドされることが多いpublic toString()のは、パブリックでない可能性のあるクラスのパブリック メンバーのもう 1 つの一般的な例です。

  • より複雑な例は、java.sql.DriverManager での使用ですjava.sql.Driver(一般に、ファクトリ タイプの設計ではこの概念を多用します)。SQL ドライバの実装では、実装クラスをパブリックにしない場合があります (たとえば、Oracleドライバは非パブリックを生成します)。Connectionオブジェクト)。

  • 他にもたくさんあります...この例に目を光らせていると、実際にどれほど一般的であるかに驚かれることでしょう!

于 2014-03-03T01:15:01.937 に答える