Java では、同じオブジェクトを参照するために複数の参照が使用される場合、それは一般に「エイリアス」と呼ばれます。エイリアスの問題は、ユーザーが特定のオブジェクトと所有者に他のいくつかの参照を書き込む場合に発生します。 、そのオブジェクトが変更されることを期待しません。ここで、エイリアシングを含むコードはすぐに混乱する可能性があり、デバッグも非常に面倒です。 Java Alias がどのように機能するかを見てみましょう。
広告 このカテゴリーの人気コース JAVA マスタリー - スペシャライゼーション | 78 コース シリーズ | 15 回の模擬テスト無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
前に説明したように、複数の参照が同じオブジェクトに関連付けられている場合、エイリアスが発生します。また、これは、変更可能な場所に対して複数のエイリアスがあり、これらの特定のエイリアスにはいくつかのタイプがあることも意味します。
例を見てみましょう。 x と y は、X と Y の 2 つの型を持つ 2 つの変数名です。Y は X を拡張します。
Y[] y = new Y[10]; X[] x = y; x[0] = new X(); Y[0].func1();
メモリ内でも、両方とも同じ場所を指します。
指定されたメモリ位置は、y だけでなく x によっても指定されます。ただし、保存された実際のオブジェクトによって、実行時にどのメソッドを呼び出すかが選択されます。
別の例を見てみましょう。
Rectangle b1 = new Rectangle (0, 0, 50, 150); Rectangle b2 = b1;
b1 と b2 は両方とも同じオブジェクトを参照しています。または、指定されたオブジェクトには b1 と b2 などの 2 つの名前があると言えます。人が 2 つの名前を持つのと同じように、物体も 2 つの名前を持つことができます。
エイリアス化された 2 つの変数が存在する場合、以下に示すように、一方の変数を引き起こす変更はもう一方の変数にも反映されます。
System.out.println (b2.width); b1.grow (40, 40); System.out.println (b2.width);
コードを実行すると、1 つの四角形で生じた変更が 2 番目の四角形でも発生していることがわかります。これは、Java の Alias に関して注意しなければならない主な点の 1 つです。
以下は Java Alias のサンプル プログラムの一部です。
コード:
//class X class X { //function 1 public void func1() { System.out.println("called sample function 1"); } } //Class Y that extends the class X class Y extends X { //function 1 public void func1() { System.out.println("called sample function 1"); } //function 2 public void func2() { System.out.println("called sample function 2"); } } //main class public class AliasExample { //main method public static void main(String[] args) { Y[] y = new Y[10]; X[] x = y; x[0] = new X(); y[0].func1(); } }
出力:
これはどのようにして起こるのでしょうか?何を変えなければならないのか?これを解決することはできますか?
はい!!この例外が発生する唯一の理由は、Java が実行時にエイリアスを管理することです。実行時にのみ、最初のオブジェクトが X ではなく Y のオブジェクトであるべきであることがわかります。
//class X class X { //function 1 public void func1() { System.out.println("called sample function 1"); } } //Class Y that extends the class X class Y extends X { //function 1 public void func1() { System.out.println("called sample function 1"); } //function 2 public void func2() { System.out.println("called sample function 2"); } } //main class public class AliasExample { //main method public static void main(String[] args) { Y[] y = new Y[10]; X[] x = y; x[0] = new Y(); y[0].func1(); } }
出力:
コード:
//main class public class AliasExample { //main method public static void main(String[] args) { //create two different arrays with same value int a= 87; int b=87; //checks whether a and b are equal System.out.println(a == b); //assign b equal to a b=a; //checks whether a and b are equal System.out.println(a == b); } }
出力:
整数変数の代わりに 2 つの配列 a と b を使用するとどうなりますか?
//main class public class AliasExample { //main method public static void main(String[] args) { //create two different arrays with same value int []a = {81, 54, 83}; int []b = {81, 54, 83}; //checks whether a and b are equal System.out.println(a == b); //assign b equal to a b=a; //checks whether a and b are equal System.out.println(a == b); } }
出力:
このプログラムでは、最初のステップで 2 つの配列 a と b が作成されます。次に、上記のプログラムと同様に、a と b が等しいかどうかを確認します。コードを実行すると、最初のチェックの出力は false で、2 番目のチェックの出力は true であることがわかります。 Java Alias が動作するためです。
エイリアスの欠点は、ユーザーが特定のオブジェクトに書き込む場合、所有者は他の参照について、そのオブジェクトが変更されることを推測できないことです。
以上がJava エイリアスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。