第五章の初期化およびクリーンアップ(下)
初期化する5.7コンストラクタ
あなたは初期値を決定するために、実行時にメソッドを呼び出し、または何らかのアクションを実行することができ、初期化するコンストラクタを使用することができますが、我々はコンストラクタが呼び出される前にそれが起こるのだろう、自動初期化を停止することができませんでした。例えば:
パブリッククラスカウンター{
int型私は、
カウンタ(){I = 7 。}
}
そして、私が最初に0に設定されている場合、コンパイラは初期化がすでに確保されているので、あなたや要素は、どこかのコンストラクタを使用する前に初期化する必要があります強制するものではありません7になりました。
5.7.1初期化シーケンス
クラス内では、シーケンスも定義の間に散在プロセス変数の定義では、初期化された変数の定義の順序を決定し、彼らはまだ(コンストラクタを含む)任意のプロセスの前に初期化されます。例えば:
パッケージcom.example.demo。
クラスウィンドウ{
ウィンドウ(int型マーカー){
System.out.print( "ウィンドウ(" +マーカー+ ")\ n" ); } }
クラスハウス{ ウィンドウW1 =新しいウィンドウ(1 )。家(){System.out.print( "家()\ n" ); W3 =新しいウィンドウ(33 )。}ウィンドウW2 =新しいウィンドウ(2 )。ボイドF(){System.out.print( "F()の\ n" ); }ウィンドウW3 =新しいウィンドウ(3 )。}
publicクラスのテスト{公共の静的な無効メイン(文字列[]引数){ハウスH =新しい家(); HF(); }}
出力は次のようになります。
出力から見ると、W3、この基準期間は、一回のコンストラクタを呼び出す前に、呼び出した後、オブジェクトが最初に参照され、ガベージコレクションとして廃棄され、二回初期化されます。
5.7.2静的データの初期化
どんなに多くのオブジェクトが作成されるか、静的データのみ記憶領域を占有しない、静的なキーワードは、ローカル変数に適用することはできませんので、それが唯一のフィールドに基づいて行動することができます。フィールドには、ドメインの静的な基本的なタイプであり、それを初期化しない場合は、彼は、その後、彼のデフォルトの初期値は、タイムリーにnullオブジェクト参照である場合、それは、標準の初期値の基本的なタイプを取得します。
次の例を考えてみます。
パッケージcom.example.demo。
クラスボウル{
ボウル(INT マーカー){
System.out.print( "ボウル(" +マーカー+ ")\ n" ); }
ボイドF1(int型マーカー){ System.out.print( "F1(" +マーカー+ ")\ n" ); }}クラス表{静的ボウルbowl1 =新しいボウル(1 )。表(){System.out.print( "テーブル()の\ n" ); bowl2.f1(1 )。}ボイドF2(int型マーカー){System.out.print( "F2(" +マーカー+ ")\ n" ); }静的ボウルbowl2 =新しいボウル(2 )。}クラス食器棚{ボウルbowl3 =新しいボウル(3 )。静的ボウルbowl4 =新しいボウル(4 )。戸棚(){System.out.print(」); }ボイドF3(int型マーカー){System.out.print( "F3(" +マーカー+ ")\ n" ); }静的ボウルbowl5 =新しいボウル(5 )。}パブリッククラスStaticInitialization {公共の静的な無効メイン(文字列[]引数){System.out.print( "メイン\ nの新しい戸棚()を作成します" )。新しい食器棚(); System.out.print( "メイン\ nの中で新しい食器棚を()の作成" )。新しい食器棚(); table.f2(1 )。cupboard.f3(1 )。}静的表テーブル=新しい表()。静的な食器棚の食器棚=新しい食器棚(); }
出力:
ボウル(1)
ボウル(2)
表()
F1(1)
ボウル(4)
ボウル(5)
ボウル(3)
食器棚()
F1(2)
メインの新しい食器棚を()の作成
ボウル(3)
食器棚()
F1(2)
メインの新しい食器棚を()の作成
ボウル(3)
食器棚()
F1(2)
F2(1)
F3(1)
出力から見ると、静的な初期化が必要なだけで、その後は、静的オブジェクトが再び初期化されていないときに行われます。
初期化シーケンスは、静的オブジェクトに、非静的オブジェクトです。StaticInitializationクラスとその静的フィールドのテーブルをロードする必要があり、食器棚が初期化されている)(メイン行うために、この時点まで出力から観察することができ、それに対応するクラスが得られ浙江省は、ロードすることができ、そして、彼らはまた、静的ボウルのオブジェクトが含まれているためそのためボウルはその後、main()の開始前に、すべてのクラスでは、この特別なプログラムでは、ロードされてロードされます。しかし、現実にはないすべてのものは、静的を介してリンクされている。この場合のように、多くの場合、そうではありません。
概要:あなたは犬という名前のクラスがあるとし、
図1に示すように、偶数静的キーワードを使用して表示せず、コンストラクタは実際にオブジェクトが最初の犬は、犬のクラスまたは静的メソッドは/静的フィールドが最初の訪問で作成された静的メソッドであり、Javaインタプリタは、このような位置決め、クラスパスを見つけなければなりませんDog.classファイル。
Classオブジェクトが最初にロードされたとき2は、その後、Dog.classをロードし、一度だけの静的初期化に関連するすべてのアクションなので、静的な初期化を実行します。
3は、あなたが新しい犬()でオブジェクトを作成する際、内閣総理大臣は、ヒープ上の犬オブジェクトに対して十分な記憶領域を割り当てます。
図4は、このストレージスペースは、犬におけるデータオブジェクトの自動すべての基本タイプがデフォルト値になるように設定され、クリアされ、nullに設定されている引用されます。
5、すべてのフィールドの実装は、初期化動作の定義に表示されます。
図6は、コンストラクタを実行します。
5.7.3明示的な静的初期化
Javaは、例えば、特別な静的ワード(静的ブロック)に編成複数の静的初期化動作を可能にします。
パブリッククラススプーン{
静的int型I;
静的{
I = 47 。 } }
上記の方法は方法のように見えますが、それは実際にある間だけ、いくつかの静的なキーワードの後に、コード、およびその他の静的初期化アクション、一度だけのコードに従ってください。
5.7.4非静的インスタンスの初期化
Javaはまた、同様の構文は、各オブジェクトの非静的変数を初期化するために初期化し、インスタンスと呼ばれています。これは、静的な初期化の句は、単に静的なキーワードを失った正確のように見えます。匿名内部クラスの初期化のために、この構文のサポートが必要ですが、それはまた、あなたが明示的なコンストラクタで、特定の操作が行われるに関係なく保証することができます呼び出しです。句の例としては、コンストラクタの前に実行されます。
5.8配列の初期化
配列または実質的に配列型のデータをオブジェクト識別子に名前をカプセル化するための配列の同じタイプ、。角括弧添字オペレータによる配列[]を定義するだけブラケットの空一対タイプとすることができる追加する必要があり、アレイを定義するために使用されます。
INT [] A1。
INT A1 [];
C及びC ++プログラマが慣れているとの意味二つのフォーマットは、ライン後者より、同じであるが、前者のフォーマットは、より合理的であってもよいです。コンパイラは、配列のサイズを指定することはできません。
Javaでは、番号が別のアレイに割り当てることができます:A2 = A1が、本当に別の配列、例に割り当てられた配列をコピーします:
パッケージcom.example.demo。
パブリッククラスArrayOfPrimitives {
公共の静的な無効メイン(文字列[]引数){
INT [] A 1 = {1、2、3、4、5 }。 INT [] A2。 A2 =のA1を、以下のために(INT i = 0; iは<a2.length; iは++ ){A2 [I] = a2の[I] + 1 。}の(INT i = 0; I <a1.length; I ++ ){System.out.print( "A1 [" + I + "] =" + A1 [I] + "\ n" ); }}}
出力は次のようになります。
A1 [0] = 2
?[1] = 3
?1 [2] = 4
?1 [3] = 5
?1 [4] = 6
図から分かるように、初期値を符号A1をA2に与えられているものの、上記のコードでは、A1、A2は同じアレイの別名であるので、後ろA2別のアレイに割り当てられていないので、A2はによって行われます変更は、A1に見ることができます。
すべての配列は、彼が配列の要素数が含まれ得ることができ、固定された会員、すなわち長さを持って、それを変更することはできません。Java配列とC ++と同様C、0からカウントを開始し、最大添字長-1、及びこの境界を超えた場合、Javaランタイム例外が発生します。
5.8.1変数パラメータリスト
すべてのクラスは、直接であるため第2の形態は、オブジェクトを作成し、引数の数やケースの未知のタイプに適用することができ、同じ効果の可変パラメータリストCを取得するためのメソッドを呼び出すための便利な構文を提供しますまたは間接的にObjectクラスから継承されたので、あなたは、この呼び出しのように、メソッドのパラメータとしてオブジェクトの配列を作成することができます。
パッケージcom.example.demo。
クラスA {}
publicクラス可変引数{
静的ボイドプリントアレイ(オブジェクト[]引数){ 用(オブジェクトobj:引数) System.out.print(OBJ + "" )。System.out.println(); }公共の静的な無効メイン(文字列[]引数){プリントアレイ(新しいオブジェクト[] {新規整数(47)、新しいフロート(3.14)、新たなダブル(11.11 )})。プリントアレイ(新しいオブジェクト[] { "1"、 "2"、 "3" })。プリントアレイ(新しいオブジェクト[] {新しいA()、新しいA()、新しいA()})。}}
出力:
47 3.14 11.11
一二三
com.example.demo.A@649d209a com.example.demo.A@6adca536 com.example.demo.A@357246de
あなたは、@記号とより多くの桁の16進数が続いてきたクラスの名前だけの内容をプリントアウトし、印刷方法は、各オブジェクトの印刷を横断しているのforeach構文を使用して、パラメータとしてオブジェクトの配列を使用して見ることができるので、デフォルトでは、クラスを印刷しますオブジェクトの名前と住所。可変パラメータでは、もはやあなたはあなたのための配列を埋めるためのパラメータのコンパイラを指定すると書かれた配列構文を示さなければなりません。
5.9列挙型
あなたは、整数定数を作成する必要があります前に、enumキーワードは、我々は複合グループの列挙型のセットを使用する必要がある場合、それはだ、取り扱いが容易であるという一見小さな機能でJava SE5に追加が、これらの列挙値を設定し、必ずしも定数のこのセットの範囲内で、独自の値を制限しませんので、彼らはより危険と使いにくいようです。簡単な例:
パブリック列挙辛{
NOT、MILD、MEDIUM、HOT、FLAMING
}
彼らは命名規則に従っているように、ここでは大文字を適用し、例の列挙型が一定であるとして5、価値を任命した辛さと呼ばれる列挙型を作成します。
列挙型を適用するには、型への参照を作成して、インスタンスに割り当てる必要があります。
パブリッククラスSimpleEnumUse {
公共の静的な無効メイン(文字列[]引数){
辛howHot = Spiciness.MEDIUM。
System.out.println(howHot)。
}
}
出力は:MEDIUM
あなたが列挙型を作成すると、コンパイラが自動的なのtoString(のようないくつかの便利な機能を追加します)、あなたは簡単に列挙インスタンスの名前を表示することができます;序()、enum定数を宣言する特定の順序を示すために使用される。静的値()は、これらの定数の値からなる配列で、その結果、宣言順序列挙定数で使用されます。
パブリッククラス可変引数{
公共の静的な無効メイン(文字列[]引数){
ため(辛S:Spiciness.values())
のSystem.out.println(S + ".ordinal" + s.ordinal())。 } }
出力は次のようになります。
NOT.ordinal 0
MILD.ordinal 1
MEDIUM.ordinal 2
HOT.ordinal 3
FLAMING.ordinal 4
スイッチは、可能な値の限定されたセットを選択することであるので、列挙型との優れた組み合わせであるからです。あなたは、一般的に作成するために、別のデータ型の列挙方法として使用することができ、その後、直接使用するために使用され得られるタイプ。