• ベストアンサー

【アクセス修飾子】アクセス修飾子無しのクラスにpublicなメソッド

アクセス修飾子無しのクラスのメソッドにpublicを付ける意味がわかりません。 class MyClass {  public void method() {} } 例えばこのようなクラスがあったとします。 このクラスはアクセス修飾子無しで他のパッケージからはアクセス出来ない為、メソッドにpublicを付ける意味は無いと思うのですが、付けてもコンパイルは通ります。 何故なんだろう、と考えてみたのですが、例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか? 御教授よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

> 例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか? 『遊び』ではなく、実際にそのような形で外部のクラスに内部クラスのメソッド等を使わせるような場合に使用します。 例えば、java.util.zip.ZipFile#getInputStreamはInputStreamクラスを返しますが、実装では場合によりInputStreamクラスを継承した内部クラス(内部クラスなのでpublicは付いていない。private)を返します。 readメソッドはオーバーライドされ、独自の実装が加えられていますが、アクセス修飾子はpublicであるため、外部パッケージのクラスからもアクセスすることができます(通常のInputStreamと同じようにreadが出来る)。 詳しくは実際にソースを見て下さい。

kousai
質問者

お礼

こちらに書くべきでした。 重ねて、ありがとうございました。

kousai
質問者

補足

 理解出来ました。  クラスがprivateでも、そのメソッドに全くアクセス出来ない訳ではないんですね。  つまり、privateな内部クラスのオブジェクトをクラス内で生成し、それをスーパークラスの型の参照変数に入れ、getメソッドのような形でパッケージの外に渡せば、そのprivateな内部クラスのpublicなメソッドが(スーパークラスのメソッドをオーバーライドしたもの限定で)使えますね。  使いたいメソッドがオーバーライドされたものであることがポイントかなと思いました。    具体的な例をありがとうございました。

その他の回答 (1)

  • auty
  • ベストアンサー率58% (284/486)
回答No.2

確かにオーバーライドにより機能は変わるでしょうが、 「遊び」というよりご指摘のように、 ・ メソッドの名前は必ず残したい、 ・ つまりこのクラスのサブクラスである限りは、必ずその名前を使えるように強制したい。 と言う事ではないでしょうか。 もしパブリックにしないと、サブクラスとして公開したときに そのメソッドを使えなく出来ますね。

kousai
質問者

お礼

なるほど、サブクラスの方も考えてみるべきでした。(スーパークラスのことだけ考えていました。) まだ混乱しているのですが、もう少しじっくり考えてみます。 ご回答ありがとうございました。