Java超入門

まずは,ごく簡単なサンプルプログラムを実際に動かしてみよう.

演習 6   ダウンロードしたサンプル[*]のうち,sample/javaディレク トリ中のsample1.javaをコンパイルして実行せよ.
   % javac sample1.java
   % java HelloWorld
   Hello World.
javacによってコンパイルを行なうと,sample1.javaで定義されてい るクラスのクラスファイル HelloWorld.classが生成される.Java のプログラムは,指定したクラスのmainメソッドから実行が開始される (C言語において,main関数が実行されるのと同様である).上の例では, java HelloWorld によって,HelloWorldクラスで定義されている mainメソッドが実行される[*]

オブジェクトの操作は,そのオブジェクトが属するクラスで定義されているメソッ ドを呼び出すことによって行なう. sample1.java中の

   System.out.println("Hello World");
において,System.outは標準出力を表すオブジェクトであり, printlnはそのオブジェクトに文字列を一行出力するメソッドである.

同様に,sample2.javasample3.javaをコンパイルして実行せよ. sample2.javaPrintFileは,標準入力からファイル名を受け取って, そのファイルの内容を表示する.

   % javac sample2.java
   % java PrintFile
   sample2.java   (←適当なファイル名を入力)
   ...sample2.javaの内容が表示される...
sample3.javaFindFromFileは,引数として二つの文字列 str1str2をもらって実行し,標準入力からファイル名を受け取ると, ファイル中で,str1から始まってstr2で終わる文字列を順番に探し 出して表示する.
   % javac sample3.java
   % java FindFromFile a s
   sample3.java   (←適当なファイル名を入力)
   as
   atic void main(String[] args
   args
   ame = new BufferedReader(new InputStreamReader(Sys
   attern pat = Pattern.compile(args
   args
コマンドライン引数は,main メソッドのパラメータとして指定されてい る変数 String[] args に格納される.すなわち,args String型の配列になっており,コマンドラインから渡した引数の1つ目,2つ目, ...がそれぞれ文字列としてargs[0]args[1],...に格納 されている[*]

このサンプルでは,検索を行単位で行なっているため,行をまたがる(改行を含 む)文字列がマッチしても表示されない.例えば,一旦ファイルの内容を一つの 文字列として,その文字列を対象としたマッチングを行なえば,複数行にまたが る文字列も検索対象となる.

もう一つの例sample/java/sample4.javaを用いて,クラス,オブジェクト,メソッド についてごく簡単に説明する.このプログラムは,2つのクラス定義からなって いる.Switchクラスはon/offの2状態をもつスイッチ(またはフラグ) を表しており,ClassSampleクラスはこのスイッチを利用したプログラム 本体を想定している.実行例は以下のとおりである.

   % javac sample4.java
   % java ClassSample
   false
   true
mainメソッドでは,まずnewによってSwitchクラスのオブジェ クトs1s2を作っている.このとき呼び出されるのが,Switchクラスのコンストラクタ
   Switch() { flag = 0; }
である.flagはクラス定義の始めに宣言されている局所変数のようなもの であるが,それぞれのオブジェクトごとに独自の値を持っている[*]ことに注意しなければならない.このような変数をインスタン ス変数と呼ぶ.これによって,各オブジェクトの「内部状態」を表現することが できる.この例の場合は,各スイッチの状態を整数(の偶奇)を利用して表現し ている.Switchのコンストラクタは,このflagの初期値を0(この例 では偶数がonなので,初期状態on)とするオブジェクトを作成している.

次に,Switchクラスのメソッドを見てみよう.checkメソッドは引数 を取らず,内部状態の整数flagが表すon/offを真偽値として返している. すなわち,オブジェクトのflagが偶数ならばtrue,奇数ならばfalseを返すメソッドである.flipメソッドは,そのオブジェクト のon/offを切り替えるメソッドである.

これをふまえてmainメソッドに戻ると,s1は初期状態on(true)で作成された後,flipメソッドでoffに切り替わっている. 一方,Switchクラスの変数flagは,オブジェクト毎に独自の値を持 つので,s2は初期状態onのままである.

この例のSwitchクラスでは,スイッチの状態を整数の偶奇で表現して実装 しているが,これを利用するClassSample側ではスイッチの操作はコンスト ラクタと2つのメソッドを介してのみ行なえばよく,その実装の内容を意識する必 要がない.例えば,flagを(もっと素直に)boolean型の変数として 実装した別のSwitchクラスに差し替えたとしても,ClassSampleを変 更する必要はない.

実験ではJavaの基本についてこれ以上詳しい解説は行なわないので,教科書「す べての人のためのJava プログラミング(第二版)」(立木秀樹,有賀妙子) [*]を 読んで各自勉強すること.読むべき箇所を以下に挙げる.なお,C言語の理解が十 分でない者には4章全てと5.2も読むことを勧める.

旧版(第一版)の使用者は,以下が該当する.C言語の理解が十分でない者には, 3.8,4章全て,5.2, 5.3も読むことを勧める.

以下に参考となるウェブサイトを挙げる.

NAKAZAWA Koji
2014-09-30