アルゴリズムとプログラミング
(Algorithms and Programming)
第12回:補足的事項
•String クラスの機能と使い方•参照型変数
•String クラスの機能と使い方•参照型変数
講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
メソッドのオーバーライドオーバーライド (override)
親クラスと子クラスのそれぞれに、メソッド名、引数、戻り値が全て同一で内容が異なるメソッドを定義すること
ひとつのクラス内に、メソッド名が同じで、引数の型及び数が異なるメソッドを定義すること
混同注意!オーバーロード (overload)
復習
メソッドのシグニチャー
メソッド名、引数の型、戻り値
メソッドを区別するための
をシグニチャー (signature) という
戻り値 メソッド名 ( 型 変数名1 , 型 変数名2, ...)
メソッドの書式
復習
クラスの配列
int a[ ] ;a = new int[10] ;
基本型 (int 型 ) の配列宣言の例
ユーザが定義したクラスでも配列を作ることが可能例) Point クラスの参照型変数を 3 個格納する配列の宣言
Point p[ ] ;p = new Point[3] ;
Point クラスが既に定義されているものとする
3 個の参照型変数を格納するp はオブジェクト参照型変数
の配列である
p にオブジェクト参照を代入する
例)p[0] = new Point(0.0, 0.0);
p[1] = new Point(0.0, 1.0);
p[2] = new Point(2.0, 3.0);
p[0] ~ p[2] の3つのオブジェクト参照変数に、それぞれ生成したインスタンスの参照を代入した
String クラス
String オブジェクトの宣言と初期化String s = "abcdefg";
String s = new String ( "Hello, Java!" );
文字列リテラルは String クラスのインスタンス
システムに組み込まれている
String クラスの各種メソッドの例
文字列の長さを得る s.length();
文字列の一部を置換する s.replace("Java"," ジャバ ");
数値を文字列に変換する int i = 1234; s = String.valueOf( i );
文字列を数値に変換する int i = Integer.valueOf( "1234" );
文字列を数値に変換する int i = Integer.valueOf( "1234" );
この他、多数のメソッドが用意されている
String s = new String ( "Hello, Java!" );
コンストラクタ
i 番目の文字を得る s.charAt ( i );(先頭文字は i=0 )
String クラスの演算子String s = new String("abc");
s = s + "def";
+ 演算子は、文字列の結合を意味する
a b c
s = 先頭メモリ番地A
a b c d e f
a b c d e f
s = 先頭メモリ番地B
元のインスタンスとは別のメモリ番地に新たなインスタンスが生成される
インスタンスの内容を変更するのではなく、新たなインスタンスを生成し、古いのを捨てている
String の配列例1)String a[] ;
a = new String[3];
a[0] = "abcd";
a[1] = "efgh";
a[2] = "ijkl";
複数の文字列を格納する際に使用する
例2) main() メソッドの引数文字列
public static void main(String[] args) {
• args は String クラスの参照型変数を格納する配列• 確保される配列の個数は、プログラムを実行する際に与えられる引数の個数に等しい
例 )
java Sample 1.0 abcd
プログラム名 引数 1 引数 2
"1.0" →args[0]
"abcd"→args[1]
args.length は 2
String クラスの特徴• String オブジェクトは読み出しのみ可能、
変更不可能• 演算やメソッドにより変更しているように
見えても、実は元のインスタンスを捨てて、新しいインスタンスに差し替えている
• 基本型ではないがシステムレベルでサポートされており、比較的軽い
• String オブジェクトは読み出しのみ可能、変更不可能
• 演算やメソッドにより変更しているように見えても、実は元のインスタンスを捨てて、新しいインスタンスに差し替えている
• 基本型ではないがシステムレベルでサポートされており、比較的軽い
変更可能な文字列を提供するのはStringBuffer クラス
参照型変数
使用法:配列やクラスのインスタンスの参照を格納する
参照型変数に格納されるデータは?: インスタンスの格納されているメモリ番地(アドレス) が格納されており、中身自身が格納されているわけ ではない
注意点:インスタンスの中身(内容)の比較を行う際に参照型変数同士の比較をしても意味がない。では、どうすればよいか?
?
参照型変数の比較class X { int x; X(int a){x=a;}}
X o1 = new X( 2 );X o2 = new X( 2 );
o1 と o2 は全く別のインスタンスo1 と o2 の中身の値は全く同じo1 と o2 の中身の比較を行う文?
o1 と o2 の中身の比較を行う文?
下記の論理式は真か、偽か? o1 == o2
答え: 偽 (false)
理由: o1 と o2 は別々のインスタンスであり、格納されるメモリ番地は異なるから。
内容の比較を行うメソッドo1.equals(o2) == true
内容の比較を行うメソッドo1.equals(o2) == true
equals() メソッドは、 Object クラスで定義され継承されている
オブジェクトの複製String s1 = "abc";
String s2 ;
問題 : s1 とは別のインスタンスとして、 s2 に s1の内容のコピーを作りたい。どう書けばよいか?
1. s2 = s1;
2. s2 = new String(s1);
s2 は s1 と同じインスタンスを指し示すだけで中身はコピーされない
コンストラクタで別インスタンスを生成し、 s1 の内容で初期化
a b c
s1 s2
a b c a b c
s1s2
まとめ
•String クラスの特徴と使い方•参照型変数に関する注意事項
•String クラスの特徴と使い方•参照型変数に関する注意事項
今後の展望• 本講義で Java の基本文法はほぼカバー• カバーしきれなかった点
– インターフェース– 例外処理– マルチスレッド
• 各種クラスライブラリの活用– ラッパークラス– String クラス– ファイル入出力用クラス..等
さらに高度なクラスライブラリへ
今後の展望• コンピュータ言語の文法自体は底が浅い• しかし、アルゴリズムは奥が深い• 本講義で身に着けた Java 言語を武器に、ア
ルゴリズムの勉強を自ら進めることが可能• また、世に出ている優れたプログラムを読
んで、基本構造の設計手法やコーディングテクニック等を学ぶことで、実用的なプログラミング能力を身につけることもできる
• コンピュータ言語の文法自体は底が浅い• しかし、アルゴリズムは奥が深い• 本講義で身に着けた Java 言語を武器に、ア
ルゴリズムの勉強を自ら進めることが可能• また、世に出ている優れたプログラムを読
んで、基本構造の設計手法やコーディングテクニック等を学ぶことで、実用的なプログラミング能力を身につけることもできる
IT技術を自在に操るスキルと洞察力