継承とsuperの意味が理解できない

このQ&Aのポイント
  • JAVAの初心者が継承とsuperについて理解できない。タイトル: 継承とsuperの意味が理解できません。
  • 1番目のアプレットでは正常にWINDOWが表示されるが、2番目のアプリケーションでは透明になってしまう。paintメソッド内に「super.paint(g);」を書くと正常に動作する。
  • 継承している子クラスは無条件で親クラスのメソッドを上書きできるが、いつSUPERが必要なのか理解できない。
回答を見る
  • ベストアンサー

継承とsuperの意味が理解できません。

継承とsuperの意味が理解できません。 今日は、JAVA初心者です、宜しくお願いします。 1番目のアプレットで「Applet」を継承させると、正常にWINDOWが表示されます。 しかし、2番目のアプリケ-ションを動かすと、「JFrame」を継承して、「PAINT」 を上書きしているのに、WINDOWは表示されますが、 透明になって、下側の画面が映り、Todayという文字は正常に表示されません。 paintメソッド内に、「super.paint(g);」を書いてやると、正常に動作します。 (3番目のプログラム) テキスト通に、「JFrame」を継承して、「PAINT」を上書きしているのに、「PAINT」 メソッド内で、更に「super.paint(g);」を呼び出す必要性、理由がわかりません。 継承の意味が無いと思うのですが、他に原因があるのでしょうか。 継承している子クラスは、無条件で親クラスのメソッドを上書き出来ると思うのですが、 一体どのような時にSUPERが必要になるのでしょうか。 宜しくお願いします。 1番目のプログラムをと2番目のプログラムはアプレット、アプリケーションとの違い はあるとしても、 基本的な考え方は違わないと考えてるのですが。 ====================================================== public class Sample1 extends Applet { public void paint(Graphics g) { g.drawString("java",10,10); } } ====================================================== public class JFrameTest extends JFrame { JFrameTest() { setSize(400,300); setTitle("JFrameTest"); } public void paint(Graphics g) { g.drawString("Today",100,100); } public static void main(String[] args) { JFrame jf = new JFrameTest(); jf.show(); } } ====================================================== public class JFrameTest extends JFrame { JFrameTest() { setSize(400,300); setTitle("JFrameTest"); } public void paint(Graphics g) { super.paint(g); g.drawString("Today",100,100); } public static void main(String[] args) { JFrame jf = new JFrameTest(); jf.show(); } } ======================================================

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
noname#259269
noname#259269
回答No.1

私は .NET 使いなので Java は疎いのですが、 メソッドをオーバーロードして望み通りの結果が得られないという事は、親クラスの paint メソッド内で何か必要な処理をしているという事です。それを上書きしてしまうとその処理が呼び出されなくなる為動かなくなっているのでしょう。 JFrame の paint は下記にあるように http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/swing/JFrame.html java.awt.Container 由来のようなので、そちらを見てみると、super.paint(g) を呼べ、と書いてありますね。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/Container.html#paint%28java.awt.Graphics%29

