Javaはどのように書く
Javaのプログラムはクラスファイル(作り方については以下参照)がメッセージをやり取りしあうことで動作します。
これはアプレットや、サーバアプリケーションに関係なく共通です。また、一つのアプレット、アプリケーションが一つのクラスファイルで構成されているとは限らず、複数のクラスファイルから構成されている場合も少なくありません。(というかそれが圧倒的です)
Javaプログラムを作成するには、まず最初にワープロやエディタ等でソースコード(ソースファイル)を作成します。これはプログラムの動作内容を記述した普通のテキストです。次に、この作成したソースファイルを Javaコンパイラ( javac )という専用ソフトを用いてクラスファイルへの変換( コンパイル )操作を行い、実際に実行出来る形式のJavaプログラムを作成します。
クラスファイルについて
クラスを作るには、以下のように記述します。
修飾子 class クラス名 {
・・・内容を定義・・・
}
[ classキーワードに指定できる修飾子 ]
| 修飾子 |
動作 |
| public |
全ての場所からアクセス可能。 |
| 記述なし |
何も指定しない場合はパッケージ・アクセスとも言われ、 同じパッケージに属するクラス内からしかアクセスできない。 |
| abstract |
抽象クラスと呼ばれ、このクラスをインスタンス化できない。 |
| final |
拡張できないクラス。 |
|
publicをつける場合は、他からのアクセス制限をしたくないとき時に使います。アクセス制限をしたい時は、publicという修飾子は使用しません。クラス修飾子publicがないクラスは、同じファイル内で宣言されたものだけが使用可能です。
また、一つのファイルに複数のクラスを定義することも可能ですが、一つのファイルに public修飾子を記述したクラスは一つしか記述できません。以下のコードは一つのファイルに複数の publicクラスが存在するためコンパイルエラーとなります。
[ Example02_01.java]
public class Example02_01{}
public class Example02_02{}
なぜ1ファイル内にPublicクラスが1つしか定義できないかというと、Javaのコンパイラがコンパイルする段階で必要なクラスが見つからないときにファイル名を見て、必要なクラスがそこに定義されているか判断するからです。
たとえば、クラスAでクラスBを利用していたときに、B.classというファイルが見つからない場合、コンパイラは、B.javaファイルを見つけコンパイルしようとします。
どうしてもPublicなクラスを複数作りたい時は、ファイルを分けて記述すれば問題はありません。クラス自体はとくに、アクセス制限する必要はないので、すべてPublicでもいいと思います。
publicなクラスでなければ、1ファイル内にいくつでも定義することができます。が、1ファイルに1クラスといった構成の方が編集しやすく、一目でどのファイルにどのクラスかがわかるので、アクセス制限も関係することなので一概には言えませんが、特に問題がなければ1ファイル1クラスが一般的です。
Javaの全般的な文法
セミコロン
Javaでは文(ステートメント)の末尾には必ずセミコロン [ ; ] を付ける必要があります。セミコロン [ ; ]を付けるまでは一行とみなされますので、ステートメントを複数行に改行して記述することも可能です。
// セミコロンがないのでコンパイルエラー
System.out.println("出力メッセージ")
// 複数行に分かれていますが、上のコードと下のコードは同じ動作をします
System.out.println(strMsgA + strMsgB + strMsgC + strMsgD + strMsgE + strMsgF + strMsgG);
System.out.println(strMsgA +
strMsgB +
strMsgC +
strMsgD +
strMsgE +
strMsgF +
strMsgG);
大文字小文字
Javaでは大文字、小文字は異なる文字として区別して扱われます。つまり System.out.printlnと system.out.printlnでは全く違った事になります。
System.out.println("Hello World!!"); // 正
system.out.println("Hello World!!"); // 誤 ( SystemのsSが小文字 )
コメント
Javaでのコメントは [ // ] から始まるものと [ /* 〜 */ ] で囲むもの、JavaDocで使用する [ /** 〜 */ ] で囲むものの合計三つあります。今回は先の二種類について、コメントの有効範囲を見ていきましょう。
//を使用する行末までのコメント
System.out.println("Hello World!!"); // ここからコメント行末まではコメント文です。
ここはもうコメント文ではありません!!エラーになります。
// この行はすべてコメントになります!!
/* */を使用する複数行に及ぶコメント
/* この行はコメント行です
この行もコメント行になります*/
System.out.println("Hello World!!");
基本データ型
Javaで使用できる変数には大きく分けて、 基本データ型(プリミティブ型)と、 参照型(オブジェクト型)の 2つの型があります。 参照型は後述するとして、今回は基本となる 8つの基本データ型について、それぞれの特徴を見ていきましょう。
コード内で基本データ型は全て小文字で記述されます。Javaでは、基本データ型のサイズはプラットフォーム依存ではなく、どのプラットフォームでも不変なため移植性が確保されています。
| 変数型名 |
最小値 |
最大値 |
代入可能な値 |
| byte |
-127 |
128 |
整数 |
| short |
-32768 |
32767 |
整数 |
| int |
-2147483648 |
2147483647 |
整数 |
| long |
-9223372036854775808 |
9223372036854775807 |
整数 |
| float |
1.4013e-45(精度) |
3.40282e38(精度) |
小数 |
| double |
0(精度) |
1.79769e308(精度) |
小数 |
| char |
0 |
256 |
文字、unicode、整数 |
| boolean |
- |
- |
真/偽 |
|
整数型
byte型は名前そのままで、1バイトの範囲の値を扱いたいときに使用します。short、int、longは見ていただければ分かりますが、扱える数値の長さが異なります。ほとんどの場合 int型で事足りますが、大きい値を扱いたいときは long型を使います。
たとえば以下の数値は int型でも扱えますし当然 long型でも扱えます。
12345
しかし以下の数値はint型の範囲を超えてしまっているので、int型では扱えません。
12345678901
この数値を long型として扱う場合には明示的に long型であると指定する必要があります。どうするかというと、以下のように数値の最後に 「 L」 とつけます。最後のLをつけないとコンパイルで値が大きすぎるといわれてエラーとなってしまいます。
( Javaでは何指定していない数値は int型として扱われてしまうことになります。)
long l = 12345678901L;
浮動小数点型
小数点以下の数値を扱う場合には、float、doubleなどの浮動小数点型を使用します。上記の表を見ると分かるとおり、float型よりも double型の方がより小さい値を扱えるため精度が高くなります。
整数を明示的に指定しない場合 int型として扱われると前述しましたが、浮動小数点型は明示的に指定しない限り double型として解釈されます。 float型として扱いたい場合は数字の最後に「 F 」を付け、明示的にfloat型であると指定する必要があります。
float f = 123.456F;
文字型
文字型はシングルコーテーション「 ' 」で囲んだ一文字を保持することが出来ます。
char chr1 = 'a';
また Javaでは Unicodeが採用されているため、全角文字も char型に格納することが出来ます。
char chr1 = 'あ';
変数の型変換
型変換とは、上記で説明した各型から別の型へ変換することを言います。型変換には、Java実行環境により暗黙的に変換される型変換と、プログラマが意識的に変換を行うキャストと呼ばれる変換があります。
Javaではユーザが変数に格納しているデータが知らないうちに損なわれないように考慮されています。つまり、より大きな型の変数やオブジェクトへの変換は認めますが、逆への変換はデータが損なわれる可能性があるため回避しようとします。このような場合に使用するのが「型キャスト」の仕組みになります。
暗黙的な型変換
基本データ型の型変換は、Java実行環境がデータ格納領域がより広い型への変換を要求した時に、暗黙的な型変換が行われます。 ある基本データ型の変数を、別の基本データ型の変数に代入する際に型変換が行われています。 これらの変換は闇雲に行われているのではなく上記ルールに従います。
※メソッドを呼び出す際、呼び出すメソッドの引数の型に要求されている型と異なる型を指定した場合も暗黙的な型変換が行われます。
【型変換が行われる例】
int x = 10;
double y;
y = x;
変数 x(int型)を、変数 y(double型) に代入する時に暗黙的な型変換が行われます。
int型の変数xがdouble型に変換された後に代入が行われますが、変換ルールに沿っているため、問題ありません。
【型変換が行われない例】
int x = 10;
short y;
y = x;
変数 x (int型)を、変数 y (short型)に代入することはできません。
int型の変数 x が short型に自動変換されることはないため、実行結果はコンパイルエラーとなります。
※型変換は SJC-P の試験で何問かは出てきますので受験する方はしっかり覚えておきましょう。
キャスト
キャストとはJava実行環境が暗黙的に行う変換ではなく、プログラマが意識的に行う変換処理です。
暗黙的な型変換では変数の変換処理を行えない場合に、このキャストを使用します。 キャストは以下のように変換したい型を( )で囲み、変換元の変数の前に指定することにより行えます。
(変換したい型)変換元の変数;
キャストの必要のない場合は、【 型変換のルール 】にも書きましたが、さらに簡単にまとめると以下のようになります。 ある型に対して右側にある型はそのまま代入できます。 例えば float型には long, int, short, byte型がキャストしないで代入することが出来ます。
基本データ型のキャスト
基本データ型では、boolean 型以外の基本型の変数を、他の boolean型以外の基本型の変数にキャストできます。 キャストはデータ格納領域が広くなるキャストでも、データ格納領域が狭くなるキャストでもかまいません。
データ格納領域が広くなるキャストの場合は、キャストを明示的に指定しなくても、必要な場合には、暗黙的な型変換が行われます。
※ boolean 型は他のどの基本データ型変へのキャストはできません。
int x = 10;
byte y = (byte)x;
//int型の変数xをbyte型にキャストして、変数yに代入しています。
//型変換ではint型の変数xをbyte型に変換することはできません。
参照型のキャスト
参照型のキャストは基本型のキャストと異なり、コンパイル時のルールと実行時のルールを意識する必要があります。 何故かと言うと、参照型のデータには実体ではなく、実体が保存されている位置を表すアドレス情報が併せて格納されているためです。
コンパイラは参照型の変数が参照する実体がどのようなものかは、コンパイルする時点ではわかりません。 そのため、コンパイル時にエラーが出なくても、実行する時点で初めて実行時のルールにそぐわないと判断され、エラーを生成します。
SuperClassAはSubClassA1のスーパークラスとします。
SuperClassAはSubClassA2のスーパークラスとします。
SubClassA1 a1 = new SubClassA1( );
SuperClassA a;
SubClassA2 a2;
//変数aと変数a1にはクラスの継承関係があるため、コンパイルは成功します。
//また、実体においても、変数aは変数a1のスーパークラスであるため、
//【実行時のキャストのルール】に合致し、 実行も成功します。
a = (SuperClassA)a1; //@コンパイルOK、実行OK
//変数a2と変数aにはクラスの継承関係があるため、コンパイルは成功します。
//実体においては、変数aの実体は@で代入が行われているためSubClassA1です。
//変数a2の実体はSubClassA2です。
//SubClassA2はSubClassA1のスーパークラスではないため、
//【実行時のキャストのルール】に合致せず、例外が返されます。
a2 = (SubClassA2)a; //AコンパイルOK、実行NG
|