第03回 Java文法の概要

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)を参照する。