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);
そこで、継承という方法があみ出されたともいえます。