目次

継承までのみちのり

mainだけで済ませる方法

Frame01.java の方法でフレームを2つ作る場合、たとえば次のようになります。setLocation(); は、2つのフレームがぴったり重ならないように位置をずらすためです。

import javax.swing.*;

public class Frame02{
    public static void main(String[] args){
        JFrame myframe1 = new JFrame();
        myframe1.setSize(400, 300);
        myframe1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myframe1.setLocation(10,20);
        myframe1.setVisible(true);

        JFrame myframe2 = new JFrame();
        myframe2.setSize(400, 300);
        myframe2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myframe2.setLocation(20,40);
        myframe2.setVisible(true);
    }
}

これだと同じことを2度書いていることになります。

メソッドを使う方法(1)

同じこと(似たようなこと)をさせるときには共通部分を副プログラム(サブルーチン)として独立させるのがプログラムの伝統的手法です。言語によってサブルーチンとか、関数とか、いろいろな呼び方とやり方がありますが、javaがC言語の関数から受け継いだものはメソッドと呼ばれています。

まずはメソッドにしてみます。いちばんC言語に近い(と思われる)方法で作っています。

/* よくない例なのでまねしないこと */
import javax.swing.*;

public class MtFrame02{
    public static void makeFrame(JFrame myf,int x, int y){
        myf.setSize(400, 300);
        myf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myf.setLocation(x,y);
        myf.setVisible(true);
    }
    public static void main(String[] args){
        JFrame myframe1 = new JFrame();
        makeFrame(myframe1,10,20);
        JFrame myframe2 = new JFrame();
        makeFrame(myframe2,20,40);
    }
}

mainからはじめ、myframe1 というJFrameのインスタンスを作ってから、その名前と表示位置を引数にしてmakeFrame()というメソッドを呼んでいます。メソッドは引数にある、(myframe1,10,20) という値を (myf,x,y) に代入して以下の作業をします。 この(myf,x,y)という3つの変数は作業用に使うだけで、メソッドが終わるたびに破棄されます。

このような使い方では static が必要になります。これでも動きますが、オブジェクト指向らしいプログラムの書き方ではありません。

メソッドを使う(2)

これまでのプログラムでは MtFrame02 というクラス名がまったく使われていません。自分で作ったクラスのインスタンスを new で作成してからメソッドを使って作業していくのがjavaの普通のやり方です。なぜこうするかはあとにして、とにかくこれをまねてみます。

/* よくない例なのでまねしないこと */
/* いかにうまくいかないかの例なのでそのつもりで */
import javax.swing.*;

public class MtFrame03{
    JFrame myf;
    public void makeFrame(int x, int y){
        myf = new JFrame();
        myf.setSize(400, 300);
        myf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myf.setLocation(x,y);
        myf.setVisible(true);
    }
    public static void main(String[] args){
        MtFrame03 myframe1 = new MtFrame03();
        myframe1.makeFrame(10,20);
        MtFrame03 myframe2 = new MtFrame03();
        myframe2.makeFrame(20,40);
    }
}
//        フレームに名前がないのであとで操作ができない

これはひどく醜い例になりました。メソッドの中でインスタンスを作るのがいけないのです。たぶん。

new MtFrame03(); でいったい何を作っているのかが明確になりません。(フレームは new JFrame(); でつくる)見通しの悪いプログラムです。これをみてjavaが難しいと行ってはいけません。プログラムの仕方が悪いのです。

メソッド型共通の欠点

どちらも後でフレームの大きさを変えたり、表示場所を変えたりが面倒です。たとえば(2)のmainの中でフレームの大きさを変えるには次のようにします。

      myframe1.myf.setSize(500, 400);

これを次のような方法でやりたいならばMtFrame03の中にもsetSize()というメソッドをつくればできますが、JFrameの機能を呼び出すためにわざわざつくるのも無駄です。

      myframe1.setSize(500, 400);

そこで、継承という方法があみ出されたともいえます。

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified