Java别名Alias是如何工作的(alias设置别名)

网友投稿 568 2022-08-04


Java别名Alias是如何工作的(alias设置别名)

目录前言Alias在java中是如何工作的?结论

前言

在Java中,当引用(不止一个)链接到同一个对象时,使用Alias(别名)。别名的问题是,当用户写入特定对象时,其他几个引用的所有者不希望该对象发生更改。在这里,包含别名的代码可能会很快变得有点混乱,而且调试起来也非常繁琐。总的来说,别名是一个应该避免或谨慎使用的过程。让我们看看Java Alias是如何工作的。

Alias在Java中是如何工作的?

如前所述,当多个引用链接到同一对象时,会使用别名。这还意味着一个位置有几个别名可以修改,http://这些特定的别名有几种类型。

让我们举个例子。x和y是两个变量名,有两种类型x和y。y扩展了x。

Y[] y = new Y[10];

X[] x = y;

x[0] = new X();

Y[0].func1();

在内存中,它们都指向同一个位置。

指向的内存位置由x和y指向。但是,实际保存的对象选择在运行时调用哪个方法。

看另外一个例子:

Rectangle b1 = new Rectangle (0, 0, 50, 150);

Rectangle b2 = b1;

b1和b2都指同一个对象,或者我们可以说给定的对象有两个名称,比如b1和b2。与有两个名字的人类似,对象也可以有两个名字。

当存在两个别名变量时,导致一个变量的更改也会反映在另一个变量上,

如下所示:

System.out.println (b2.width);

b1.grow (40, 40);

System.out.println (b2.width);

在执行代码时,您将看到在一个矩形上引起的更改也发生在第二个矩形中。这是Java中Alias需要注意的主要问题之一。

Java别名示例

以下是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();

}

}

在执行代码时,可以看到发生了名为ArrayStoreException的异常。这是怎么发生的?必须改变什么?有可能解决这个问题吗?

对出现这种异常的唯一原因是Java在运行时管理别名。只有在运行时,它才能知道第一个应该是Y的对象,而不是X。要解决这个问题,必须更改上面的代码。

因此,只有将示例程序更改为以下代码时,它才能正确运行。

//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();

}

}

当X的对象变为Y的对象时,在上面的第一个程序中引发了异常,但在这里没有发生。

另外一个例子:

//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);

}

}

在这个程序中,首先创建两个整数变量a和b。然后代码检查a和b是否相等。在下一步中,a被分配给b。再次检查a和b是否相似。在执行代码时,两个结果都将被打印为true。

如果使用两个数组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);

}

}

在这个程序中,第一步创建两个数组a和b。然后,与上述程序类似,检查a和b是否相等。之后,将a分配给b,并再次检查两者是否相似。在执行代码时,可以看到第一次检查的http://输出为false,第二次检查的输出为true。这是因为Java别名可以工作。

结论

当多个对象的引用链接到同一个对象时,在Java中使用别名。别名的缺点是,当用户写入特定对象时,其他一些引用的所有者不会猜测该对象会发生更改。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot整合Lombok及常见问题解决(springboot lombok)
下一篇:Java 17的一些新特性介绍
相关文章

 发表评论

暂时没有评论,来抢沙发吧~