インスタンスの作成に関する質問

このQ&Aのポイント
  • JAVA初心者の質問ですが、インスタンスを作成する方法について調べています。
  • 具体的には、JFrameクラスを継承したクラスのオブジェクトを生成する方法が分からず困っています。
  • JFrameクラスとJFrame_Testクラスの違いや、JFrameクラスのオブジェクトを直接生成する方法が分からないので詳しく教えてください。
回答を見る
  • ベストアンサー

 インスタンスの作る場合の型宣言

 インスタンスの作る場合の型宣言  今晩は、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
  • 回答数2
  • ありがとう数2

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

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

オブジェクト指向言語を使う上で常識となっている概念にsubstitution principle (訳すと入れ替え原則) というものがあります。これは、サブクラスはスーパークラスと入れ替え可能という概念です。例えば、車というクラスを定義したときに、そのサブクラスとして消防車を定義しても、消防車は車の機能を全て持っているので車クラスと入れ替えて使うことができます。もちろん、消防車には消火という車にはないメソッドがあるはずですが、これがあっても車には違いありません。なお、車型の変数に消防車型を入れている場合は、実際の型 (actual type) は消防車であっても、見かけ上の型 (apparent type) は車になっているので、消火というメソッドは使えません。消火というメソッドを使う場合はキャストをしなくてはいけません。 ちなみに、なぜ継承があるかというと、プログラムを単純に書けるようになるからです。もし、継承がなければ例えば交通整理というメソッドを作るときに消防車の用の交通整理とスポーツカー用の交通整理と...とすべての車に対して交通整理というメソッドを作る必要がありますが、継承があれば車に対して交通整理メソッドを書けば車のサブクラスすべてにこの手のメソッドを書いたのと同じことになります。こうすることで、各種車に対してプログラムを書くという手間や車の種類が増えたときにさらにプログラムを書き足さないといけなくなるという手間を回避しています。 さて、このプログラムはJFrame_TestがJFrameを継承していて、JFrameのサブクラスとなっているのでJFrameの代わりとしてJFrame_Testを使ってプログラムを書く事ができます。この時、JFrameの代わりに使っているわけですから使えるメソッドはJFrameが持っているメソッドだけです。そして、同じ名前と引数のメソッドをJFrameとJFrame_Testで定義した場合は、JFrame_Testに定義されているメソッドの方がJFrameに定義されているメソッドよりも優先的に呼び出されます。もし、JFrame_Test型のメソッドを使いたい場合は一旦JFrame_Testにキャストして呼び出す必要があります。 > //JFrame_Test jf = new JFrame_Test(); > JFrame jf = new JFrame_Test(); > > と書き変えてやってもエラーもなく、正常に同じ動作をします。 > この両者は文法的にはどのように違うものなのでしょうか。 文法的に違う意味になります。JFrame_Test if = ...はJFrame_Test型の変数ifを定義したので、JFrame_Testと同じメソッドが使えますが、JFrame ifのはJFrame型の変数なのでJFrame型にあるメソッドしか呼び出すことができません。 > また、JFrame jf = new JFrame(); > とかいても、正常に動作します。 > これは、JFrame_Testではなく、JFrameという親クラスのオブジェクトを作っ > ているということでしょうか、以上宜しくお願いします。 そのとおりです。この場合、実際の型もJFrame_Testではないので、メソッドを実行した場合はJFrameのメソッドが呼ばれますし、JFrame_Testにキャストをすることもできません。

eiji_0035
質問者

お礼

hanabutakoさん、回答有難う御座います。 回答の内容から考えると、JFrame_Test()がJFrame()の メソッドをオーバーライドという考え方は理解できたのですが、 実際に JFrame jf = new JFrame_Test(); // JFrame_Test jf = new JFrame_Test(); としてプログラムを実行させると、フレームには、 "XYZ"という文字が表示されます。 これは、JFrame のメソッドが、JFrame_Test();にオーバーライド されたということでしょうか。 JFrame jf = new JFrame_Test();なら、JFrame のオブジェクト である、jf のメソッドが実行されているのなら、 フレームには文字は表示されないと思うのですが。 この考え方は間違っているのでしょうか。

その他の回答 (1)

回答No.2

前者様が完璧な回答をしていますので、補足ですが。 paintメソッドが例題としてどうかと思います。 定義しておき、 実体化すると内部で勝手に実行され続けるというものなので。 トラップメソッド(?)と勝手に呼んでいるのですが、 各Listenerクラスなどでよく見かけます。 public static void main(String args[]){ //JFrame jf = new JFrame_Test(); JFrame_Test jf = new JFrame_Test(); jf.setVisible(true); ///////////////////////////////////// jf.konbanwa(); ///////////////////////////////////// } public void konbanwa(){ this.setTitle("こんばんわ"); } jf.konbanwaを2通りのやり方で実行してみてください。 JFrame jf = new JFrame_Test(); の場合はシンボルが見つからず、コンパイルができないはずです。 変数jfが何を参照できるかという話ですよね? ちなみに JFrame jf = new JFrame_Test();としても ( (JFrame_Test)jf ).konbanwa(); とすれば実行できます。

関連するQ&A

  •  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
  • 継承と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
  •  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
  • JFrameのエラーの原因が分かりません。

     java初心者です、宜しくお願いします。  JFrameのコードを下記のように書いてやりましたが、「サーバーにデプロイするものが見つかり ません。」というエラーが出ます。   色々と参考書を見ながら勉強していますが、エラーの原因がさっぱりわかりません。    どなたか宜しくお願いします。 ============================================================================ public class JF4 extends JFrame { public void init() { Container cnt = getContentPane(); setBackground(Color.RED); setSize(400,400); setTitle("title"); setVisible(true); } } ================================================================================= public class JF4 extends JFrame { public void init() { Container cnt = getContentPane(); JPanel panel = new JPanel(); panel.setBackground(Color.RED); getContentPane().add(panel); setSize(400,400); setTitle("title"); setVisible(true); } }

  •  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
  • 実行してもタイトルバーしか表示されません

     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の初心者です、宜しくお願いします。 下のコードでエラーがでます、いくら考えても原因がさっぱり分かりません。 一体何処が悪いのでしょうか、宜しくお願いします。 また、最後の「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
  • 「継承されたメソッドの可視性を下げることは出来ません。」というエラーの

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

専門家に質問してみよう