- ベストアンサー
継承されたメソッドの可視性を下げることは出来ません
- JAVA初心者が継承されたメソッドの可視性を下げる方法やエラーメッセージについて質問しています。
- ルールや原則に従ってコードを書いたにもかかわらず、可視性を下げることができないエラーが発生する理由を知りたいと思っています。
- また、publicキーワードの意味や役割も理解したいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
いま気がついた。質問とは無関係の話で恐縮だが、 JFrameやJPanel等のSwingのコンポーネントとCanvas等のAWTのコンポーネントを混在して使うのは、 どんな場合でも問題が起きるわけではなく問題なく動くものもあるにしても、 それ以外に方法がない場合を除いて今のところは行わないようにした方がいい。 Swingを使うのであればCanvasの代わりにJPanelかJComponentを継承したクラスを作り、 paint(Graphics g)の代わりにpaintComponent(Graphics g)をオーバーライドする代替手段がある。
その他の回答 (2)
- vaguechat
- ベストアンサー率85% (47/55)
まず最初に、 > クラス自身には、publicをつけない場合には、publicと見なされると本で読みました ということだが、もし本当ならその本の著者はJavaの基本的な言語仕様を誤解していると思われるので、 他の箇所の記述についても注意しておいた方がいいかもしれない。 publicをつけない場合のデフォルトの可視性はパッケージプライベートであり、 同じパッケージに属するクラスからしか見ることができないものとなる。 何も付けていないこととpublicをつけていることとは同じ意味にはならない。 このルールはクラスでもメソッドでもフィールドでも同じ。 # インタフェイス内で宣言するメンバ(インタフェイス自身の話ではない)だけは例外で、 # publicをつけなくてもpublicが省略されているとみなされる(逆に他の修飾子をつけるとエラー)。 質問については端的に言えば、 Canvasクラスではどんなパッケージに所属するクラスからでも見えると宣言していたpaintメソッドが、 Canvasクラスの一種に過ぎないCanvas_testクラスでは同じパッケージのクラスからしか見えないことになると不都合だから。 一つのクラスで定義されているメソッドの可視性がそのサブクラスでも担保されるように、 可視性が悪くなる方向(例えばpublicをprivateにする等)へのオーバーライドは許されていない。 つまり、あるクラスAから見える別のクラスBのメソッドはBのサブクラスがそれをオーバーライドしていてもAから見えることが言語仕様で保証されている。 質問のコードがコンパイルエラーになるのはpublicだったものをパッケージプライベートに変更しようとしたためこの仕様に反するから。
- SaKaKashi
- ベストアンサー率24% (755/3136)
継承元のクラスCanvasにpaintメソッドがあって、属性がpublicなのでしょう。 もともとpublicなのをprivate(省略)したからでは。
お礼
vaguechatさん、分かり易い回答有難うございました。 今後ともう宜しくお願いします。