とりあえず基本ですね
1: public class HelloWorld{ 2: public static void main( String[] arg ){ 3: System.out.println( "Hello World" ); 4: } 5: }
実行結果
Hello World
1行目 | クラスを宣言しますが,クラス名はファイル名と同一にします. |
違う場合はエラーになり,コンパイラに怒られてしまいます. | |
2行目 | プログラムを実行したときに,まずこのmainが実行されます. |
前後についているpublic static voidやString[] argは今は無視して構いません. | |
3行目 | 画面に「Hello World」を出力します. |
System.out.printlnというのが画面に改行付きで文字列を出力する機能(関数,もしくはメソッドと呼びます)です. | |
Javaがこのメソッドを用意しているので,括弧の中に出力したい文字列を代入する(引数を与えるといいます)だけで機能が使えます. | |
正確にはメソッドはprintlnで,System.outはそのメソッドがどこにあるか(どのライブラリに含まれているか)を指しています. |
基本その2。キーボードで入力した文字をそのまま出力するぞ。
1: import java.io.*; 2: public class InputFromKeyBoard{ 3: public static void main( String[] arg ){ 4: String strTemp = new String(); 5: try{ 6: System.out.println("なんか文字入力してちょ"); 7: BufferedReader br = new BufferedReader( new InputStreamReader( System.in )); 8: strTemp = br.readLine(); 9: }catch( Exception e ){ 10: e.printStackTrace(); 11: } 12: System.out.println( "入力された文字は「" + strTemp + "」"); 13: } 14: }
実行結果 これはコンソールに出る
なんか文字入力してちょ hoge ←適当に文字を入力 入力された文字は「hoge」
1行目 | ライブラリを使うときはimport文でライブラリを宣言します |
ライブラリ=機能をまとめた物と考えて当座は大丈夫です. | |
4行目 | 文字列を扱うために,String型(クラス)でstrTemp(インスタンス)を宣言します. |
=の後のnew演算子で,これが新しいインスタンスだということを表します. | |
その後のString()は,strTempに与える初期設定です. | |
これはクラスごとにいろいろな物があります. | |
5行目 | エラーが起きたときに,try~catchでそれを捉える事ができます. |
7行目 | キーボードから読み込むためのインスタンスを作ります. |
BufferdReaderは入力をシステムである程度貯めて(バッファして)読み込むクラスです. | |
=以下,BufferedReaderは読み込みのストリーム(後述)を必要とするので,初期化の際に与えてやります. | |
読み込みストリームはSystemのin(デフォルトではキーボード)から得ます. | |
8行目 | strTempに先ほどのbrからreadLineメソッドを用いて1行読み込みます |
9行目 | tryからココまでの間にエラーが起きればeに情報が代入され,処理が括弧の中に移ります. |
10行目 | eの中に含まれる情報から,何処でエラーが起こったのかを表示します. |
12行目 | 入力した文字列をそのまま表示します |
ちょっとアプリケーションっぽくなってくる
1: import java.io.*; 2: import javax.swing.*; 3: 4: public class SwingTest{ 5: public static void main( String[] arg ){ 6: String strTemp = new String(); 7: try{ 8: BufferedReader br = new BufferedReader( new InputStreamReader( System.in )); 9: strTemp = br.readLine(); 10: }catch( Exception e ){ 11: e.printStackTrace(); 12: } 13: JFrame frm = new JFrame( "SwingTest" ); 14: JTextArea txt = new JTextArea( strTemp ); 15: frm.getContentPane().add( txt ); 16: frm.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 17: frm.pack(); 18: frm.setVisible( true ); 19: } 20: }
2行目 | SwingというGUIの部品が詰まったライブラリを使います. |
13行目 | まず表示される枠,JFrameを作ります.引数で与えてるのはフレームの上部に表示されるタイトル. |
14行目 | テキストの表示用に,入出力が可能なTextAreaを用意します.引数はキーボードから入力された文字列. |
15行目 | フレームにテキスト枠を追加 |
16行目 | フレームを閉じたときのふるまい.今回はJFrameで用意されているEXIT_ON_CLOSE(閉じられたら終了)を使用. |
17行目 | フレームを適切なサイズに変更. |
18行目 | フレームの表示 |
WindowsのAPIだとめんどくさくて仕方のないGUIの表示がJavaだとこんなに簡単.
宣言を入れてもわずか7行で済んでしまう.
GUIアプリを作りたいけどAPIまんどくせ^^;っていう時は「OSに依存しないんでwwwwwwww」を切り札にJava使っちゃうのもアリだと思う.
高速演算は向いてないし,Windowsに限れば.NET FrameWork使えばGUIもわりと楽なんだけどね.
Javaではセミコロン( ; )にぶつかるまでを1文としています.
そのため
hoge foo = bar;
と
hoge foo =bar;
は意味的に同じです.
また,中括弧{}で囲まれたブロックを1文として扱います.
hoge; foo;
だと2文ですが,
{ hoge; foo; }
だと1文という扱いになります.
if( 条件式 ) 条件を満たしたときに実行される文 else それ以外でのときに実行される文
条件式の結果が真(結果が0以外になった)なら直後の文を実行 偽ならelse文を実行
while(条件式) 条件を満たす間実行される文
条件式を満たしている間,whileの次の文を実行する
for( 初期化式; 繰り返し条件; 条件判定の前に実行される文) 繰り返し条件を満たす間実行される文
for文が実行されるとき,最初に1度初期化式が実行されます.
そして繰り返し条件を満たす間,次の文が繰り返されます.
for文3つめのパラメータは,命令実行後,繰り返し条件の判定の前に実行されます.
例)
for( i = 0; i < 10; i ++ )
この場合,for文が実行されるときにiに0を代入し,iが10より小さい間次の命令が実行されます.
命令が終わった後でiを+1することで,結果的に10回の繰り返しとなるわけです.
数学でいうnの様に,値を代入できる記号のようなもの,と捉えていいかもしれません.
変「数」とついていますが,数字以外にも文字やフラグの場合もあります.
しかし,数を代入する変数には数を,文字を代入する変数には文字を入れなくてはいけません.
たとえば上記のサンプルコードで画面に文字列を出力する際,println( "hoge" )と書いたらどうなるでしょうか?
この場合プログラムに hoge を出力しろ と書かれているのでつねに hoge が出力されることになります.
サンプルコードではString型の変数を引数に与えることで,「プログラム作成時に決めた文字」ではなく,「プログラム実行時に決めた文字」を出力しています.
このように,「値が固定されていない場合に,代わりに使う物」みたいな感じです.
もちろん「変数は代入できる」ものですから,メソッドの結果を受け取ることも出来ます.
簡単に言うと、「変数やらそれをいじくる機能やらを一まとめにしたもの」です。実際に使ってみたらわかる。
C(C++でなくてよい)がわかることを前提として書いてます。
クラスを使ってみて感じをつかみましょう。 int型の変数をより便利にしたようなクラス、Integerを使ってみます。
public class test{ public static void main(String[] args){ Integer a = new Integer(10); System.out.println(a.intValue()); } }
3行目
Integer a = new Integer(10);
まず左辺でInteger型の変数aを作成し、右辺にあるものをaに代入します。
new Class-name(あれば引数)
とすると、Class-name型の変数に代入できる「実体」(インスタンスという)が作られます。 (Integerクラスというものの作り方がわかっていて、new Integer(10)とすると値を10にしたIntegerを作る といった感じ。)
5行目
a.intValue();
はaの持っている値を返す関数のようなもの(メソッドという)です。
変数名.メソッド名(あれば引数)
とすることでその変数のクラス(aならばInteger)の持っているメソッド(ここではaの持っている値を返すという動作)を呼び出すことができます。
次はStringクラスを使ってみます。
public class test2{ public static void main(String[] args){ String str = new String("Vipper!!"); // Vipper!!という文字列を持ったStringクラスのインスタンスを作成 System.out.println(str); // strをそのまま表示 System.out.println(str.length()); // strの長さを表示 System.out.println(str.toUpperCase()); // strを大文字にして表示 } }
ここではクラスの使い方をつかんでもらえればOKです。 Stringクラスに他にどんなメソッドがあるかは適当にぐぐってくれ。
次はクラスを作ってみます。自分で作ってみると一気に理解が深まる・・・かもしれない。
次のコードを見てください。
class myInt{ private int value; public myInt(int i){ value = i; } public int intValue(){ return value; } public int intValueNegative(){ return -1 * value; } } public class test3{ public static void main(String[] args){ myInt a = new myInt(5); System.out.println(a.intValue()); System.out.println(a.intValueNegative()); } }
出力
5 -5
二行目
private int value;
クラスの中に入っている変数をフィールドといいます。これは「値を保持するための場所」ですね。
test2で10という値を保持していくれていた場所もフィールドです。
private, publicについては後で説明します
四行目~六行目
public myInt(int i){ value = i; }
クラスの名前と同じ名前のメソッドを、コンストラクタといいます。 これは
myInt a = new myInt(5);
としたときに呼び出されるものです。 つまり上のコードではmyInt型のインスタンスをつくり、その保持する値(a.valueの中身)を5にしているわけです。
あとはだいたい見ればわかってもらえると思います・・・
先ほどのtest3で、privateとかpublicとかいうものがありました。これについて説明します。
一言でいうと、
public: クラスの外からアクセスできる private: クラスの外からアクセスできない
です。(他にprotectedというのがありますがこれはクラスの継承をやったときに説明します。)
例えば、myIntのintValueメソッドはpublicなので、myIntクラスの外から
System.out.println( a.inValue() );
という風に呼び出すことができました。
一方、valueはprivateなので
a.value = 10;
などと値を変えようとしてもエラーになります。
publicは「外部に公開する値やメソッド」、privateは「外から勝手にいじられなくない値」に指定します。
例えば文字列の長さなどはint型で保持されているでしょうが、外から勝手に書き換えられたらこまります。
(しかし長さが見れないと意味がないので、 public な length() というメソッドを作って値を見ることだけはできるようになっています。)
public class String(){ private int length; // 外から str.length = 10; とかやられると困るのでprivate //コンストラクタとか public int length(){ return length; // こうすることで外から str.length() を呼べば長さがわかる。でもやっぱりlengthを勝手に書き換えることはできない。 } }
こんな感じになっています。(本当はpublic final class String extends Objects ... だが今は関係ないことばかりなので簡単に public class String としました。)
上のmyIntのコンストラクタは
public myInt(int i){ value = i; }
となっています。
しかし仮引数の名前にはiよりかはvalueを使いたいところですよね?
でもそれだとクラスフィールドのvalueと名前が衝突してどっちかわからなくなるし・・・
といったときに登場するのが this です。具体的には次のようにします。
public myInt(int value){ this.value = value; }
myIntのコンストラクタの仮引数の名前を変更しました。また代入文の先頭にthisというのがついています。
this.変数名
とすると、「クラスフィールドの中にある変数のどれか」を表します。(本当は thisは自分自身を表す参照 と書くべきですが参照とかやってないしわかりにくいのでとりあえずはこうおもっておきましょう。)
オレの.value
見たいなもんです。
んで、なぜ上のコードでOKかと言うと、名前が被ったときはクラスフィールドの変数よりも仮引数のほうが優先されるからです。
つまり、 myInt(int value) の中で普通に value と書くと仮引数のvalueを表します。したがって上のコードは
オレの.value = (仮引数の)value
となって、めだたくクラスフィールドのvalueに引数で与えられたvalueが代入されるというわけです。
まぁこんな感じでやっていきます