Unicode のはじめの 256 文字は Latin-1 文字セットであり、 Latin-1 文字セットの初めの 128 文字は ASCII 文字セットとほぼ同じです。
java では空白文字(スペース、タブ、改行、フォームフィード)は、 トークンや文字列リテラルを分離するものとしての意味しかありません。
機 能 | 予 約 語 |
---|---|
基本型 | boolean,char,byte,short,int,long,float,double,void |
式 | new,this,super |
分岐 | if,else,switch,case,break,default |
繰り返し | for,continue,do,while |
制御 | return,throw |
ガード文 | synchronized,try,catch,finally |
宣言 | static,abstract,final,private,protected,public,native,transient ,volatile |
クラス | class,throws |
演算子 | instanceof |
その他 | extends,interface,implements,package,import |
基本型 | 内 容 | 値の範囲 | 対応するクラス java.lang |
---|---|---|---|
boolean | 真偽値 | true,false | Boolean |
char | 16 ビット Unicode 1.1 規格の文字 | 0~65535 | Character |
byte | 8 ビット符号付き整数 | -128~127 | Byte |
short | 16 ビット符号付き整数 | -32768~32767 | Short |
int | 32 ビット符号付き整数 | -2147483648~2147483647 | Integer |
long | 64 ビット符号付き整数 | -9223372036854775808~ 9223372036854775807 |
Long |
float | 32 ビット浮動小数点数 (IEEE754-1985) | -3.4E38~3.4E38,NaN | Float |
double | 64 ビット浮動小数点数 (IEEE754-1985) | 1-1.7E308~1.7E308,NaN | Double |
基本型には、java.lang パッケージに対応する
ラッパクラスがあります。
ラッパが便利なのは、ほとんどの java
ユーティリティ・クラスはオブジェクトを使うようにできているからです。
基本型の変数は、java ではオブジェクトではありませんが、 オブジェクトに変換するための簡単な方法が、 ラッパクラスで提供されているので便利です。
short と byte の値は、評価前に int に変換されます。 これらは値の保存のみに使われ、これらを使って演算することはできません。
float と double には、NaN(Not a Number)がありますが、
これは数でない数という意味で、
浮動小数点数が取り得る値であっても数学的に定義できない演算、
たとえば0を0で割る演算などの結果を表します。
NaN に対するすべての関係演算子および等値演算子は false を返します。 値が NaN であるか否かを判定するためには、その型に用意されている NaN 判定メソッド (Float.isNaN(float),XX.isNaN()等)を使います。 |
int からオブジェクト Integer へ、オブジェクト Integer から int への Integer クラスのメソッドを使った変換例を示します。
Integer mango; int j,i = 42; mango = new Integer(i); j = mango.intValue();
リテラルとは、コンパイル時に与えられる値のことで、
定数ともいいます。
null,true,false を識別子としては使えません。
タ イ プ | リ テ ラ ル 値 の 例 | 備考 |
---|---|---|
オブジェクト参照 | null | |
真偽値 | true,false | 左記2値のみ |
整数値 | 29,035,0x1d,0X1D 等 | 10 進,8 進,16 進数表記可能 |
浮動小数点数 | 18.,1.8e1,.18e2,0f,0d,1F,1D 等 | f,F で float 定数と指定しない場合は double 扱い |
文字値 | 'Q',\',\377 等 | 8 進数の文字定数は3桁以下で \377 を超えてはならない |
文字列値 | "String","I don\'t know." 等 | |
定数とはリテラルのことで、 プログラムが終わるまで演算などによって変更されない値のことです。
2つの理由で名前付き定数を使うことをお奨めします。
java では変数を static かつ final と宣言 することで、名前付き定数を定義します。
class CircleStuff { static final double PI = 3.1416; }
アクセス修飾子 タイプ 識別子
基本型の場合は、宣言によって値を保持する場所が確保されます。 これに対してオブジェクト型の場合は、宣言によってオブジェクトへの参照を 保持する場所のみが確保されます。 宣言しただけでは、オブジェクトそのものは確保されません。 つまりc でいうポインタが確保されます。 java ではそれを参照といいます。
クラスのデータフィールドには、初期値が設定されます。 生成時に初期値を明示的に設定しなかった場合には、デフォルトのゼロビット値 、すなわち型によって 0,null,false,0.0 などが設定されます。
これは、メソッド内で宣言される基本型の変数とは対照的です。 メソッド内で宣言される基本型の変数は、初期値が定義されません。 局所変数はスタックにとられますが、オブジェクトはヒープに置かれます。
java でデータをグループ化する主な方法は、クラスに入れることです。 配列をつかう方法もありますが、これもプログラマからはクラスに見えます。
java のクラスにものを入れるのは便利です。言語の基本型以外はすべてが オブジェクトです。
演 算 子 種 別 | 演 算 子 |
---|---|
後置演算子 | [] . (params) expr++ expr-- |
単項演算子 | ++expr --expr +expr -expr ~ ! |
生成とキャスト演算子 | new (type)expr |
積除、剰余演算子 | * / % |
和減演算子 | + - |
シフト演算子 | << >> >>> |
関係演算子 | < > >= <= instanceof |
等値演算子 | == != |
ビット毎の論理積(AND) | & |
ビット毎の排他的論理和(XOR) | ^ |
ビット毎の論理和(OR) | | |
論理和 | && |
論理積 | || |
条件演算子 | ?: |
代入演算子 | = += -= *= /= %= >>= <<= >>>= &= ^= |= |
代入演算子以外のすべての二項演算子は左結合的です。 代入演算子のみ右結合的です。
instanceof 演算子は、 オブジェクトが指定の型であるか否かを調べるもので、 そうである場合は、true が返されます。
注意 |
>>> 演算子は右に指定ビットシフトしたあと、上位ビットを0で埋めるものです。 short と byte の場合は、シフト前に int に変換し、その後この演算が行われ、 結果を short または byte に戻します。従って以下の結果は b は 0 でなく -1 です。
byte b = -1; b >>>=10; |
package 文(必要なら) | ||
import 文(必要なら) | ||
クラス | アクセス修飾子 class クラス名 { | クラスの宣言 |
フィールド | 変数宣言 | |
コンストラクタ(引数){ .. } | オブジェクトの初期化 | |
メソッド(引数){ .. } | 処理部 | |
} | クラスの終わり |
簡単なプログラムを書いて、動かしてみましょう。
setenv CLASSPATH .:$CLASSPATH
class HelloWorld { public static void main(String[] args) { System.out.println("Hello World !!"); } }
> javac HelloWorld.java > java HelloWorld Hello World !!
説明 |
上記プログラムについて簡単に説明します。
main() のシグネチャを見てみましょう。
public static void main(String[] args) {}
アクセス修飾子が public かつ static です。すなわち、どこからでも見えて(public)
アクセス修飾子を取り除くと、実際のメソッドは以下のようになります。
void main(String[] args) {}
これは、c と同じで main という名前の戻り値を持たないメソッド (void) を
定義しています。
java プログラムの main は、 特殊なメソッドでアプリケーション・プログラムとして実行した場合に、 はじめに呼ばれます。 args は実行開始時にコマンド行で入れた引数が渡されますが、 args[0] はcのようにプログラム自身の名前ではなく、 プログラムに渡された初めの引数です。 String は java のクラスで c の char の配列に似ています。 System.out.println は、System クラスの out という PrintStream の println メソッドで、それを使って "Hello World !!" を出します。
class HelloWorld は、このクラスの名前を宣言しています。 |
1つのファイルに複数のクラスがある場合は、コンパイルすると、 複数のクラス・ファイルができます。
宣言文 | 型 変数名; |
選択文 | if (式) 文 [else 文] |
switch (式) { case XX: 文 break;[default:文 break;] } | |
繰り返し文 | for (初期値;テスト;インクリメント) { 文 } |
while (式) { 文 } | |
do { 文 } while (式); | |
continue [識別子]; | |
break [識別子]; | |
制御移行文 | return 式; |
ガード文(スレッド、例外) | try ブロック catch(例外) ブロック [finally ブロック] |
ブロックとは、中括弧で囲まれた実行文の集合です。
メソッドは、実行中にエラーを検出すると例外を送出します。 例外はメソッド呼び出しのスタックを遡り、 例外を処理して本処理を継続するコードを探します。 ユーザが処理を規定しなかった例外は、 java のデフォルト処理ルーチンによって処理されます。 それはエラーを報告し実行を中止します。
パッケージ名とクラス名をあわせたものが、そのクラスのフルネームになります。
パッケージのファイル形式は zip(jar) で Windows の ZIP と同じです。
java ツールの1つである jar でも作れます。
import には、2つの書き方があります。
ただし、java の標準パッケージである java.lang は指定しなくても、 常にコンパイル時に読みこまれます。
java.util の Date クラスを import 文を使わない場合と使う場合の例を示します。
class Date1 { public static void main(String[] args) { java.util.Date now = new java.util.Date(); System.out.println(now); } }
import java.util.Date; class Date1 { public static void main(String[] args) { Date now = new Date(); System.out.println(now); } }
インタフェース中にデータを宣言すると final となり、それらは定数値です。
メソッドを宣言するときはシグネチャを指定します。
後でクラスを実装するとき、それらのメソッドも実装しなければなりません。
1つのインタフェースを複数のクラスで実装してもいいし、 1つのクラスで複数のインタフェースを実装することもできます。 またインタフェースを extends で拡張することもできます。
interface FlyingMachine { static final int MAX_RPM = 60000; int navigate(Point from, Point to); void land(); void takeoff(double fuel); }
class Hellcopter implemets FlyingMachine { double fueltank; int engine_rpm; int rotate; public int navigate(Point from, Point to) { : } public void land() { for (engine_rpm=MAX_RPM; engine_rpm > 0; engine_rpm--) { : } } public void takeoff(double fuel) { fueltank += fuel; for (engine_rpm=0; engine_rpm < MAX_RPM; engine_rpm++) { : } } void hover() { : } }
java のメソッドの型と引数の型を列挙したものを
シグネチャといいます。
以下の <method_type_descriptor> がシグネチャの定義です。
<method_type_descriptor> ::= (<argument_type>)<return_type> <argument_type> ::= <field_type> <return_type> ::= <field_type> <field_type> ::= <base_type>|<object_type>|<array_type> <base_type> ::= B|C|D|F|I|J|S|Z|V <object_type> ::= L<full_classname>; <array_type> ::= [<data_type>
ただし、<base_type> のシンボルは以下のとおりです。
B:byte C:char D:double F:float I:int J:long S:short Z:boolean V:void
例えば String クラスの substring メソッドは、以下のように表されます。
substring (I)Ljava/lang/String; substring (II)Ljava/lang/String;
java Core API の java.lang.String の substring を見てみましょう。 |
まとめ |
変数宣言 | アクセス修飾子 | タイプ | 変数名 |
---|---|---|---|
メソッド宣言 | アクセス修飾子 | タイプ | メソッド名 |
package 文(必要なら) | ||
import 文(必要なら) | ||
クラス | アクセス修飾子 class クラス名 [ throws 例外 ] { | クラスの宣言 |
フィールド | 変数宣言 | |
コンストラクタ(引数){ .. } | オブジェクトの初期化 | |
メソッド(引数){ .. } | 処理部 | |
} | クラスの終わり |
宣言文 | 型 変数名; |
選択文 | if (式) 文 [else 文] |
switch (式) 文 | |
繰り返し文 | for (初期値;テスト;インクリメント) 文 |
while (式) 文 | |
do 文 while (式) | |
continue [識別子]; | |
break [識別子]; | |
制御移行文 | return 式; |
ガード文(スレッド、例外) | try ブロック catch(例外) ブロック [finally ブロック] |