Javaではすべてのものをオブジェクトとみなし、操作オブジェクトは実際には操作オブジェクトの「参照」です。両者の関係は、リモコン(基準)を使ってテレビ(物体)を操作することに相当します。参照を持つことは必ずしもオブジェクトを関連付ける必要はありません。たとえば、参照を宣言するだけではオブジェクトに関連付けられません。
参照を作成したら、通常は new を使用して新しいオブジェクトを作成します (Java の文字列は引用符で囲まれたテキストで初期化できます)。
(1)登録します。 Java では、最速の記憶領域 (プロセッサ内にある) を人間が直接制御することはできません (C++/c では、コンパイラにレジスタ割り当て方法を提案できます)。
(2)積み重ねる。 RAM 内にあるスタック ポインタは、下方向に移動して新しいメモリを割り当て、上方向に移動してメモリを解放します。これはレジスタに次いで高速です。ただし、システムを作成するとき、Java システムはポインタを上下に移動させるために、スタックに格納されているすべての項目の正確な宣言期間を知っている必要があります。この制約により、プログラムの柔軟性が制限されます。変数およびオブジェクト参照の一部 (Java オブジェクトは含まれません) はスタックに格納されます。
(3)山盛り。すべての Java オブジェクトを格納するために使用される一般的なメモリ プール (RAM 内に配置)。スタックとは異なるヒープの利点は、コンパイラーがヒープに格納されたデータがどれくらいの期間存続するかを知る必要がないことです。オブジェクトが新しい場合、メモリはストレージ用にヒープに自動的に割り当てられます。コンパイラーは、オブジェクトが不要になった場合、人間の制御なしで自動的にオブジェクトをリサイクルします。もちろん、この柔軟性には代償が伴います。スタック上にオブジェクトを作成すると、C/C++ よりも時間がかかります。
(4) 常時保管。定数値は決して変化しないため、通常、定数値はプログラム コード内に直接保存されます。
(5) 非RAMストレージ。データはプログラムの外部に存在し、プログラムによる制御の対象にはなりません。ストリーム オブジェクトや永続オブジェクトなど。
整数、小数、文字など、プログラミングでよく使われる一連の型…これらの型は基本型と呼ばれ、特別に扱われます。
なぜ特別な扱いが必要なのでしょうか? new はオブジェクトをヒープに格納します。前述したように、ヒープにデータを格納すると時間がかかるため、頻繁に使用されるデータ、特に小さくて単純なデータの場合、ヒープに格納するコストが高すぎます。したがって、Java は変数の作成に new を使用せず、参照ではない「自動」変数を作成します。この変数は値を直接保存し、スタックに置きます。基本タイプが占める収納スペースは固定です。
すべてがオブジェクトであるという事実に適応するために、基本型にはラッパー クラスがあり、対応する基本型を表す非基本オブジェクトをヒープ内に作成できます。
例:
char c='a'; Character ch=new Character(c); 或者 Character ch=new Character('a');
Java se5の自動パッケージ化機能は、両者を自動的に変換できます。
変数のスコープ: 変数には、値を直接格納する基本型とクラス参照が含まれます。コードセグメント内でのみ存続します。
オブジェクトスコープ:
{ String s=new String("string"); }//end of scope
参照 s はスタックに格納され、スコープの最後で終了します。ただし、 s が指す String オブジェクトは引き続きヒープ内に存在します。オブジェクトをいつリサイクルするかは、Java のガベージ コレクターによって決定されます。これを行うと、ほとんどの「メモリ リーク」問題が解消されます。
Java は C/C++ とは異なりますが、Java メソッドのパラメータが値渡しか参照渡しかについて混乱している人もいます。基本データ型の場合、基本データはスタック領域に直接値を格納するため、値が渡されます。オブジェクトは参照渡しです(スタック領域のオブジェクト参照はヒープ領域のオブジェクトのアドレスです)。 String と StringBuilder を例に挙げて説明します。
以下の2つの例を見てください。
public class Test {public static void test(String str) { str = "world"+str; }public static void main(String[] args) { String str1 = new String("hello"); test(str1); System.out.println(str1); } }
上記の例の出力結果はまだ hello ですが、なぜですか?テストでの str の変更は元のオブジェクトの変更ではないため、String オブジェクトは作成後に変更できません。上記の変更は実際には空の StringBuilder を作成して呼び出します。 append メソッドを使用して「world」、str を挿入し、toString メソッドを呼び出して新しい String オブジェクトを作成します。したがって、str の参照オブジェクトはこの時点ですでに新しいため、main 関数の str1 は変更されていません。 StringBuilder の別の例を見てみましょう。
public class test1 { static void test(StringBuilder str){ str.append("1234"); } public static void main(String[] args) { StringBuilder a=new StringBuilder("abc"); test(a); System.out.println(a.toString()); } }
上記の出力結果は abc1234 です。 str と a の参照は同じ StringBuilder オブジェクトを指しており、StringBuilder は変更可能であるため、テストでの str への変更は a にも反映されます。渡されたものは参照であると言えば十分です。
以上がJava ではすべてがオブジェクトですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。