1:クラスの分割
本格学習Java入門(技術評論社:佐々木整 著)
- 作者: 佐々木整
- 出版社/メーカー: 技術評論社
- 発売日: 2004/03/31
- メディア: 単行本
- クリック: 10回
- この商品を含むブログ (9件) を見る
import javax.swing.*;を、分解したい。つまり、メインクラスからウインドウ表示クラスを分離しようと思った。大規模なプログラムを組むならメインクラスでウインドウ表示なんてやってられないだろうから。まずは機能分割の基礎を学ばねば。
class cmcc extends JFrame{
public static void main(String[] args){
JFrame f = new JFrame();
f.setSize(300,200);
f.show();
}
}
そこで、二つのクラスを同一ファイルに書き込み、一方のクラスからもう一方のクラスを呼び出してウインドウを描かせようとした
が、コンパイル失敗。import javax.swing.*;
class cmcc extends JFrame
{
public static void main(String[] args){
mWindow();
}
}class mWindow{
public static void main(String[] args){
JFrame f = new JFrame();
f.setSize(300,200);
f.show();
}
}
mWindowクラスをいきなりmWindow();で呼び出そういうのがいけないらしい。
cmcc.java:25: シンボルを見つけられません。
シンボル: メソッド mWindow()
場所 : cmcc の クラス
mWindow();
^
そこでmWindowクラスのインスタンスを生成して呼び出してみた
が、やはり失敗。
import javax.swing.*;
class cmcc extends JFrame
{
public static void main(String[] args){
mWindow mW = new mWindow();
}
}class mWindow{
public static void main(String[] args){
JFrame f = new JFrame();
f.setSize(300,200);
f.show();
}
}
今度はコンパイルは上手くいったがウインドウが表示されない。
原因はmWindowクラスにmainがあったことか?と(教科書のソースをいろいろ見て)思いmainメソッドをコメントアウトし、普通のメソッドを作ってそれを呼び出してみた
import javax.swing.*;
class cmcc extends JFrame
{
public static void main(String[] args){
mWindow mW = new mWindow();
mW.mai();
}
}class mWindow{
//public static void main(String[] args){
public static void mai(){
JFrame f = new JFrame();
f.setSize(300,200);
f.show();
}
}
上手くいった。
つまり、クラスはBASICで言うサブルーチンのように扱ってはいけないということだな。呼び出すならメソッドを呼び出さないといけない、と。そして呼び出されるクラスにはmainメソッドは作ってはいけない、と。
それならそうと書いてくれないかなぁ・・・。でも、クラスのインスタンスを作成する時はクラスを呼び出しているようなもんだよな。違うのか?二番目のソースの時も無名クラスとして生成して始めてくれてもいいような気もするのだが・・・。
ところで終わってから気がついたのだが、mWindowクラスはJFrameにextendsされていない。にもかかわらずcmccクラスはmWindowクラスをJFrameクラスとして作成しちゃってるし、mWindowもJFrameクラスとしてインスタンスfを作成している。いいのか?こんなんで。かなりいい加減に見えるのだが。本来ならcmccではなくmWindowをextendsするべきなのでは?
と思って、extends JFrameを付け替えてみたら、これも上手くいった。
まさかと思い、両方ともextends JFrame無しでやってみたら、これも上手くいった。
どーなってるの?