Java别名Alias是如何工作的

 更新时间:2022年04月14日 15:08:45   作者: sofia        
这篇文章主要介绍了Java别名Alias是如何工作的,别名的问题是,当用户写入特定对象时,其他几个引用的所有者不希望该对象发生更改,下文相关介绍需要的小伙伴可以参考一下

前言

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

Alias在Java中是如何工作的?

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

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

Y[] y = new Y[10];
X[] x = y;
x[0] =  new X();
Y[0].func1();

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

Java别名是如何工作的

指向的内存位置由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,并再次检查两者是否相似。在执行代码时,可以看到第一次检查的输出为false,第二次检查的输出为true。这是因为Java别名可以工作。

结论

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

到此这篇关于Java别名Alias是如何工作的的文章就介绍到这了,更多相关Java别名Alias内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • SpringBoot实现elasticsearch 查询操作(RestHighLevelClient 的案例实战)

    SpringBoot实现elasticsearch 查询操作(RestHighLevelClient 

    这篇文章主要给大家介绍了SpringBoot如何实现elasticsearch 查询操作,文中有详细的代码示例和操作流程,具有一定的参考价值,需要的朋友可以参考下
    2023-07-07
  • 重新认识Java的System.in

    重新认识Java的System.in

    今天小编就为大家分享一篇关于重新认识Java的System.in,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 详解SpringBoot开发案例之整合定时任务(Scheduled)

    详解SpringBoot开发案例之整合定时任务(Scheduled)

    本篇文章主要介绍了详解SpringBoot开发案例之整合定时任务(Scheduled),具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • java 设计模式之State(状态模式)

    java 设计模式之State(状态模式)

    这篇文章主要介绍了java 设计模式之State(状态模式)的相关资料,一个类的行为基于它的状态的改变而改变。状态模式归属于行为型模式,需要的朋友可以参考下
    2017-08-08
  • springboot设置加载静态资源的路径(spring.resources.static-locations)

    springboot设置加载静态资源的路径(spring.resources.static-locations)

    这篇文章主要介绍了springboot设置加载静态资源的路径方式(spring.resources.static-locations),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java如何使用itext向PDF插入数据和图片

    Java如何使用itext向PDF插入数据和图片

    最近项目中使用到Java实现写入PDF文件,这篇文章主要给大家介绍了关于Java如何使用itext向PDF插入数据和图片的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • MybatisPlus使用idworker解决雪花算法重复

    MybatisPlus使用idworker解决雪花算法重复

    本文主要介绍了MybatisPlus使用idworker解决雪花算法重复,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • spring-data-jpa中findOne与getOne的区别说明

    spring-data-jpa中findOne与getOne的区别说明

    这篇文章主要介绍了spring-data-jpa中findOne与getOne的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • swing登录注册界面设计

    swing登录注册界面设计

    这篇文章主要为大家详细介绍了swing登录注册界面的设计方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Springboot实现阿里云通信短信服务有关短信验证码的发送功能

    Springboot实现阿里云通信短信服务有关短信验证码的发送功能

    短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。下面通过本文大家分享Springboot实现阿里云通信短信服务有关短信验证码的发送功能,一起看看吧
    2017-08-08

最新评论