アプリ版:「スタンプのみでお礼する」機能のリリースについて

「継承されたメソッドの可視性を下げることは出来ません。」というエラーの意味がわかりません。

 JAVA初心者です、宜しくお願いします。

 下のようなコードを書きましたが、"void paint(Graphics g)"の箇所で
「Canvasから継承されたメソッドの可視性を下げることは出来ません。」
とのエラーメッセジが出ました。

 "public void paint(Graphics g)"とかくと、エラーは消えました。
 何故"public"をつける必要があるのでしょうか。

 また、クラス自身には、publicをつけない場合には、publicと見なされると本で読みましたが
 メッソドにはこのようなルールはないのでしょうか。


=======================================
public class Canvas_test extends Canvas
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setTitle("Canvas_test");
frame.setBounds(0,0,480,380);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLayout(null);

JPanel cp = new JPanel();
cp.setLayout(null);
frame.add(cp);
cp.setBounds(38,20,400,300);

Canvas canvas = new Canvas_test();
cp.add(canvas);
canvas.setBounds(0,0,400,300);
frame.setVisible(true);
}

void paint(Graphics g)
{
g.drawString("aaaa",40,40);
}
}

========================================

A 回答 (3件)

いま気がついた。

質問とは無関係の話で恐縮だが、
JFrameやJPanel等のSwingのコンポーネントとCanvas等のAWTのコンポーネントを混在して使うのは、
どんな場合でも問題が起きるわけではなく問題なく動くものもあるにしても、
それ以外に方法がない場合を除いて今のところは行わないようにした方がいい。
Swingを使うのであればCanvasの代わりにJPanelかJComponentを継承したクラスを作り、
paint(Graphics g)の代わりにpaintComponent(Graphics g)をオーバーライドする代替手段がある。
    • good
    • 0
この回答へのお礼

vaguechatさん、分かり易い回答有難うございました。

今後ともう宜しくお願いします。

お礼日時:2010/10/02 20:31

まず最初に、



> クラス自身には、publicをつけない場合には、publicと見なされると本で読みました

ということだが、もし本当ならその本の著者はJavaの基本的な言語仕様を誤解していると思われるので、
他の箇所の記述についても注意しておいた方がいいかもしれない。
publicをつけない場合のデフォルトの可視性はパッケージプライベートであり、
同じパッケージに属するクラスからしか見ることができないものとなる。
何も付けていないこととpublicをつけていることとは同じ意味にはならない。
このルールはクラスでもメソッドでもフィールドでも同じ。
# インタフェイス内で宣言するメンバ(インタフェイス自身の話ではない)だけは例外で、
# publicをつけなくてもpublicが省略されているとみなされる(逆に他の修飾子をつけるとエラー)。

質問については端的に言えば、
Canvasクラスではどんなパッケージに所属するクラスからでも見えると宣言していたpaintメソッドが、
Canvasクラスの一種に過ぎないCanvas_testクラスでは同じパッケージのクラスからしか見えないことになると不都合だから。

一つのクラスで定義されているメソッドの可視性がそのサブクラスでも担保されるように、
可視性が悪くなる方向(例えばpublicをprivateにする等)へのオーバーライドは許されていない。
つまり、あるクラスAから見える別のクラスBのメソッドはBのサブクラスがそれをオーバーライドしていてもAから見えることが言語仕様で保証されている。
質問のコードがコンパイルエラーになるのはpublicだったものをパッケージプライベートに変更しようとしたためこの仕様に反するから。
    • good
    • 1

継承元のクラスCanvasにpaintメソッドがあって、属性がpublicなのでしょう。


もともとpublicなのをprivate(省略)したからでは。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!