Java エイリアス

PHPz
リリース: 2024-08-30 15:45:29
オリジナル
834 人が閲覧しました

Java では、同じオブジェクトを参照するために複数の参照が使用される場合、それは一般に「エイリアス」と呼ばれます。エイリアスの問題は、ユーザーが特定のオブジェクトと所有者に他のいくつかの参照を書き込む場合に発生します。 、そのオブジェクトが変更されることを期待しません。ここで、エイリアシングを含むコードはすぐに混乱する可能性があり、デバッグも非常に面倒です。 Java Alias がどのように機能するかを見てみましょう。

広告 このカテゴリーの人気コース JAVA マスタリー - スペシャライゼーション | 78 コース シリーズ | 15 回の模擬テスト

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

Java ではエイリアスはどのように機能しますか?

前に説明したように、複数の参照が同じオブジェクトに関連付けられている場合、エイリアスが発生します。また、これは、変更可能な場所に対して複数のエイリアスがあり、これらの特定のエイリアスにはいくつかのタイプがあることも意味します。

例を見てみましょう。 x と y は、X と Y の 2 つの型を持つ 2 つの変数名です。Y は X を拡張します。

Y[] y = new Y[10];
X[] x = y;
x[0] =  new X();
Y[0].func1();
ログイン後にコピー

メモリ内でも、両方とも同じ場所を指します。

Java エイリアス

指定されたメモリ位置は、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 エイリアスの例

以下は Java Alias のサンプル プログラムの一部です。

例 #1

コード:

//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 エイリアス

これはどのようにして起こるのでしょうか?何を変えなければならないのか?これを解決することはできますか?

はい!!この例外が発生する唯一の理由は、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();
}
}
ログイン後にコピー

出力:

Java エイリアス

例 #2

コード:

//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);
}
}
ログイン後にコピー

出力:

Java エイリアス

整数変数の代わりに 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);
}
}
ログイン後にコピー

出力:

Java エイリアス

このプログラムでは、最初のステップで 2 つの配列 a と b が作成されます。次に、上記のプログラムと同様に、a と b が等しいかどうかを確認します。コードを実行すると、最初のチェックの出力は false で、2 番目のチェックの出力は true であることがわかります。 Java Alias が動作するためです。

結論

エイリアスの欠点は、ユーザーが特定のオブジェクトに書き込む場合、所有者は他の参照について、そのオブジェクトが変更されることを推測できないことです。

以上がJava エイリアスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート