Java言語 第3回 Javaの文法 知的情報システム工学科 久保川 淳司 [email protected] 変数と定数 変数とデータ型 C/C++と同様に変数を宣言し,利用することができる。利用で きる基本データ型は, boolean char byte short int long float double 1bit真偽値 16bit Unicode 8bit符号付整数 16bit符号付整数 32bit符号付整数 64bit符号付整数 32bit浮動小数点数 64bit浮動小数点数 変数の宣言,初期化はC/C++と同じ true/false ¥u0000~¥uFFFF -128~127 -32768~32767 -231~231-1 -263~263-1 単精度実数 倍精度実数 型の詳細 boolean型 true/falseのどちらかをとる。整数型との互換性は無い。 boolean b; b = true; b = 0; // エラー 整数型 byte, short, int, long型は整数型であるが,long型の整数定 数は最後にLを追加する必要がある。 浮動小数点型 floatは32bit(有効数字6桁), doubleは64bit(有効数字15桁) を使って表現する。 Javaでは特に指定しない場合は,double型を用いると便利。 String型 charは文字型(1文字)であり,文字列はString型(Stringクラ ス)を用いると便利である。 String ss; String gg = "aaaa"; ss = "bbbb"; ss = ss + "cccc"; //文字列の代入 //ssは "bbbbcccc"となる。 参照型 「参照」とはデータの置かれているアドレスを意味する。 C++にも同様な機能(&を使って宣言) 配列の宣言方法 int a[]; a = new int[10]; int 同じ意味 a[] = new int[10]; 配列変数名aは「あるアドレス」を保持できる機能を持っているだ けの参照型である。 new演算子でint型変数10個分の領域を何処かに確保し,その 先頭番地を変数aに設定している。 よく使われる演算子 算術演算子 よく使われる算術演算子 + * / % 加算 減算 乗算 除算 剰余 a a a a a = = = = = b b b b b + c; - c; * c; / c; % c; 整数と浮動小数点数の混合演算 基本的には表現能力の高い方に合わせて演算が行われる。 潜在的なエラーを避けるためにはキャスト演算子を利用して明示 的に型変換を行うほうが良い。 算術演算子の優先順位 * / % の方が + - より先に処理される。 関係演算子と論理演算子 関係演算子 < <= > >= 小さい 以下 大きい 以上 if if if if ( ( ( ( a a a a < 10 ) <= 10 ) > 10 ) >= 10 ) 等価演算子 == != 等しい 等しくない if ( a == 10 ) if ( a != 10 ) 論理演算子 || && ! または(OR) かつ(AND) 否定 if ( a <= 10 || a >= 20 ) if ( a >= 10 && a <= 20 ) if ( ! (a > 10) ) String型の等価演算 String型を==で比較する場合には注意が必要。 Sting s1 = "aaaa", s2 = "bbbb"; s1とs2を比較する場合, if (s1 == s2) はs1が格納されているアドレスとs2が格納されているアドレスが 等しいかどうかを比較する。 s1の文字列実体とs2の文字列実体が等しいかどうかを比較す る場合には,以下を使用する。 if ( s1.equals(s2) ) equals()はStringクラスのメソッドである。 その他の演算子 その他の演算子 ~ & | ^ << >> >>> ?: new ビット反転 ビット毎の論理積(AND) ビット毎の論理和(OR) ビット毎の排他論理和(XOR) 左シフト 右シフト(空いた上位ビットには符号ビットが入る) 論理右シフト(空いた上位ビットに0が入る) 条件演算子 オブジェクト生成 制御文 if文 if文の書式はC/C++とほとんど同じ if (条件式) { 文1; } else { 文2; } //条件式が真の場合実行 //条件式が偽の場合実行 条件式の結果はbooleanである必要がある。 ただし,一部注意が必要 int a = 10, b; if ( a ) b = 20; //CやC++では問題ないが, //Javaではエラーとなる。 if ( a != 0 ) b = 20; //Javaでもエラーなし for文 for文の文法は for( 初期化; 継続条件; 再設定 ) { 文; } 最初に「初期化」が実行され,「継続条件」が成立している間「文」 を実行し,「再設定」を実行する。 「初期化」「再設定」で複数の文を記述する場合は「 , 」を使う。 for文の良く使われる例は for ( i = □; i <= ■; i++ ) { 文; } iが□から■までiを一つずつ増やしながら文を実行する。 for文内での変数宣言 for文の第1項で変数宣言をすることができる。このように宣言 された変数は,そのループの中でのみ通用する。 for ( int i = 1; i <= 5 ; i++ ) {文;} for ( int a = 0, b = 5; a <= 5 ; a++, b--) { 文; } C/C++でも同様な変数宣言は可能 while文 while文の書式はC/C++とほとんど同じ while( 継続条件 ) { 文; } 継続条件の式の結果はbooleanである必要がある。 ただし,一部注意が必要 while ( --i) // iが0になるまで Javaではエラー!! while ( --i == 0 ) // JavaでもOK その他の制御文 その他の制御文もC/C++とほとんど同じであ るが,型のチェックが厳しくなっているので注 意する必要がある。 do-while文 switch - case文 break文 continue文 配列 配列の使用方法は以下のとおり, 型名 // 変数名[] = new 型名[要素数]; C/C++では 型名 変数名[要素数]; Javaでは配列の範囲チェックを行う。 int a[] = new int[10]; //a[0]~a[9]まで a[10] = 100; // 明らかに間違い この場合,コンパイル時にはエラーが出ないが実行時に以下 のエラー(例外)が発生する。 Exception in thread "main" java.lang.ArrayIndexOutOfBoundException 配列宣言のいろいろ 配列には,様々な宣言方法がある。 int a[] = new int[10]; int [] a = new int[10]; int [] a; a = new int[10]; int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; Javaでは配列宣言を行うと初期化が行われる。 boolean false 浮動小数点型 0.0 char ¥u0000 オブジェクト名 null 配列 null 整数型 0 配列の長さ情報 配列変数は長さ情報を持っており,lengthメソッドを利用して 参照することができる。 int na, nb; int a[] = {10, 20, 30, 40, 50}; int b[] = new int[10]; na = a.length; nb = b.length; 配列全体を表示するプログラム例 for ( int i = 0; i < a.length; i++ ) { System.out.println("a["+i+"]="+a[i]); } コンソール入出力 文字列の入出力の基本スタイル(1) 文字列入出力手順 1. 入力先を指定する InputStreamReaderクラス 2. それをバッファ装置(を記述したクラス)に繋ぐ BufferedReaderクラス 3. エラーが発生したときの処理を決める throws IOException IOException例外が発生したときの処理 文字列の入出力の基本スタイル(2) // JaInOut1.javaとして作成 import java.io.*; public class JaInOut1 { public static void main(String args[]) throws IOException { String ss; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader kbd = new BufferedReader(isr); ss = kbd.readLine(); System.out.println(ss); } } 文字列の入出力の基本スタイル(3) import java.io.*; java.ioパッケージに入っているクラスを利用する。 public static void main(String args[]) throws IOException { mainでIOExceptinが発生したとき,デフォルトの例外ハンドラを呼 び出すよう指定(プログラムを強制終了する)。 プログラムが強制終了しては困る場合には,例外を自分で処理する 処理を記述する必要がある。 InputStreamReader isr = new InputStreamReader(System.in); InputStreamReaderは文字列入力に使われるストリーム 文字列の入出力の基本スタイル(4) BufferedReader kbd = new BufferedReader(isr); BufferedReaderクラスはキャラクタ入力をバッファリングして, 入力効率を向上させるためのクラス ここでは,isrオブジェクト作成時に指定されたSystem.inから読 み込むことになる。 ss = kbd.readLine(); 作成されたオブジェクトkbdのメソッドreadLineを利用して読み 込む。 System.out.println(ss); Stringクラスのオブジェクトssに格納された文字列をコンソール に出力する。 文字列の連続入力 // JaInOut3.javaとして作成 import java.io.*; public class JaInOut3 { public static void main(String args[]) throws IOException { String ss; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader kbd = new BufferedReader(isr); while(( ss = kbd.readLine() ) != null) { System.out.println("ss = " + ss); } // 終了マークが入力されるとreadline()がnullを返す } } 数値の入出力 Javaで数値を入出力する2通りの方法 1. 文字列として入力し,それを数値に変換する 入力:BufferedReaderクラスを利用し,文字列として入力後, ラッパークラスで数値に変換する 出力:print()メソッド,println()メソッドを使う 従来のJavaの基本方法 2. Scannerクラスを使って数値を直接入力する(J2SE5.0で追 加) 入力:Scannerクラスを利用する 出力:printf()メソッドを使う 最新のJavaで追加された機能 → 互換性の問題が発生する恐れ 整数の入出力(文字列を整数に変換) int型のラッパークラスであるIntegerクラスのparseIntを利 用する int idt; ss = kbd.readLine(); idt = Integer.parseInt(ss); つまり, キーボード "1234" 文字列 readline() "1234" 数値 parseInt() 1234 char型にはCharacter,double型にはDoubleクラスという ラッパークラスが用意されている。 wrapper:包み紙 便利機能が集まったクラス 浮動小数点数の入出力 (文字列を不動小数点数に変換) double型のラッパークラスであるDoubleクラスを利用する。 double ddt; ss = kbd.readLine(); ddt = Double.parseDouble(ss); Integerクラス → parseInt ()メソッド Doubleクラス → parseDouble()メソッド Scannerクラスを利用した入力(1) Scannerクラスのオブジェクトを宣言 import java.util.*; Scanner sc = new Scanner(System.in); 文字列入力 String ss; ss = sc.next(); next()メソッドで文字列を入力する。 区切り文字は" "(スペース)であるので,複数のスペースで区切られ た文字列を読み込むときには,next()メソッドを何度も利用する。 → スペース区切りでなく行末まで読み込む場合にはreadLine()メ ソッドを使うか,UseDelimiter()メソッドで区切り文字を変更 Scannerクラスを利用した入力(2) 数値入力 整数の入力 int idt; idt = sc.nextInt(); 実数の入力 double ddt; ddt = sc.nextDouble(); Scannerクラス → C言語のscanfと同じような使い方 printfメソッドを利用する J2SE 5.0ではC言語のprintf関数に似たprintf()メソッドを利 用することができる。 int ddt = 100; double ff = 123.456; String ss = "abcd"; System.out.printf("%d¥n", dt); System.out.printf("%f¥n", ff); System.out.printf("%s¥n", ss); printf()メソッドはC言語のprintf関数とほとんど同じなので, 必要なときに教科書(pp. 146 - 150)を参照する。
© Copyright 2024 Paperzz