Java:オブジェクトの作成と初期化プロセス
1。Javaのデータ型
Javaには3つのデータ型があります。基本データ型(Java、Boolean、Byte、Short、Int、Long、Char、Float、およびDoubleは基本的なデータ型)、参照タイプ、NULLタイプです。その中で、参照タイプにはクラスタイプ(配列を含む)とインターフェイスタイプが含まれます。
次のステートメントでは、いくつかの変数が宣言されています。
int k; a; // Aは、Aデータ型のオブジェクト変数名です。 B B1、B2、…、B10000; // Bは抽象クラスまたはインターフェイスであると仮定します。文字列s;
注:データ型と変数の観点から、基本的なデータ型変数k、クラス型変数AおよびS、抽象クラスまたはインターフェイスタイプ変数B(10,000)はすべて変数(識別子)です。
2。ハンドルについて
参照タイプの変数識別子と基本データ型の変数識別子を区別するために、Heanddを使用して参照タイプの変数識別子に名前を付ける。上記の例では、B1からB10000、A、およびSはすべてハンドルです。ハンドルは、ハンドルとハンドルを直感的に見ます。コンピューターの世界で一般的に使用される中国の「ハンドル」の翻訳を使用しています。
2.1 [Windowsプログラミングで]ハンドルの意味は、アプリケーションによって作成または使用されるオブジェクトを識別するために使用されるユニークな整数です。 Windowsは、アプリケーションインスタンス、Windows、コントロール、ビットマップ、GDIオブジェクトなど、さまざまなハンドルを使用して識別します。Windowsハンドルは、C言語のファイルハンドルに少し似ています。
上記の定義から、ハンドルはオブジェクトまたはプロジェクトを識別するために使用される識別子であることがわかります。それは私たちの名前のようなものです。誰もがそれを持っています。さまざまな名前が異なりますが、あなたと同じ名前を持つ人もいるかもしれません。データ型からは、16ビットの符号なし整数です。アプリケーションは、ほとんどの場合、Windows関数を呼び出すことでハンドルを取得します。これは、他のWindows関数が使用して対応するオブジェクトを参照できるようにします。
ハンドルをもっと徹底的に知りたい場合は、ハンドルがポインターのポインターであることを伝えることができます。いわゆるポインターがメモリアドレスであることを知っています。アプリケーションが開始された後、プログラムを構成するオブジェクトはメモリにあります。単に理解すれば、このメモリの最初のアドレスを知っている限り、このアドレスを使用していつでもオブジェクトにアクセスできるようです。しかし、あなたが本当にそう思うなら、あなたは非常に間違っています。 Windowsは仮想メモリベースのオペレーティングシステムであることがわかっています。このシステム環境では、Windowsメモリマネージャーが多くの場合、オブジェクトをメモリで前後に移動して、さまざまなアプリケーションのメモリニーズを満たします。オブジェクトが移動されることは、そのアドレスが変更されたことを意味します。アドレスが常にこのように変更された場合、オブジェクトはどこにありますか?
この問題を解決するために、Windowsオペレーティングシステムは各アプリケーションの内部ストレージアドレスを解放して、各アプリケーションオブジェクトのアドレスの変更をメモリに具体的に登録します。このアドレス(ストレージユニットの場所)自体は変更されません。オブジェクトの位置をメモリに移動した後、Windowsメモリマネージャーはオブジェクトの新しいアドレスを指示して保存します。このようにして、オブジェクトがメモリのどこにあるかを間接的に知るために、このハンドルアドレスを覚えておく必要があります。このアドレスは、オブジェクトがロードされたときにシステムによって割り当てられ(負荷)、システムがアンロードされたときにシステムにリリースされます。
ハンドルアドレス(安定)→メモリ内のオブジェクトのアドレスを記録してください‑そして‑そして、──メモリ内のオブジェクトのアドレス(不安定)→実際のオブジェクト
2.2 Javaのハンドルの意味には、[Windowsプログラミングで]ハンドルの意味を深く理解しています。ハンドルは、Javaを学ぶときに非常に必要な用語であると言えます。その意味は、「オブジェクト自体」をオブジェクト変数(または厳密さ:オブジェクトが属するデータ型の変数識別子)と区別することです。
2.3 1の変数宣言に戻る:
これで、以下のコメントを明確に見ている必要があります。
int k、j; // kは整数番号を保存します。 a; //アドレスはaに保存されます。 b b1、b2、…、b10000; // b1、…、b10000はアドレスを内部に保存します。文字列s; // sアドレスを保存します。
3。参照について
「引用」とは何ですか? 「操作する識別子は、実際にはオブジェクトへの「参照」です」。 (Java2eで考える)
翻訳は次のとおりです。操作する識別子は、実際にはオブジェクトへの「参照」です。または、より正確にするために、翻訳:操作する識別子は、実際にはオブジェクトへの「参照」です。明らかに、元のテキストの参照は、方向感のあるものです。
Javaに戻り、オブジェクトのID番号、オブジェクトのID、またはオブジェクトの携帯電話番号を参照してください。もちろん、より多くのことは、リファレンスはオブジェクトがメモリに存在する部屋番号であるということです。直感的に言えば、オブジェクトへの参照は、オブジェクトを作成するときの返品値です!参照は、新しい式の返品値です。
new a();ここにオブジェクトがありますが、ハンドルを使用してリファレンスを保持(保持、保持、保存)しません。微視的な観点から、新しい式はオブジェクトの初期化のタスク(3つのステップ、以下の詳細な分析)を完了し、全体として参照を返します。
1の変数宣言に戻り、以下のコメントをご覧ください。
a; //ハンドルAを宣言しますが、初期化されていないため、内部の値はnullです。 B B1、B2、…、B10000; //宣言B1、…、B10000を宣言しますが、初期化されていないため、内部の値はnullです。文字列s; //ハンドルsを宣言しますが、初期化されていないため、内部の値はnullです。
4.ハンドルと参照の関係
a; //宣言ハンドルa、値はnulla = new a(); //ハンドルの初期化(ハンドル=参照;つまり、参照をハンドルに割り当てます)
引用:新しいa()の値。参照は、オブジェクトがメモリ空間を占めるアドレスと単純に見なすことができます。オブジェクトへの参照を通じて、それらは他のオブジェクトと便利に区別でき、参照はオブジェクトの一意のアイデンティティです。
ハンドルが初期化された後、ハンドルを使用してオブジェクトをリモート制御できます。
もちろん、これは1つの側面からのオブジェクトの作成と初期化を説明するためだけです。ハンドルと参照の関係を理解した後、オブジェクトの初期化のプロセス全体を以下に分析します。最初に次の準備をして、スタックとスタックについて話しましょう。
5。Javaのスタックとヒープ
Javaでは、メモリは「スタック」と「ヒープ」(スタックとヒープ)の2つのタイプに分割されます。基本的なデータ型は「スタック」に保存され、オブジェクト参照タイプは実際には「ヒープ」に保存され、参照メモリのアドレス値はスタックにのみ保持されます。
ちなみに、「==」と「equals()メソッド」について話して、両方の概念(スタックとヒープ)の概念を理解するのに役立ちましょう。
変数をJavaで「==」と比較する場合、システムは比較の基礎としてスタック内の変数に格納されている値を使用します。スタック内の基本データ型に保存されている値は封じ込め値であり、スタック内の参照型に保存されている値は、オブジェクト自体のアドレス値です。 Java.Langパッケージのオブジェクトクラスには、パブリックブール等等(オブジェクトOBJ)メソッドがあります。 2つのオブジェクトが等しいかどうかを比較します。オブジェクトのequals()メソッドは、比較されている2つの参照が同じオブジェクトをポイントする場合にのみtrueを返します(ハンドルは等しい)。 (文字列クラスのequals()メソッドについては、equals()メソッドをオーバーライドし、この記事では説明していません。)
6。オブジェクトの作成と初期化プロセス
Javaオブジェクトには、クラスのインスタンスがあります。一般に、クラスのインスタンス化が、変数やメソッドを含むこのようなクラスのすべてのメンバーが、このデータ型の新しいインスタンスにコピーされます。次の2つのコードを分析します。
6.1車両veh1 = new ver();
上記のステートメントは次のとおりです。
右側の「新しい車両」は、車両クラスをテンプレートとして使用して、ヒープスペースに車両クラスオブジェクト(車両オブジェクトとも呼ばれます)を作成します。
()の終わりは、オブジェクトが作成された後、車両クラスのコンストラクターがすぐに呼び出され、新しく生成されたオブジェクトを初期化することを意味します。コンストラクターが必要です。作成されていない場合、Javaはデフォルトのコンストラクターを追加します。
左側の「車両のbeheber1」は、車両クラスの参照変数を作成します。
"" = "オペレーターは、作成したばかりの車両オブジェクトのオブジェクト参照ポイントを作成します。 (ハンドルと参照をリコール)
上記のステートメントを2つのステップに分けます。
車両heele1; veh1 = new ver();
このように書くのは明確です。 2つのエンティティがあります。1つはオブジェクト参照変数、もう1つはオブジェクト自体です。ヒープスペースで作成されたエンティティは、スタックスペースで作成されたエンティティとは異なります。それらは存在するエンティティですが、それを正確に「キャッチ」することは困難なようです。 2番目の文を注意深く勉強して、作成したオブジェクトの名前を見つけましょう。一部の人々は、それが「車両」と呼ばれていると言います。いいえ、「車両」はクラスの名前です(オブジェクトの作成テンプレート)。車両クラスはこれに基づいて無数のオブジェクトを作成でき、これらのオブジェクトは「車両」と呼ぶことはできません。オブジェクトには名前さえないため、直接アクセスすることはできません。オブジェクトの参照を介して間接的にオブジェクトにのみアクセスできます。
6.2車両の車両2;
veh2 = heile1;
Vee1とVeh2はオブジェクトへの参照であるため、2番目の行が行うことは、bee1の参照(アドレス)をbee2に割り当てることです。
6.3 veh2 = new Vehicle();
参照変数Beh2は、代わりに2番目のオブジェクトを指します。
上記のステートメントから推定された場合、次の結論を描画できます。 ofbertオブジェクトは、それを指すためにn参照を持つことができます。
Java:データ型変換
1。Javaの単純な種類とそのエンコートレータークラス
1.1 Javaシンプルなタイプとカプセル化クラスJava言語は典型的なオブジェクト指向のプログラミング言語であることを知っていますが、構造、小さなメモリ、高速アクセス速度が単純である基本的なデータ型の利点を考慮すると、Javaはこれらの非オブジェクト指向のシンプルなデータ型をサポートしています。もちろん、Javaが他の多くのクラスを提供する場合、単純なデータ型に対応するカプセル化されたクラスも提供します。したがって、Javaには、INTや整数(フロートとフロート、ダブルとダブルなど)などのさまざまなデータ型があります。
Java言語にはデータ型には2つの主要なカテゴリがあります。1つはシンプルなタイプで、メインタイプ(原始)とも呼ばれ、もう1つは参照タイプ(参照)です。単純なタイプ変数は特定の値を保存しますが、参照型変数はオブジェクトへの参照を保存します。
Javaは、各シンプルなタイプのサイズを決定します。これらのサイズは、マシン構造の変化に伴い変化しません。このサイズは不変であり、Javaプログラムが強い携帯性を持っている理由の1つです。
次の表には、Javaで定義されている単純なタイプ、バイナリビットの占有率、および対応するカプセレータクラスを示します。
表Javaのシンプルなタイプ
1.2カプセル化クラスを使用する理由。例としてINTと整数を取ります。それらは本質的に32ビットの整数を表していますが、異なるデータ型です。実際、Javaで直接使用される整数はINTです(INTと整数に関する限り)。データがオブジェクトのIDとして表示されなければならない場合にのみ、整数値をcapsulator intege、対応するintを持つオブジェクトにカプセル化する必要があります。
たとえば、java.utilパッケージのベクトルに整数を追加するには、整数値を次のように整数インスタンスでカプセル化する必要があります。
Vector v = new Vector(); int k = 121; v.addelemt(new Integer(k));
さらに、integerは、intに対応するカプセレータクラスとして、整数構造方法、整数変換方法など、INTタイプデータでは使用できない他の数値タイプなどの多くの方法を提供します。
2。Javaの定数
次のタイプの定数に注意する必要があります。
2.1 16進定数が16進数で発現する場合、0xff、0x9aなどの0xまたは0xで開始する必要があります。
2.2総整数定数OCTALは、0123、034などの0から開始する必要があります。
2.3長型の長型は、9L、342LなどのLで終了する必要があります。
2.4フロート定数小数定数のデフォルトタイプは二重タイプであるため、F(F)はフロートタイプの後に追加する必要があります。小数の変数は、デフォルトでは二重タイプです。
フロートF;
f = 1.3f; // fを宣言する必要があります。
2.5文字定数文字定数は、2つの単一の引用符で囲む必要があります(文字列定数は2つの二重引用符で囲まれていることに注意してください)。 Javaの文字は2バイトを占めています。
一般的に使用されるいくつかの脱出文字。
①/rとは、キーボード入力を受け入れることを意味します。これは、Enterキーを押すのと同等です。
②/nは新しいラインを意味します。
③/tは、テーブルキーに相当するタブ文字を表します。
④/bは、バックスペースキーに相当するバックスペースキーを表します。
⑤/'は単一の引用を意味します。
⑥/''は二重引用符を意味します。
⑦//スラッシュ/を意味します。
3。単純なデータ型間の変換
単純なタイプのデータ間で変換するには、自動変換とキャスト変換の2つの方法があります。これは通常、式またはメソッドのパラメーターが渡されたときに発生します。
3.1自動変換具体的には、「小さな」データが「大きな」データとともに計算されると、システムは「小さな」データを「大規模」データに自動的に変換し、計算を実行します。メソッドを呼び出すと、実際のパラメーターは「小」であり、呼び出されたメソッドの正式なパラメーターデータは「大規模」です(もちろん、一致する方法がある場合、一致する方法は直接呼び出されます)。システムは「大きな」データを「大きな」データに自動的に変換し、メソッドを呼び出します。当然のことながら、同じ名前の複数のオーバーロードされたメソッドの場合、「近い」「大きな」データに変換され、呼び出されます。
これらのタイプは、「小」から「大きな」までです(バイト、ショート、チャー) - int-long-float-doubleです。ここで話しているのは、占有されているバイト数ではなく、値を表す範囲のサイズを指します。
次の例をご覧ください。
javaでは、次の記述を直接渡すことができます。
byte b; int i = b; long l = b; float f = b; double d = b;
dow低レベルのタイプがcharタイプの場合、たとえば高レベルのタイプ(積分タイプ)に変換するときに、対応するASCIIコード値に変換されます。
char c = 'c'; int i = c; System.out.println( "output:"+i);
出力:
出力:99;
byte 3種類のバイト、ショート、チャーの場合、それらは水平であるため、互いに自動的に変換することはできません。次のキャストタイプ変換を使用できます。
short i = 99; char c =(char)i; system.out.println( "output:"+c);
出力:
出力:c;
Objectオブジェクトの多型に方法がある場合:
f(byte x){…}; f(short x){…}; f(int x){…}; f(long x){…}; f(float x){…}; f(double x){…}; f(double x){…}; char y = 'a';では、ステートメントf(y)はどの方法を呼び出しますか?答えは次のとおりです。F(int x){...}方法は、正式な参照パラメーターが「大きく」、「最も近い」ものであるためです。
そして方法のために:
f(float x){…}; f(double x){…};また、long y = 123l;次に、ステートメントf(y)で呼び出される方法はf(float x){…}です。
3.2キャスティング「大規模」データを「小さな」データに変換すると、キャストを使用できます。つまり、次のステートメント形式を使用する必要があります。
int n =(int)3.14159/2;
ご想像のとおり、この変換は確かにオーバーフローや精度の低下につながる可能性があります。
3.3式のデータ型を自動的に強化します。タイプの自動強化については、次のルールに注意してください。
byte、短い、およびcharタイプのすべての値がintタイプに宣伝されます。
olly長いオペランドがある場合、計算結果は長いです。
floatタイプのオペランドがある場合、計算結果はフロートタイプです。
doubleダブルタイプのオペランドがある場合、計算結果はダブルタイプです。
例、
バイトB; b = 3; b =(byte)(b*3); // byteを宣言する必要があります。
3.4パッケージングクラスの遷移タイプ変換一般的に言えば、最初に変数を宣言してから、対応するパッケージクラスを生成し、パッケージクラスのさまざまな方法を使用してタイプ変換を実行できます。例えば:
floatをダブルタイプに変換する場合:
フロートF1 = 100.00F;フロートF1 =新しいフロート(F1); double d1 = f1.doublevalue(); // f1.doublevalue()は、フロートクラスの二重値タイプを返す方法です
doubleダブルタイプをINTタイプに変換する場合:
double d1 = 100.00; double d1 = new double(d1); int i1 = d1.intvalue();
単純なタイプの変数を対応するラッパークラスに変換し、ラッパークラスのコンストラクターを使用できます。つまり、ブール(ブール値)、文字(char値)、整数(int値)、長い値(長い値)、フロート(フロート値)、double(double value)
各パッケージクラスには、対応する単純なタイプデータを取得するための××値()の方法が常にあります。この方法を使用して、異なる数値変数間の変換も実現できます。たとえば、二重精度のリアルタイプのクラスの場合、intvalue()は対応する整数変数を取得でき、doublevalue()は対応する二重精度の実験型変数を取得できます。
4。文字列と他のタイプの間の変換
4.1他のタイプの文字列への変換①クラスの文字列変換方法を呼び出します:x.toString();
自動変換:x+";
stringを使用したメソッド:string.volueof(x);
4.2値として文字列を他のタイプに変換するstring最初に対応するラッパーインスタンスに変換し、対応するメソッドを呼び出して他のタイプに変換します。たとえば、キャラクターの「32.1」のダブルタイプ値を変換する形式は次のとおりです。新しいFloat( "32.1")。doubleValue()。使用することもできます:double.valueof( "32.1")。doubleValue()
static parsexxxメソッド
string s = "1"; byte b = byte.parsebyte(s); short t = short.parseshort(s); int i = integer.parseint(s); long l = long.parselong(s); float f = float.parsefloat(s); double d = double.parsedouble(s);
③文字のgetNumericValue(CHAR CH)メソッドはAPIにあります。
5。日付クラスおよびその他のデータ型の変換
整数と日付クラスの間に直接的な対応はありませんが、INTタイプを使用して、それぞれ年、月、1時間、分、秒を表すことができます。そうすれば、2つの間に通信が確立されます。この変換を行うとき、日付クラスコンストラクターの3つのフォームを使用できます。
date(int year、int month、int date):intタイプは年、月、および日を表します(int year、int month、int date、int hrs、int min):intタイプは年、月、日、時間、および微細な瞬間を表します(int year、int month、int date、int hrs、int hrs、int min、int sec)クラス、つまり、時間は1970年1月1日に0:00:00:00からGMTからミリ秒数として表されます。この対応については、日付クラスには対応するコンストラクター:日付(長い日付)もあります。
日付クラスで年、月、日、時間、分、2週目、週を取得します。 getYear()、getMonth()、getDate()、gethours()、getMinutes()、getEconds()、getDay()を使用できます。また、日付クラスをINTに変換することも理解できます。
日付クラスのgetTime()メソッドは、前述の時間に対応する長い整数数を取得できます。ラッパークラスと同様に、日付クラスには、文字列クラスに変換できるtoString()メソッドもあります。
特定の形式の日付、たとえば20020324を取得したい場合があります。次の方法を使用して、最初にファイルの先頭に紹介することができます。
Import java.text.simpledateformat; import java.util。*; java.util.date date = new java.util.date(); // yyyymmdd simpledateformat sy1 = new simpledateFormat( "yyyymmdd"); string dateformat = sy1.format(date); //年、月、日、SimpleDateFormat sy = new SimpledateFormat( "yyyyy")を取得したい場合。 SimpleDateFormat sm = new SimpledateFormat( "mm"); SimpleDateFormat SD = new SimpledateFormat( "dd"); string syear = sy.format(date); string smon = sm.format(date); string sday = sd.format(date);