JavaRush /Java Blog /Random-JA /Java の参照データ型

Java の参照データ型

Random-JA グループに公開済み
Java 構文を理解していなければ、本格的な開発者になることは不可能なので、今日も構文の学習を続けます。 前回の記事ではプリミティブ変数について説明しましたが、変数には 2 つのタイプがあるため、今日は 2 番目のタイプである Java の参照型について説明します。それで、それは何ですか?Java ではなぜ参照データ型が必要なのでしょうか? Java の参照データ型 - 1チャンネル番号、音量、オンフラグなどのいくつかの特性を持つ TV オブジェクトがあると想像してみましょう。
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
のような単純な型はどのようにしてintこのデータを保存できるのでしょうか? 1 つの変数は 4 バイトであることを覚えておいてくださいint。ただし、内部には同じ型の 2 つの変数 (4 バイト + 4 バイト) とboolean(+1 バイト) があります...合計 - 4 ~ 9 ですが、一般に、オブジェクトにはさらに多くの情報が格納されます。何をするか?オブジェクトを変数に入れることはできません。ストーリーのこの時点で、参照変数が登場します。 参照変数には、特定のオブジェクトが配置されているメモリ位置のアドレスが格納されます。つまり、これはアドレス付きの「名刺」であり、これを使用して共有メモリ内のオブジェクトを見つけて、それに対して何らかの操作を実行できます。Java のオブジェクトへの参照は参照変数です。TV オブジェクトを使用すると次のようになります。
TV telly = new TV();
telly作成されたタイプ TV のオブジェクトへのリンクへの 名前を持つタイプ TV の変数を設定します。つまり、JVM は TV オブジェクトのヒープ上にメモリを割り当て、それを作成し、メモリ内のその場所のアドレスを変数に入れtelly、スタックに格納します。この講義では、メモリ、つまりスタックやその他多くの役立つ情報について詳しく読むことができます。TV 型の変数と TV 型のオブジェクトに気づきましたか? これには理由がないわけではありません。特定の型のオブジェクトには、同じ型の対応する変数が必要です (継承とインターフェイスの実装は考慮しませんが、今回はこれを考慮していません)。結局のところ、グラスにスープを注ぐつもりはありませんよね?私たちのオブジェクトはテレビであり、その参照変数はコントロール パネルのようなものであることがわかります。このリモート コントロールを使用して、オブジェクトとそのデータを操作できます。たとえば、テレビの特性を設定します。
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
ここでは、ドット演算子を使用して、.変数が参照するオブジェクトの内部要素にアクセスし、使用を開始しました。たとえば、最初の行で変数に次のように指示しました。「参照しているオブジェクトの telly内部変数を指定し、それを true に設定してください」(テレビをつけてください)。isOn

参照変数の再定義

参照型の 2 つの変数と、それらが参照するオブジェクトがあるとします。
TV firstTV = new TV();
TV secondTV = new TV();
次のように書くとします。
firstTV = secondTV;
これは、最初の変数に 2 番目のオブジェクトのアドレス (アドレス ビットの値) のコピーを値として割り当て、両方の変数が 2 番目のオブジェクト (つまり、同じリモコンの 2 つのリモコン) を参照することを意味します。テレビ)。同時に、最初のオブジェクトは、それを参照する変数がないまま残されました。その結果、変数がその条件付きスレッドであったため、アクセスできないオブジェクトができました。これがないとオブジェクトはゴミになり、メモリ内に横たわってスペースを占有するだけになります。このオブジェクトはその後、ガベージ コレクターによってメモリから破棄されます。 Java の参照データ型 - 2別のリンクを使用せずに、オブジェクトとの接続スレッドを切断できます。
secondTV = null;
その結果、オブジェクトへのリンクは 1 つだけになりfirstTVsecondTV誰も指すことはなくなります (これにより、将来テレビなどのオブジェクトへのリンクを割り当てることができなくなります)。

文字列クラス

別途、 Stringクラスについても説明します。これは、文字列として保存されたデータを保存および操作するために設計された基本クラスです。例:
String text = new String("This TV is very loud");
ここでは、オブジェクトのコンストラクターに格納される文字列を渡しています。しかし、誰もそんなことはしません。結局のところ、文字列は作成できます。
String text = "This TV is very loud";
もっと便利ですよね?使用頻度という点ではStringプリミティブ型に劣りませんが、やはりクラスであり、参照する変数はプリミティブ型ではなく参照型になります。String文字列を連結するという素晴らしい機能があります 。
String text = "This TV" + " is very loud";
その結果、次のテキストが再度取得されます。This TV is very loudこれは、2 行が 1 つの全体に結合され、変数がこの全文を参照するためです。重要なニュアンスは、Stringこれが不変クラスであるということです。それはどういう意味ですか?次の例を見てみましょう。
String text = "This TV";
text = text + " is very loud";
すべてが単純であるように見えます。変数を宣言し、それに値を与えます。次の行で変更します。しかし、私たちは実際には変わりません。これは不変クラスであるため、2 行目では初期値は変更されませんが、最初の で構成される新しい値が作成されます+ " is very loud"

基準定数

プリミティブ型に関する記事で、定数のトピックについて触れました。参照変数をfinalと宣言すると、参照変数はどのように動作するのでしょうか?
final TV telly = new TV();
これによりオブジェクトが不変になると思うかもしれません。しかし、そうではありません。 Java の参照データ型 - 3修飾子を持つ参照変数は、finalいかなる方法でもバインドを解除する (再定義するか、 と同等にするnull) ことはできずに、特定のオブジェクトにバインドされます。つまり、このような変数の値を設定した後、次のようなコードを記述します。
telly = new TV();
または
telly = null;
コンパイルエラーが発生します。つまり、finalリンクにのみ作用し、オブジェクト自体には影響しません。最初に可変にしておけば、問題なく内部状態を変更できます。
telly.soundVolume = 30;
場合によっては、メソッドの引数でも変数が Final として指定されることがあります。
public void enableTV (final TV telly){
   telly.isOn = true;
}
これは、メソッドの作成プロセス中にこれらの引数をオーバーライドできないようにするために行われ、混乱が少なくなります。final不変オブジェクトを参照する参照変数を指定したらどうなるでしょうか? 例String:
final String PASSWORD = "password";
その結果、プリミティブ型の定数に類似した定数が得られます。これは、ここでは参照を再定義することも、オブジェクトの内部状態 (内部データ) を変更することもできないためです。

要約しましょう

  1. 単純変数は値ビットを格納しますが、参照変数はオブジェクトの取得方法を表すビットを格納します。
  2. オブジェクト参照は、1 種類のオブジェクトに対してのみ宣言されます。
  3. Java のクラスはすべて参照型です。
  4. Java の参照変数のデフォルト値は ですnull
  5. Stringは、参照型の標準的な例です。このクラスも不変です。
  6. 修飾子を持つ参照変数は、final再定義することなく 1 つのオブジェクトにのみバインドされます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION