![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?c9bd177)
アクセス修飾子無しのクラスのメソッドにpublicを付ける意味がわかりません。
class MyClass {
public void method() {}
}
例えばこのようなクラスがあったとします。
このクラスはアクセス修飾子無しで他のパッケージからはアクセス出来ない為、メソッドにpublicを付ける意味は無いと思うのですが、付けてもコンパイルは通ります。
何故なんだろう、と考えてみたのですが、例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?
御教授よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> 例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?
『遊び』ではなく、実際にそのような形で外部のクラスに内部クラスのメソッド等を使わせるような場合に使用します。
例えば、java.util.zip.ZipFile#getInputStreamはInputStreamクラスを返しますが、実装では場合によりInputStreamクラスを継承した内部クラス(内部クラスなのでpublicは付いていない。private)を返します。
readメソッドはオーバーライドされ、独自の実装が加えられていますが、アクセス修飾子はpublicであるため、外部パッケージのクラスからもアクセスすることができます(通常のInputStreamと同じようにreadが出来る)。
詳しくは実際にソースを見て下さい。
この回答への補足
理解出来ました。
クラスがprivateでも、そのメソッドに全くアクセス出来ない訳ではないんですね。
つまり、privateな内部クラスのオブジェクトをクラス内で生成し、それをスーパークラスの型の参照変数に入れ、getメソッドのような形でパッケージの外に渡せば、そのprivateな内部クラスのpublicなメソッドが(スーパークラスのメソッドをオーバーライドしたもの限定で)使えますね。
使いたいメソッドがオーバーライドされたものであることがポイントかなと思いました。
具体的な例をありがとうございました。
No.2
- 回答日時:
確かにオーバーライドにより機能は変わるでしょうが、
「遊び」というよりご指摘のように、
・ メソッドの名前は必ず残したい、
・ つまりこのクラスのサブクラスである限りは、必ずその名前を使えるように強制したい。
と言う事ではないでしょうか。
もしパブリックにしないと、サブクラスとして公開したときに
そのメソッドを使えなく出来ますね。
なるほど、サブクラスの方も考えてみるべきでした。(スーパークラスのことだけ考えていました。)
まだ混乱しているのですが、もう少しじっくり考えてみます。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java final 1 2022/06/10 22:49
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
readLine()ではじめから読み直...
-
メソッドの引数に指定されてい...
-
Javaの関数名が長い?
-
staticのメリット、デメリット
-
Java初心者です、エラーの意味...
-
C# の ByVal と ByRef について
-
privateのメソッドをリフレクシ...
-
エクセルVBAで、条件に一致する...
-
「天声人語」をインターネット...
-
C#でほかのファイルにある自作...
-
ArrayListのgetメソッドが実行...
-
servletからjspへオブジェクト...
-
NTPサーバーへのアクセス
-
C#「オブジェクト参照が必要で...
-
execute()
-
LISTBOXの内容が更新されま...
-
packageとimport の違いって?
-
javaで、、、
-
命名規約は連番でいいのか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
public static void main (Stri...
-
abstract と static を一緒に付...
-
Google Apps Script で getRang...
-
StringBufferからStringへキャ...
-
メソッド宣言の戻り値の型にク...
-
javaに"search"という関数 or ...
-
C# 点の描き方をおしえてくだ...
-
Java初心者です、エラーの意味...
-
なぜprotected overrideなのか
-
親の親のメソッドを呼ぶには?
-
C# でメソッドに送られてきたOb...
-
Javaの関数名が長い?
-
別クラスのmainメソッドの実行
-
[クラス名].[メソッド名].[メソ...
-
コマンドライン引数のチェック
-
contextってなんですか?
-
説明文書でのメソッド・変数の...
おすすめ情報