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度書いていることになります。
同じこと(似たようなこと)をさせるときには共通部分を副プログラム(サブルーチン)として独立させるのがプログラムの伝統的手法です。言語によってサブルーチンとか、関数とか、いろいろな呼び方とやり方がありますが、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 が必要になります。これでも動きますが、オブジェクト指向らしいプログラムの書き方ではありません。
これまでのプログラムでは 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);
そこで、継承という方法があみ出されたともいえます。