関連するQ&A

  •  super.paint(g)を呼び出す意味が理解できません。

     super.paint(g)を呼び出す意味が理解できません。  お早うございます、JAVAの初心者です、基本的な内容が理解出ずに悩んでいます。  宜しくお願い致します。  以下のプログラムを書いてやりました、「Sample1」は、public void paint(Graphics g)で オーバライドしてやると、そのまま”java”が表示されますが、JFrameTestでは、 public void paint(Graphics g)のなかに「super.paint(g)」を書いてやらないと、 一応windowは表示はされるのですが、パネルが透明になって下の文字とか、 画像が見えてしまいます。(何故か文法エラーにはなりません)  しかし、public void paint(Graphics g)の内に「super.paint(g)」を書いてやると、 普通通り表示されます。  この違いというか原因はなになのでしょうか。  「super.paint(g)」は親クラスのpaintメソッドをを呼び出していると思うのですが、 何故ここで必要なのでしょうか。  「Sample1」との違いが分かりません、何とぞ宜しくお願い致します。 ======================================================= public class Sample1 extends Applet { public void paint(Graphics g) { g.drawString("java",10,10); } } ============================================================ public class JFrameTest extends JFrame { JFrameTest() { setSize(400,300); setTitle("JFrameTest"); } public void paint(Graphics g) { super.paint(g); g.drawString("Today",100,100); } public static void main(String[] args) { JFrame jf = new JFrameTest(); jf.setVisible(true); } }

    • ベストアンサー
    • Java
  •  paint( )メッソドをオーバーロードについて

     paint( )メッソドをオーバーロードについて  今晩は、JAVA初心者です、宜しくお願いします。  paint( )メッソドをオーバーロードする時に、<< A >>のコードはそのまま、  g.drawStringを書いていますが、<< B >>のコードでは、  super.paint( )で親クラスを呼んでやらないと、エラーになります。  この両者の違いが全く理解出来ません、どこがどのように違うのでしょうか。  宜しくお願い致します。 ======================================== << A >> public class Sample extends Applet { public void paint(Graphics g) { g.drawString("Applet",50,50); } } ======================================= << B >> public class JFrame_Test extends JFrame { JFrame_Test() { setSize(400,300); setTitle("JFrame_Test"); } public void paint(Graphics g) { super.paint(g); g.drawString("Today",70,70); } public static void main(String[] args) { JFrame jf = new JFrame_Test(); jf.setVisible(true); } } ========================================

    • ベストアンサー
    • Java
  • 実行してもタイトルバーしか表示されません

     JAVAの初心者です。  "Public JFramelTest(){"の箇所で"メソッドの戻りの型がありません"とエラーがでます。  しかし実行はできるので、実行するとダイヤログは表示されますが、タイトルバーのみしか、表示されません。  サイズを大きくすると文字はかけていますが、タイトルバーには"JFrame Test"の文字は有りません。  一体どこが悪いのでしょうか宜しくお願いします。 ============================================================================= //JFrameTest:Swingのフレーム import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JFrameTest extends JFrame{ /* コンストラクタ */ public JFramelTest(){ setSize(800,400); //画面サイズ setTitle("JFrame Test"); //タイトル //×ボタンで終了 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } //paint public void paint(Graphics g){ super.paint(g); //JFrameクラスのpaintの呼出し g.drawString("JAVA",80,100); } //main public static void main(String[] args) { JFrame w = new JFrameTest(); w.show(); } }

    • ベストアンサー
    • Java
  • 「継承されたメソッドの可視性を下げることは出来ません。」というエラーの

    「継承されたメソッドの可視性を下げることは出来ません。」というエラーの意味がわかりません。  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); } } ========================================

    • ベストアンサー
    • Java
  •  インスタンスの作る場合の型宣言

     インスタンスの作る場合の型宣言  今晩は、JAVA初心者です、宜しくお願いします。  下のようなプログラムを書いてやりました。 //JFrame_Test jf = new JFrame_Test(); JFrame jf = new JFrame_Test(); と書き変えてやってもエラーもなく、正常に同じ動作をします。  この両者は文法的にはどのように違うものなのでしょうか。  どうも両者は別の意味を持っているような気がして、色々と調べてみましたが、 よく分かりませんでした。  また、JFrame jf = new JFrame(); とかいても、正常に動作します。 この違いもよく理解出来ないのですが、  これは、JFrame_Testではなく、JFrameという親クラスのオブジェクトを作っ ているということでしょうか、以上宜しくお願いします。 ======================================================== public class JFrame_Test extends JFrame { JFrame_Test() { setSize(200,200); } public void paint(Graphics g) { super.paint(g); g.drawString("XYZ",50,50); } public static void main(String[] args) { JFrame jf = new JFrame_Test(); // JFrame_Test jf = new JFrame_Test(); jf.setVisible(true); } }

    • ベストアンサー
    • Java
  • 簡単なこーどですが、エラーの原因が分かりません

    今晩は、JAVAの初心者です、宜しくお願いします。 下のコードでエラーがでます、いくら考えても原因がさっぱり分かりません。 一体何処が悪いのでしょうか、宜しくお願いします。 また、最後の「j.show();」では警告が出ています。 何が原因でしょう?? ============================================================ import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; class JFrame_Ohayou extends JFrame implements WindowListener{ /*********** コンストラクタ ********************/ public JFrame_Ohayou(){ setSize(400,300); setTitle("JFrameのテスト"); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } /******************* paint ***********************/ public void paint(Graphics g){ super.paint(g); g.drawString("おはよう",20,40); } } /******************* main ***********************/ public class JFrameTest{ public static void main(String[] args){ JFrame_Ohayou j = new JFrame_Ohayou(); j.show(); } } =============================================================

    • ベストアンサー
    • Java
  • Jpanelへの描画について(初心者です)

    質問1 実行した時に内容が表示されたりされなかったりします、どうしてでしょうか? いろいろ試してみましたが分かりませんでした。 質問2 JPanelではダブルバッファリング機能が備わっているみたいですが、 という事はこのソースでもそれは行なわれているのでしょうか? 以上2点と質問が多いですがよろしくお願いします。 import java.awt.*; import javax.swing.*; public class JFrameTest extends JFrame{  JPanelTest panel;  Container ct;  public static void main(String[] args){   new JFrameTest();  }  public JFrameTest(){   super("JFrameTest");   panel = new JPanelTest();   ct = getContentPane();   setSize(480,480);   setResizable(false);   setVisible(true);   setDefaultCloseOperation(EXIT_ON_CLOSE);   ct.add(panel);  } } class JPanelTest extends JPanel{  public JPanelTest(){   setSize(480,480);  }  public void draw(Graphics g){   g.drawString("Test",240,240);  }  public void paintComponent(Graphics g){   super.paintComponent(g);   draw(g);  } }

    • ベストアンサー
    • Java
  •  static 参照するには??

     static 参照するには??  Java初心者です、宜しくお願いします。  下のようなプログラムを書きましたが、「Container gc = getContentPane();」 の箇所で、「型 JFrame の非 static メソッド getContentPane() を static 参照することはできません」とエラーが出ます。 意味がわかりません、またどのように変更してやればよいのでしょうか。 宜しくお願いします。  ======================================================================= class Canvas1 extends JFrame { public void paint(Graphics g) { g.drawRect(150, 150, 50, 50); } } public class SimpleDraw extends JFrame { public static void main(String[] args) { JFrame jf = new JFrame(); JPanel jp = new JPanel(); Container gc = getContentPane(); gc.add(jp); Canvas1 c = new Canvas1; jp.add(c); jf.add(jp); jf.setVisible(true); } }

    • ベストアンサー
    • Java
  • JPanelで宣言したメソッドについて

    JPanelを継承したクラスで、引数をもらってその引数を表示するメソッドを作成します。そして別のJFrameを継承したクラスの中で、さきほど作成したメソッドを利用したいのですが、どうすればできるのでしょうか?そもそもこのやり方できちんと表示されるのでしょうか? ぜひともご教授のほど宜しくお願いします。 以下はプログラムになります。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class Ptest extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("よろしく", 50, 50); } public void draw(String s) { Graphics g = getGraphics(); g.drawString(s, 100, 100); } } class Ftest extends JFrame { JLabel jlb; public Ftest() { setSize(350, 300); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container c = getContentPane(); Ptest p = new Ptest(); p.draw("yoroshiku"); c.add(p); p.setLayout(null); jlb = new JLabel("frame"); p.add(jlb); jlb.setBounds(70, 70, 50, 50); } } public class Test1 { public static void main(String[] args) { JFrame w = new Ftest(); w.show(); } }

    • ベストアンサー
    • Java
  •  superについて教えて下さい

     superについて教えて下さい  JAVAの初心者です、宜しくお願いします。  「super」についてよくわかりません。 ある本には、「親クラスのコンストラクタを呼び出す」、またある本には、「親クラスのオブジェクトを呼 び出す」、と書かれていました。  ・コンストラクタとオブジェクトとは同じ意味なのでしょうか。  ・また、ある本には、「コンストラクタの継承はされない」とかかれていますが、どのように違うのでしょうか。  ・JAVAのApIには、次のように書かれています。   「paint     public void paint(Graphics g)コンテナをペイントします。このコンテナの子コンポーネントで    あるすべての軽量コンポーネントへペイント要求を転送します。このメソッドが再実装される場合、軽量    コンポーネントが正しく描画されるように super.paint(g) を呼び出さなければなりません。    (以下略)」   super.paint(g)と各意味は、親クラスのメソッドを呼びだすことで、親クラスのメソッドを呼びだす時に  も、superが必要ということでしょうか。  コンストラクタ自体についてよく理解出来ていないのですが  ・そもそもクラス(オブジェクトの生成)にとってどのような役割、意味があるのでしょうか。   オブジェクトの生成すると、デフォルトで自動的に引数なしのコンストラクタが作成されると書かれています  が、  ・作成されること自体にどのような意味があるのでしょうか。  変数の初期化とかをコンストラクタ内で設定するのは意味があるとは思うのですが、、、、

    • ベストアンサー
    • Java

専門家に質問してみよう