
「継承されたメソッドの可視性を下げることは出来ません。」というエラーの意味がわかりません。
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);
}
}
========================================
No.3ベストアンサー
- 回答日時:
いま気がついた。
質問とは無関係の話で恐縮だが、JFrameやJPanel等のSwingのコンポーネントとCanvas等のAWTのコンポーネントを混在して使うのは、
どんな場合でも問題が起きるわけではなく問題なく動くものもあるにしても、
それ以外に方法がない場合を除いて今のところは行わないようにした方がいい。
Swingを使うのであればCanvasの代わりにJPanelかJComponentを継承したクラスを作り、
paint(Graphics g)の代わりにpaintComponent(Graphics g)をオーバーライドする代替手段がある。
No.2
- 回答日時:
まず最初に、
> クラス自身には、publicをつけない場合には、publicと見なされると本で読みました
ということだが、もし本当ならその本の著者はJavaの基本的な言語仕様を誤解していると思われるので、
他の箇所の記述についても注意しておいた方がいいかもしれない。
publicをつけない場合のデフォルトの可視性はパッケージプライベートであり、
同じパッケージに属するクラスからしか見ることができないものとなる。
何も付けていないこととpublicをつけていることとは同じ意味にはならない。
このルールはクラスでもメソッドでもフィールドでも同じ。
# インタフェイス内で宣言するメンバ(インタフェイス自身の話ではない)だけは例外で、
# publicをつけなくてもpublicが省略されているとみなされる(逆に他の修飾子をつけるとエラー)。
質問については端的に言えば、
Canvasクラスではどんなパッケージに所属するクラスからでも見えると宣言していたpaintメソッドが、
Canvasクラスの一種に過ぎないCanvas_testクラスでは同じパッケージのクラスからしか見えないことになると不都合だから。
一つのクラスで定義されているメソッドの可視性がそのサブクラスでも担保されるように、
可視性が悪くなる方向(例えばpublicをprivateにする等)へのオーバーライドは許されていない。
つまり、あるクラスAから見える別のクラスBのメソッドはBのサブクラスがそれをオーバーライドしていてもAから見えることが言語仕様で保証されている。
質問のコードがコンパイルエラーになるのはpublicだったものをパッケージプライベートに変更しようとしたためこの仕様に反するから。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java java final 1 2022/06/10 22:49
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java eclipse実行ができない 2 2022/07/27 04:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# 「データが失なわれる可能性...
-
「ラッパークラス」の存在意義...
-
メソッドの公開レベルとか設計とか
-
抽象クラスをJUNITでテストする...
-
VB DLLプロジェクトについて
-
WPF C# PointToClient
-
ASP.NETでの共通コードの書き方...
-
「タイプ初期化子が例外をスロ...
-
private static という変数の修飾
-
mainメソッドのthrows節で設定...
-
レコード件数の表示
-
【JAVA】与えられた金額を貨幣...
-
複数の変数を宣言する時、同時...
-
エクセルVBAで、条件に一致する...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAでの[]
-
インスタンス参照でアクセスで...
-
abstract と static を一緒に付...
-
パワーポイントのVBAでテキスト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# 「データが失なわれる可能性...
-
「継承されたメソッドの可視性...
-
(vba)他のアプリケーションの右...
-
【C#】クラスのコンストラクタ...
-
VB DLLプロジェクトについて
-
メソッドの引数にクラス名を渡す
-
「ラッパークラス」の存在意義...
-
interface,extend,implementの...
-
c++でのヘッダーファイルの循環...
-
このエラーメッセージの意味を...
-
委譲って何ですか?
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
ファイルパスが取得出来ない(P...
-
ASP.NETでの共通コードの書き方...
-
Commons-Discovery.jarとは?
-
デバッグ時に「Source not found」
-
JTextFieldの入力制限
-
JavaのimplementsをC言語で例え...
-
オーバーライドとラッパーの違い
おすすめ情報