1:クラスの分割

本格学習Java入門(技術評論社:佐々木整 著)

本格学習 Java入門

本格学習 Java入門

(↑これなかなかいい本ですよ)に載っていた(P258)、
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();
}
}

が、コンパイル失敗。

cmcc.java:25: シンボルを見つけられません。
シンボル: メソッド mWindow()
場所 : cmcc の クラス
mWindow();
^
 mWindowクラスをいきなり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無しでやってみたら、これも上手くいった。
 どーなってるの?