intro to Java

■変数と初期化
Javaがサポートする変数は2種類
クラスのメンバ変数 と メソッドのローカル変数

□メンバ変数
オブジェクトの生成時に作成されオブジェクトの破棄時に削除される
自動的に初期化される
staticでないインスタンス変数は クラスのコンストラクタが実行される直前に初期化される
staticで宣言された変数は クラスの読み込み時に初期化される

□ローカル変数(メソッドローカル/自動変数)
メソッドへの進入時に作成されメソッドの実行終了まで存続する(インナークラスは例外)
自動的に初期化されない=自分で初期化かしないとコンパイルエラー

■引数の引渡し
メソッドの呼び出しに渡されるのは引数のコピーである
void test() {
 int xx = 12345;
 bumper(xx);
 syso("Now xx is " + xx);
}
--
void bumper(int bumMe) {
 bumpMe += 15;
}
testメソッドからsysoutされるxxは12345のままである

基本データのみならずオブジェクトでも値が直に渡されないのは同じだが
オブジェクト参照object referenceになるため結果は異なる

JavaではObjectをdirectに扱わずにobjectを一意に識別する値bit pattern=参照を代わりに扱う
メソッドの引数に渡されるのもこの参照である
# JVMの実装によっては参照としてobjectのアドレスが使われたりする
# 実際にはアドレスのアドレスが参照の値となる
 この2面目のアドレスは実際のデータを指す
 この二重間接参照double indirectionでガーベッジコレクションの際に
 objectの割り当てを変更することでメモリの断片化fragmentationを減らせる

void test() {
 String color = "white";
 change(xx);
 syso("Now color is " + color);
}
--
void change(String color) {
 color = "blue";
}
testメソッドからsysoutされるcolorはblueになる

□基本データを参照渡しにする方法
void test() {
 int[] xx = {1};
 bumper(xx);
 syso("Now xx is " + xx[0]);
}
--
void bumper(int bumMe) {
 bumpMe[0]++;
}
testメソッドからsysoutされるxxは2となる

■garbage collection
Javaではプログラムの実行中に
スタック領域 と ヒープ領域 にメモリを割り当てる
メソッドのローカル変数や引数 は スタック 上に割り当てられ メソッドの終了で破棄される
newで生成されたobject は ヒープ 上に割り当てられ より長い寿命を持つ

public void aMethod() {
 MyClass mc = new MyClass();
}
ローカル変数mc(objectへの参照)は スタック上に割り当てられるが
MyClassのインスタンスはヒープ上に割り当てられる

割り当てられた領域の解放をするのがgarbage collector
garbage collectorは優先度の低いthreadから
どのactive threadからもアクセスできなくなったメモリを検出して
解放しヒープに戻して再利用できるようにする

System.gc();
Runtime.gc();
でgarbage collectorを実行するが
すぐに実行されるとは限らないし必ず実行されるとも限らない

メモリリーク回避のためnullを明示的代入するのが大切

■other
符号付の整数データ型: byte, short, int, long (いずれも2の補数)
浮動小数点型: float, double
char型: unicode文字


tag:
Java SJC-P

tag : Java SJC-P

2011-08-24 04:55 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud