最終更新日



Java入門2(Application応用)

[関連] 「Java入門1(Application基礎)」 「Java入門3(アプレット・スレッド)」 
 「Java入門4(イベント処理)」  「Java入門5(イベント処理2)」 

「Javaプログラミングメモ1」 「Javaプログラミングメモ2」 「Javaプログラミングメモ3」

[参考]Javaのプログラミング1ーApplication (学生向けにまとめた、HPにJavaプログラムをとりこんだ例)。


Java入門1は、アプリケーション基礎として、下記の4章まで、コマンドプロンプトによるコンパイル、実行操作や整数(int)などの基本データ,if文やforによる繰り返し,配列といった基礎的なところをやってきた。コマンドライン引数も扱ったので、Stringオブジェクト(文字列)からIntegerへ、さらに数値に変換するために、Integerクラスのメソッドも使い、オブジェクト指向言語の一端は紹介した。

しかし、どちらかというと、整数intとか倍精度実数doubleとかの基本データ型と配列、繰り返し処理といったことを中心にしてきた。ここからは、オブジェクト指向言語としての特性(クラス、メソット、インスタンスなど)を大いに使っていくことにする。

2進,16進数変換を例にして、IntegerやStringクラスのメソッドをさらに紹介し、new演算子によるインスタンス生成といった、オブジェクト指向プログラミングの核心にふれていく。

ますます「Java入門1」の1-4-1で紹介した Java2 SE5.0 API仕様 をしばしば見る必要があると思うので、再掲。


[このページ]
 5 2進、16進数、API  6 文字列、Stringクラス  7 オブジェクト、クラス、インスタンス

[Java入門1]
 1 Javaはオブジェクト指向言語  2 操作、基本データ型、Integerクラス  3 if文と繰り返し処理

4 配列と繰り返し  E [参考]エラーメッセージ例   S [参考] コマンドプロンプトの操作など


[2006/11/29 追加・修正]
 5-3 [考察] に、もとのデータが基本形なら、そのメソッドはクラス・メソッドにせざるをえない と追記。
 6-3 文字列分割、2題。

5 2進、16進数、API、クラスとイスタンス

コンピュータの基本は2進数である。しかし、1と0をずらずら並べられてはかなわないので、4桁ずつ区切って16進数で表現することも多い。ここでは、我々が普段使う10進数(整数)を2進、16進数に変換するIntegerクラスのメソッドを使ってみよう。

5-1では、整数の最大値として、Integerクラスに用意されている定数MAX_VALUEの2進表現、その桁数を見る。そのために、クラスライブラリ(API)に用意されているメソッドを使うのである。5-2では引数で与えた任意の整数の2進、16進表現。5-3では、複数の引数とした例題である。5-4は、逆に16進数を10進数に変換する。

5-3では、変換を何度も使うため、変換プログラムを独立のメソッドhenkan()として、それを繰り返しforの中で呼び出していく。練習のため、henkan()を自作のクラスの中にいれてみた。インスタンス・オブジェクトを生成する必要が出てくる。

例題ごとに、コメントに詳しく書いたが、さらに、7章で総括する。概念がつかみにくいだろうが、次第になれてくる。

5-1 整数最大値の2進表現

[プログラム]
class Binary {
  public static void main(String[] args) { 
    int max=Integer.MAX_VALUE;
    System.out.println("Integer-Max = " + max);
    String bs = Integer.toBinaryString(max);    
    System.out.println(max + " Binary = " + bs + " " + bs.length() + "bit");
    System.out.println(max + " Hexa = " + Integer.toHexString(max).toUpperCase());
  }
}
[実行結果]
  Integer-Max = 2147483647
  2147483647 Binary = 1111111111111111111111111111111 31bit
  2147483647 Hexa = 7FFFFFFF
[コメント]
1 整数は最もよく使うもののひとつで、型宣言はint。整数には32ビットを使うが、符号 に1ビット、残り
  31ビットがすべて1というのが整数の最大値。
  Integerのクラス変数、MAX_VALUEは10進数表記で格納されており、21億....である。
  (すべてのデータ基本型の最大値は補足8-1参照)。
2  print文で画面に表示すると、10進数で2.147483647E9と10桁になることがわかる(E9は10の9乗)。
3 ほんとうに、31ビットがすべて1なのかを確かめるため、Integerクラスのメソッド、toBinaryString(int)
 を使って、2進数の文字列に変換する(結果はStringクラスのインスタンスオブジェクトになる。
   String bs = Integer.toBinaryString(max);    
4 そのStringオブジェクト参照変数をbsとして、length() というStringクラスのインスタンス
  メソッドを使って文字列数を画面表示している。 bs.length()。
  下記、5-4の考察参照。
5  2進数のように、31ケも1を並べられてはかなわないから、16進変換 toHexString(int)も使う。
 さらに、toUpperCase()というStringクラスのインスタンスメソッドを使って、大文字にしている。
  2進数 1111は16進数ではFである。2進4桁(ビット)を16進数では1桁で表現できるから、28ビットが
  FFFFFFFとなる。残り3ビットの111は16進数でも10進同様7。結局、16進数では8桁。
6  短いが、典型的なJavaのプログラミングである。APIでInteger,Stringクラスを再度参照のこと。

5-2 コマンドライン引数の2進表現配列

[プログラム]
class Hexa2 {
  public static void main(String[] args) {
    String s = args[0];
    int n =Integer.valueOf(s).intValue();
    System.out.println("Decimal: " + s );
    System.out.println("Binary: " + Integer.toBinaryString(n));
    System.out.println("Hexa: " + Integer.toHexString(n).toUpperCase());
  }
}
[実行結果]
  java Hexa2 15
  Decimal: 15 Binary: 1111  Hexa: F
[コメント]
1 コマンドライン引数で与えた任意の10進数(String)をいったん整数(int)にしてから、2進、16進変換する。
2 100までの和とか1000万までの和という問題のときは、この変換をInteger.parseInt(s)でおこなった。
 ここでは、やや複雑な別法を使った。
3 下記のように2行で書くこともできる。
    Integer obj = Integer.valueOf(s);
    int n = obj.intValue();
  valueOf()メソッドはStringオブジェクトsをIntegerクラスのオブジェクトに変換している
  (5-1のコメント、3,4の手法に同じ)。
 その参照変数をobjとして、それを介してIntegerクラスのintValue()を使い、整数に変換している
  (5-3のコメント、6の手法に同じ)。
4 コマンドライン引数を忘れると下記エラー。
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at Hexa2.main(Hexa2.java:8)
5 入門4では、このプログラムをSwingによるGUI(Graphic User Interface)とアプレットで、ネット上
  で動作するプログラムに変える。

5-3 複数のコマンドライン引数の2進表現配列

[プログラム]
class Hexa3 {
  public static void main(String[] args) {
    HB hb = new HB();
    for (int i=0; i < args.length; i++) 
        hb.henkan(args[i]);
  }
}  
class HB {
    void henkan(String s) {
      int n=Integer.valueOf(s).intValue();
      System.out.print("Decimal: " + s);
      System.out.print(" Binary: " + Integer.toBinaryString(n));
      System.out.println(" Hexa: " + Integer.toHexString(n).toUpperCase());
   }
}
[実行結果]
  java Hexa3 7 12 128 255 65535
  Decimal: 7 Binary: 111 Hexa: 7
  Decimal: 12 Binary: 1100 Hexa: C
  Decimal: 128 Binary: 10000000 Hexa: 80
  Decimal: 255 Binary: 11111111 Hexa: FF
  Decimal: 65535 Binary: 1111111111111111 Hexa: FFFF
[コメント]
1 いままで、コマンドライン引数が1ケの例をいろいろ見てきたが、複数の場合をみると、コマンドライ
   ン引数は、文字型の配列そのものといってもいいことが分かるだろう。
   mainメソッドの引数、String[] argsは、String型配列の宣言と同じである。
2 複数の引数があり、繰り返して使いたいので、2進、16進変換をメソッドhenkan()として、繰り返し
 呼び出す。さらに、説明のため、henkan()を独立のクラスHBの中にいれてみた。
 そのクラスを参照する変数をhbとして、new演算子を使っている。 HB hb = new HB();
3 左辺のHBは型宣言(クラス名もなりうる)、右辺のHB()は、コンストラクタ といわれるもので、
 クラスのインスタンス オブジェクト (実体)を作成する。
  (Javaプログラミングメモ2の4章 参照、このページより先に作ったものだが、この種の問題で苦労した
   経緯を書いている。)
4  コンストラクタはクラス名と同じ名前のメソッドで、この場合はクラスHBのどこにもないが、明示的
  に宣言しない場合にもJavaコンパイラによって、自動的に作られる。 
5 new演算子は配列のときにも出てきたが、この場合は、インスタンス生成に必要なメモリ領域を確保
  するためのもの。
6 オブジェクト参照変数hbで、hb.henkan(args[i]);のようにクラス内のメソッドを呼ぶ。
   オブジェクト参照変数.インスタンスメソッド という記述をよく使う。
7 5-1では、String bs = Integer.toBinaryString(max); で、Stringクラスのインスタンスオブジェクト
 を生成している。toBinaryString()やvalueOf()が、Integerのクラスメソッドだから
 (APIでstaticとあるメソッド)、クラス名.クラスメソッド と記述する。
  Integer.parseInt(s)も同様。
 newを必要としないのは、これらのクラスメソッドが、インスタンス・オブジェクトを出力して
 いるからである。     
8 メソッド henkan(s)にstaticをつければ、henkan(s)がクラスメソッド ということになり、
 クラス名HB300で呼び出せる。
  class Hexa300 {
     public static void main(String[] args) {
       for (int i=0; i<args.length; i++) 
         HB300.henkan(args[i]);
     }
  }  
  class HB300 {
     static void henkan(String s) {
      ...........
     }
  }
  インスタンスでも、クラス・オブジェクトでもいいということは、そもそも、この問題に、インスタンス個々に
 データを保存するだけの必然性がなかったということだろう。
9 3〜10まで詳しく書いてきたが、この程度の問題なら、下記の簡潔な記述も可能。
   henkan()をmainと同じクラスHexa30のメソッド としたものである。
  ただし、henkan()のメソッドはstatic にしないと「staticでない メソッドhenkan(java.lang.String)を
  staticコンテキストから参照することはできない」とのエラーが出る。
  class Hexa30 {
    public static void main(String[] args) {
      for (int i=0; i<args.length; i++) 
        henkan(args[i]);
      }
    static void henkan(String s) {
      int n=Integer.valueOf(s).intValue();
      ...............
    }
}
  5-4,6-3の例題ではすべて、この方式。
10 なお、一つのファイルに複数のクラスを書くことは許されている。mainのあるクラスをコンパイルすると、
  付帯的なクラスも同時にコンパイルされる 。
 この場合のファイル名は、mainメソッドのあるクラス名とする。
 クラスの中に、複数のメソッドをもつことも当然許される。
11 この程度なら、実はあえて、別メソッドにするほどでもなく、下記のように、一つのクラス、
  一つのメソッドですむ。
class Hexa3000 {
  public static void main(String[] args) {
    for (int i=0; i<args.length; i++) {
      String s=args[i];
      int n=Integer.valueOf(s).intValue();
      System.out.print("Decimal: " + s);
      System.out.print(" Binary: " + Integer.toBinaryString(n));
      System.out.println(" Hexa: " + Integer.toHexString(n));
    }
  }
}
 以上、簡単な例題にもかかわらず、4通りもトライしたのは、私自身、オブジェクトの概念になじむため。

[考察](2006/12 追記、勘違いしていたり、間違っているところもありそう)。
1 「独習Java」によると、Mathクラスは、機能のみをカプセル化しているので、ほとんどのメソッドが
 クラス・メソッド。
  Stringクラスは、ほとんどがインスタンス・メソッドとある。文字列を""でくるむだけで、Stringオブ
 ジェクトになる。例外的に、クラス・メソッドとなっているのが、
     static String valueOf(int i) 、「int 引数の文字列表現を返す」 など。
  もとのデータが基本形 の場合は、オブジェクト参照変数にはできないため、クラス・メソッド 
  にせざるをえないであろう。変換すべきデータは引数の形で与えることになる。
   そう考えれば、Mathクラスのメソッドがクラス・メソッドである理由が分かるように思える。
   Integerクラスは、クラス・メソッドとインスタンス・メソッドとが共存しているが、
     static String toString(int i)  「指定された整数を表す String オブジェクトを返す」
  のように、もとのデータが基本形の場合は、文句なく、クラス・メソッドとなる。
2  しかし、
    static int parseInt(String s)  「文字列の引数を符号付き 10 進数の整数型として構文解析する」
 などは、引数がStringオブジェクトなので、それを参照変数としたインスタンス・メソッドにすること
 もできるようにみえる。
  しかし、これはIntegerクラスなので、Stringオブジェクトとは型が異なり、String s をオブジェクト
 参照変数とすることはできないのだろう。
3  5-1の例題に、
    String bs = Integer.toBinaryString(max);    
    System.out.println(max + " Binary = " + bs + " " + bs.length() + "bit");
  Stringクラスのインスタンス・メソッド、length()が出てきた。これを強引に変形してクラス・メソッ
 ドにすることができる。([コメント]8に類似)
class Binary10 {
  public static void main(String[] args) { 
    int max=Integer.MAX_VALUE;
    System.out.println("Integer-Max = " + max);
    System.out.println(max + " Hexa = " + Integer.toHexString(max));
    String bs = Integer.toBinaryString(max);    
    System.out.println(max + " Binary = " + bs + " " + String10.length10(bs+"X") + "bit");
  }
}
class String10 {
   static int length10(String s) {
      int i=0; 
      for (while s.charAt(i) != 'X') 
        i++;
      return i;
   }
}
   (2進数の文字列 bsにわざわざXを加えているのは、自作で、length()相当のものを作る方法が分からないため、
 文字列の終わりを明示するための苦肉の策)
   なお、下記のようなトライもしたが、あまりに姑息。
class String10 {
 static int length10(String s) { 
     return s.length();
  }
}
  文字列の長さを返すlength()は、Stringクラスのインスタンス・メソッドであるが、length(String s)
 というクラスメソッドであってもよさそうに思う。
  クラスライブラリのStringクラスで、staticをつけず、インスタンス・メソッドとした理由は不明。
  2と違って、引数の型とクラスはどちらもStringで一致しているが、Stringクラスは、大半がインスタンス・
 メソッドなので、あわせたのかもしれない。
4  自作のインスタンスメソッドは引数なしにして、オブジェクト参照変数で受け渡すことができるだろうか? 
 class HB Hexa3 と class HB の問題で、[コメント] 6 では、オブジェクト参照変数 hbで、hb.henkan(args[i]);
 のようにした。
 このString型の引数をオブジェクト参照変数にして、引数なしにしたいのだが、自作の場合はどうしても、
 hbのようなオブジェクト参照変数が必要なので、難しいようだ。2と類似、型が違えばだめということだろう。
  クラスライブラリの場合は、たとえば、Stringクラスを利用するとき、Stringオブジェクトを無条件に、
 オブジェクト参照変数にできるのとは、明らかに状況が異なるように思う。

5-4 引数つきのコンストラクタ

 5-3と同じ「複数のコマンドライン引数の2進表現配列」の問題、引数つきのコンストラクタを作成してみる。暗黙ではなくて、明示。
[プログラム]
class Hexa {
  public static void main(String[] args) {
    String as;
    HB hb;
    for (int i=0; i[コメント]
1 class HBの中のhenkan(String str)にも、戻り値をもたせた。
2 
3 
4 

5-5 複数のコマンドライン引数の16進数を10進数に変換する

[プログラム]
class Decimal {
  public static void main(String[] args) {
    for (int i=0; i < args.length; i++) 
       henkan2(args[i]); 
    }
 
 static void henkan2(String s) {
    int n=Integer.parseInt(s,16);
    System.out.println(" Hexa = " + s + " Decimal = " + n);
  }
}

[実行結果]
 java Decimal  10 FF 7FF FFFF
   Hexa = 10   Decimal = 16
   Hexa = FF   Decimal = 255
   Hexa = 7FF  Decimal = 2047
   Hexa = FFFF Decimal = 65535
[コメント]
1  前述の5-3と逆のことをさせる、つまり、16進数から10進数に変換するプログラム。APIを眺めていて、
   Integer.parseInt(s,16) でできそうだと見当をつけた。
2 Integer.parseInt(s)というのは、以前使ったが、メソッド名が同じで引数が異なるだけのもの
 はJavaのクラスライブラリに多数ある。
3 5-3の[コメント]9にあるもっとも簡単なやり方を採用。やはり、henkan2のメソットにstaticが必要であった。
4 16進数 7FFが2047というのは、ちょっとびっくりするが、7*16+16+255 または、8*16+16-1の値である。

6 文字列、Stringクラス

6-1 Stringオブジェクトの検索

[プログラム]
class StringDemo2 {
  public static void main(String[] args) { 
     String s="These real-world objects share two characteristics: 
         They all have state and behavior.
          (From http://java.sun.com/docs/books/tutorial/java/concepts/object.html)";
     int i = s.indexOf("objects");
    System.out.println(i);
  }
}
[実行結果]
  17
[コメント]
1  文字列も整数以上によく使われる。文字列sは、長文だが、オブジェクトについての説明の一部。
2  sは、Stringクラスのインスタンスへの参照変数。具体的な文字列で与えるときは、new演算子は不要。
    (配列の省略系がそうであったように)。
3  StringクラスのインスタンスメソッドindexOf(String str)を使って、"objects"が何番目に出るかを
  みている。
4  Stringクラスの他に、StringBufferクラスというのもあり、違いは6-3 英語の回文を扱った問題に書いた。
 少々難解だが、StringおよびStringBufferのいい例題と思う。
5  2-4,5-2,3-2,5-3などでコマンドライン引数を扱ってきた。それはStringオブジェクトであり、整数変換していた。
  すでに、Stringのインスタンスオブジェクトについてはなんどもやっていたことになるが、ここでは、
 文字列(文章)の両側にダブルクォーテーション(")をつけるだけで、Stringオブジェクトとなしう
 る例を示している。
6  キーボード入力(コマンドライン引数)、画面出力(print文)はいずれも、文字型。我々の目には数値なの
  か、文字なのか区別がつかないが、コンピュータ内部の文字コードでは区別される(次の6-2参照)。
7  System.out.printlnについて一言。Systemクラスのクラス変数outは、PrintStreamクラス型の出力。
  println()は、PrintStreamクラスのインスタンスメソッドである。APIで確かめるとよい。print文の引数は、
  整数intであっても、実数doubleであっても、暗黙のうちに、toString()メソッドを使って、String型に変
  換してから画面に出力する。

6-2 コマンドライン引数の文字の16進表現(ASCIIコード)

[プログラム]
class Chartest {
  public static void main(String[] args) { 
       char c =args[0].charAt(0);
       int n=c; 
       String s=Integer.toHexString(n);
       System.out.println("args[0]=" + args[0] + " c=" + c
              + " n=" + n  + " s=" + s);
  }
}
[実行例]
C:\JavaTry2005\Application1>java Chartest A    args[0]=A c=A n=65 s=41
C:\JavaTry2005\Application1>java Chartest 10   ars[0]=10 c=1 n=49 s=31
C:\JavaTry2005\Application1>java Chartest d    args[0]=d c=d n=100 s=64
[コメント]
1  これまで、コマンドライン引数は、みかけ上は普通の数字に見えても、実は文字列なので、数字
 にするために、IntegerクラスのparseInt(s) または、IntegerクラスのvalueOf(s).intValue()を使
 う必要があると説明してきた。
2 この例題は、コマンドライン引数が確かに文字であることを示すもの。
 StringクラスのcharAt(i)メソッド で、コマンドライン引数(文字列)のi番目の
 文字をとり出し、その文字 char cをint型に代入 すると、ASCIIコード相当の
 数字になることを利用している。
3 文字としての'1'は、10進数ではなんと49、16進数で31となる。parseInt(s)が必要なわけだ。
 なお、ASCIIコード表については、ビット・バイト・2進数・16進数・色指定 の「文字コード」参照。、

6-3 文字列の分割

6-3-1 文字列の分割

[問題]
 このページのアドレスをコマンドライン引数として、/ で分割する。
[プログラム]
class SplitTest {
  public static void main(String args[]) {
      String s=args[0];
      String[] array= new String[10];
      System.out.println(" 元のデータ s=" + s);
      for (int i=0; i < array.length; i++) {
          array=s.split("/");
          System.out.println("i=" + i +" array[i]=" + array[i]);
      }
  }
}
[実行例]
java SplitTest http://homepage1.nifty.com/mstak/Program/javaintro2.html
 元のデータ s=http://homepage1.nifty.com/mstak/Program/javaintro2.html
i=0 array[i]=http:
i=1 array[i]=
i=2 array[i]=homepage1.nifty.com
i=3 array[i]=mstak
i=4 array[i]=Program
i=5 array[i]=javaintro2.html
[コメント]
1  Stringクラスのsplitメソッドを使う、結果はStringの配列、適当にその要素を10とした。
2  array.length 以下の値で繰り返してみたが、エラーにもならず、無事終了。

6-3-2 文字列の分割

[問題]
  コマンドライン引数、double型の浮動小数点数を整数化するのに、splitメソッドを使ってみる。
[プログラム]
class ChangeInt {
  public static void main(String args[]) {
      String s=args[0];
      double d=Double.valueOf(s).doubleValue();
      int   n1=Double.valueOf(s).intValue();
      int   n2=(int)d;
      String[] array= new String[3];
      array=s.split("\\.");
      int   n3=Integer.parseInt(array[0]);
      System.out.print(" 元のデータ s=" + s + " d=" +d + " n1=" +n1 + " n2=" +n2 + " n3=" + n3);
  }
}
[実行例]
D:\JavaTry\Application1>java ChangeInt 1725.315
 元のデータ s=1725.315 d=1725.315 n1=1725 n2=1725 n3=1725
[コメント]
1  表題のテーマは、すでに「Java入門1」4-2の「さいころ」の例でやっている。上記の例では、n2
  の型変換の方法を使った。これか最も簡単。
2  したがって、特に問題にすることもないのだが、勉強のため、n3のようなかったるい方法も試みた。
  これは、コマンドライン引数、文字列としての小数点のある数から小数点以上をとりだし、整数化したもの。
3  Stringクラスのsplitメソッドで、単純に、array=s.split("."); とすると、
 java.lang.ArrayIndexOutOfBoundsException: 0 というエラーガ出る。
4  API には、
       String[] split(String regex) 
           この文字列を、指定された正規表現に一致する位置で分割します 
  とあり、正規表現 というのがひっかかった。
5  本によると、ドット(.)はメタ文字で、エスケーブ記号として、バックスラッシュ記号が必要とある。
6  Windowsでは、バックスラッシュ記号は\記号になる。1ついれて
      array=s.split("\.");  
  としたが、「エスケープ文字が不正」とのエラー。
7  \記号が2ついるのか、詳しいことは知らないが、ともかくやってみたら、できてしまった。
8  APIには、Doubleクラスに、n1のような、Doubleオブジェクトから整数にするメソッドもある。

6-4 String,StringBufferの応用(回文)

サンマイクロ社の「Javaチュートリアル 第3版」に紹介があり、ネット上にある、Palindrome は、
 英語の回文を扱った面白い例題である。
[プログラム]
public class Palindrome {
    public static boolean isPalindrome(String stringToTest) {
        String workingCopy = removeJunk(stringToTest);
        String reversedCopy = reverse(workingCopy);
        
        return reversedCopy.equalsIgnoreCase(workingCopy);
    }
    protected static String removeJunk(String string) {
        int i, len = string.length();
  	StringBuffer dest = new StringBuffer(len);
	char c;
	for (i = (len - 1); i >= 0; i--) {
	    c = string.charAt(i);
	    if (Character.isLetterOrDigit(c)) {
		dest.append(c);
	    }
	}
        return dest.toString();
    }
    protected static String reverse(String string) {
  	StringBuffer sb = new StringBuffer(string);
        return sb.reverse().toString();
    }
    public static void main(String[] args) {
        String string = "Madam, I'm Adam.";
        System.out.println();
        System.out.println("Testing whether the following "
                         + "string is a palindrome:");
        System.out.println("    " + string);
        System.out.println();
        if (isPalindrome(string)) {
            System.out.println("It IS a palindrome!");
        } else {
            System.out.println("It is NOT a palindrome!");
        }
        System.out.println();
    }
}
[実行結果]
   Testing whether the following string is a palindrome:
       Madam, I'm Adam.
   It IS a palindrome! 
[コメント]
1 複数のメソッドからなるクラスである。それぞれのメソッドにstaticがついていないと、もっと複雑になる
    (Java入門2の5-3参照)。
2  new演算子を使ってStringBufferのインスタンスを作っていることに注目。
   mainメソッドの"Madam, I'm Adam."をStringクラスのインスタンス stringとして、回文かどうかを
   見ているが、removeJunkメソッドは、この場合は、I'mのApostrophy'sを削除するためのもの。
3  stringの中味を1文字ずつみて、CharacterクラスのisLetterOrDigit(c)メソッドで、文字ないし
  数字なら、destに加えるというもの。
4  destとは、new StringBufferと、new演算子を使って作り出したもの。
5  Stringがいったん作られると、文字数を増減できないのに対し、StringBufferはそれが可能。
  したがって、文字を加えていくappend(c)は、StringBufferのメソッドである。
6  いくつかのメソッドを含むが、すべての メソッドにstaticをつけている。5-3の[コメント] の9と同じ用法。

7 オブジェクト、クラス、インスタンス

オブジェクトは、ソフトの世界に現実世界を模倣してみるという発想から出てきた概念という。本によって、いろいろなたとえがあるが、現実世界では、シャツの型紙や自転車の設計図がクラス に相当し、それらから作り出される個々のシャツなり自転車が実体、インスタンス であり、実際のものとしてオブジェクトであるというような説明である。ただし、ソフトの世界は現実のものとはやはり異なるので、このたとえにも限界がある。

オブジェクトは、クラスから作られるが、クラスから受け継いだ振る舞い(メソッド)と状態(メンバ変数)がある。設計図に振る舞いがあるとは奇妙な感じであるが、当然、振る舞いを考慮して設計されると考えればいいか?

単純に、オブジェクトを操作対象と理解すると分かりやすいときもある。「独習Java」には「振る舞いと状態の両方を定義する記憶領域のこと」とある。後述するように、インスタンス・オブジェクトを作成するには、コンストラクタと記憶領域確保のためのnew演算子を使うことがある。

クラスには、クラスに密着したクラス・メソッド、クラス変数 と、インスタンス・オブジェクトを作り出すインスタンス・メソッド、インスタンス変数 がある。5章、6章の例題のコメト、考察に詳しく書いたので、一部重複するが、ここでまとめておこう。

クラス・メソッドは、APIにstaticとある。下記がこれまでの例題に出てきたものである
 (引数 sはStringオブジェクト、nはint型の引数)。
    Integer.parseInt(s),Integer.parseInt(s,16),Integer.valueOf(s),
    Integer.toBinaryString(n),Integer.toHexString(n),
    Math.random() 
  いずれも、クラス名.メソッド名という表記になる。これらの出力は、基本データ型、ないし、Integer
 あるいはStringクラスのインスタンス・オブジェクトである。
  インスタンス・メソッドは、APIにstaticと断りのないものであるが、オブジェクトに働きかける
  ものであろう(少なくとも基本データ型に働きかけるものにはない)。例題の中で出てきたのは下記
 である。(str、objはString あるいはオブジェクト参照変数、引数 sはStringオブジェクト)。
     str.length().obj.intValue(),str.toUpperCase(),str.indexOf(s)
  いずれもオブジェクト参照変数名.メソッド名という表記になる。これらの出力は、基本データ型、
 ないしStringオブジェクト。

インスタンス・オブジェクトの生成は、上記のようなクラスライブラリのメソッドによるものも多いが、5-3の自作クラスで、(暗黙の)コンストラクタとnew演算子 を使って、生成するものもある。
 HB hb = new HB();

クラスライブラリからnewを使って生成する場合ももちろんある。次の「Java入門3」
 2-2には、Double pd=new Double(Math.PI)
 2-3には、Integer year=new Integer(yi) がある。いずれも、基本データ型からStringオブジェクトに変換するため、いったん、DoubleとかIntegerという、基本データをラップするクラスのオブジェクトにしている。doubleとかintという基本データがありながらラップクラスもあるのが分かりづらいところだが、このようなオブジェクトの変換がでいるようになるというのが存在理由の一つである。他に、基本データを隠蔽する効果(メソッドを通してしか使えない)とか、VectorやListArrayのように、その要素にオブジェクトしか受け入れないものもあるからである。

文字列にダブルクォーテーションをつけるだけで、Stringオブジェクトになるものもある。配列で、要素のデータがわかっている場合に、newが不要だったのに似ている。

 Javaには、
  J2EE - Java2 Platform, Enterprise Edition - サーバ・アプリケーション向け 
  J2SE - Java2 Platform, Standard Edition - デスクトップ・アプリケーション向け
  J2ME - Java2 Platform, Micro Edition - モバイル・アプリケーション向け 
 と3通りある。

サーバ上で動かすエンタープライズ版、ユーザマシーン(クライアント)で動くStandard版、携帯や家電機器でマイクロ版ということだが、ここでは、J2SEを使う。その中でも、mainメソッドを持つ、アブリケーションソフトを作成するものについて、各種例題で基本的なことをみてきた。これから、インターネット上で動くアプレットやメニューやボタンなどのGUI(Graphic User Interface)もつけるため、eventパッケージやswingクラスをやっていこう。

現実のアプリケーションでは、入、出力とも大量になることが多いから、ファイルを使うのが普通。ユーザとの対話もGUIであろう。コマンドライン引数は昔からの流れを引き継いだものであろうが、入門用にはいいし、デバッグにも使うのだろう。

ページ独自カウント