Java別名Alias是如何工作的
前言
在Java中,當(dāng)引用(不止一個(gè))鏈接到同一個(gè)對(duì)象時(shí),使用Alias(別名)。別名的問題是,當(dāng)用戶寫入特定對(duì)象時(shí),其他幾個(gè)引用的所有者不希望該對(duì)象發(fā)生更改。在這里,包含別名的代碼可能會(huì)很快變得有點(diǎn)混亂,而且調(diào)試起來(lái)也非常繁瑣。總的來(lái)說(shuō),別名是一個(gè)應(yīng)該避免或謹(jǐn)慎使用的過(guò)程。讓我們看看Java Alias是如何工作的。
Alias在Java中是如何工作的?
如前所述,當(dāng)多個(gè)引用鏈接到同一對(duì)象時(shí),會(huì)使用別名。這還意味著一個(gè)位置有幾個(gè)別名可以修改,這些特定的別名有幾種類型。
讓我們舉個(gè)例子。x和y是兩個(gè)變量名,有兩種類型x和y。y擴(kuò)展了x。
Y[] y = new Y[10]; X[] x = y; x[0] = new X(); Y[0].func1();
在內(nèi)存中,它們都指向同一個(gè)位置。

指向的內(nèi)存位置由x和y指向。但是,實(shí)際保存的對(duì)象選擇在運(yùn)行時(shí)調(diào)用哪個(gè)方法。
看另外一個(gè)例子:
Rectangle b1 = new Rectangle (0, 0, 50, 150); Rectangle b2 = b1;
b1和b2都指同一個(gè)對(duì)象,或者我們可以說(shuō)給定的對(duì)象有兩個(gè)名稱,比如b1和b2。與有兩個(gè)名字的人類似,對(duì)象也可以有兩個(gè)名字。
當(dāng)存在兩個(gè)別名變量時(shí),導(dǎo)致一個(gè)變量的更改也會(huì)反映在另一個(gè)變量上,
如下所示:
System.out.println (b2.width); b1.grow (40, 40); System.out.println (b2.width);
在執(zhí)行代碼時(shí),您將看到在一個(gè)矩形上引起的更改也發(fā)生在第二個(gè)矩形中。這是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();
}
}在執(zhí)行代碼時(shí),可以看到發(fā)生了名為ArrayStoreException的異常。這是怎么發(fā)生的?必須改變什么?有可能解決這個(gè)問題嗎?
對(duì)出現(xiàn)這種異常的唯一原因是Java在運(yùn)行時(shí)管理別名。只有在運(yùn)行時(shí),它才能知道第一個(gè)應(yīng)該是Y的對(duì)象,而不是X。要解決這個(gè)問題,必須更改上面的代碼。
因此,只有將示例程序更改為以下代碼時(shí),它才能正確運(yùn)行。
//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();
}
}當(dāng)X的對(duì)象變?yōu)閅的對(duì)象時(shí),在上面的第一個(gè)程序中引發(fā)了異常,但在這里沒有發(fā)生。
另外一個(gè)例子:
//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);
}
}在這個(gè)程序中,首先創(chuàng)建兩個(gè)整數(shù)變量a和b。然后代碼檢查a和b是否相等。在下一步中,a被分配給b。再次檢查a和b是否相似。在執(zhí)行代碼時(shí),兩個(gè)結(jié)果都將被打印為true。
如果使用兩個(gè)數(shù)組a和b而不是整數(shù)變量,會(huì)發(fā)生什么?
這可以用下面給出的程序來(lái)解釋。
//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);
}
}在這個(gè)程序中,第一步創(chuàng)建兩個(gè)數(shù)組a和b。然后,與上述程序類似,檢查a和b是否相等。之后,將a分配給b,并再次檢查兩者是否相似。在執(zhí)行代碼時(shí),可以看到第一次檢查的輸出為false,第二次檢查的輸出為true。這是因?yàn)镴ava別名可以工作。
結(jié)論
當(dāng)多個(gè)對(duì)象的引用鏈接到同一個(gè)對(duì)象時(shí),在Java中使用別名。別名的缺點(diǎn)是,當(dāng)用戶寫入特定對(duì)象時(shí),其他一些引用的所有者不會(huì)猜測(cè)該對(duì)象會(huì)發(fā)生更改。
到此這篇關(guān)于Java別名Alias是如何工作的的文章就介紹到這了,更多相關(guān)Java別名Alias內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?Swing實(shí)現(xiàn)QQ登錄頁(yè)面
這篇文章主要為大家詳細(xì)介紹了Java?Swing實(shí)現(xiàn)QQ登錄頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
SpringCloud Gateway 路由配置定位原理分析
本節(jié)主要了解系統(tǒng)中的謂詞與配置的路由信息是如何進(jìn)行初始化關(guān)聯(lián)生成路由對(duì)象的。每個(gè)謂詞工廠中的Config對(duì)象又是如何被解析配置的2021-07-07
如何把本地idea上的項(xiàng)目上傳到github上(推薦)
這篇文章主要介紹了如何把本地idea上的項(xiàng)目上傳到github上,本文通過(guò)圖文的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Jmeter?BlazeMeter實(shí)現(xiàn)web錄制過(guò)程
BlazeMeter是一款與Apache JMeter兼容的chrome插件,采用BlazeMeter可以方便的進(jìn)行流量錄制和腳本生成,作為接口測(cè)試腳本編寫的一個(gè)基礎(chǔ),這篇文章主要介紹了Jmeter?BlazeMeter實(shí)現(xiàn)web錄制,需要的朋友可以參考下2021-12-12
使用JPA雙向多對(duì)多關(guān)聯(lián)關(guān)系@ManyToMany
這篇文章主要介紹了使用JPA雙向多對(duì)多關(guān)聯(lián)關(guān)系@ManyToMany,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

