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