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

指向的內(nèi)存位置由x和y指向。但是,實際保存的對象選擇在運行時調(diào)用哪個方法。
看另外一個例子:
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);
在執(zhí)行代碼時,您將看到在一個矩形上引起的更改也發(fā)生在第二個矩形中。這是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í)行代碼時,可以看到發(fā)生了名為ArrayStoreException的異常。這是怎么發(fā)生的?必須改變什么?有可能解決這個問題嗎?
對出現(xiàn)這種異常的唯一原因是Java在運行時管理別名。只有在運行時,它才能知道第一個應(yīng)該是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ōu)閅的對象時,在上面的第一個程序中引發(fā)了異常,但在這里沒有發(fā)生。
另外一個例子:
//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);
}
}在這個程序中,首先創(chuàng)建兩個整數(shù)變量a和b。然后代碼檢查a和b是否相等。在下一步中,a被分配給b。再次檢查a和b是否相似。在執(zhí)行代碼時,兩個結(jié)果都將被打印為true。
如果使用兩個數(shù)組a和b而不是整數(shù)變量,會發(fā)生什么?
這可以用下面給出的程序來解釋。
//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);
}
}在這個程序中,第一步創(chuàng)建兩個數(shù)組a和b。然后,與上述程序類似,檢查a和b是否相等。之后,將a分配給b,并再次檢查兩者是否相似。在執(zhí)行代碼時,可以看到第一次檢查的輸出為false,第二次檢查的輸出為true。這是因為Java別名可以工作。
結(jié)論
當多個對象的引用鏈接到同一個對象時,在Java中使用別名。別名的缺點是,當用戶寫入特定對象時,其他一些引用的所有者不會猜測該對象會發(fā)生更改。
到此這篇關(guān)于Java別名Alias是如何工作的的文章就介紹到這了,更多相關(guān)Java別名Alias內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)elasticsearch 查詢操作(RestHighLevelClient 
這篇文章主要給大家介紹了SpringBoot如何實現(xiàn)elasticsearch 查詢操作,文中有詳細的代碼示例和操作流程,具有一定的參考價值,需要的朋友可以參考下2023-07-07
詳解SpringBoot開發(fā)案例之整合定時任務(wù)(Scheduled)
本篇文章主要介紹了詳解SpringBoot開發(fā)案例之整合定時任務(wù)(Scheduled),具有一定的參考價值,有興趣的可以了解一下2017-07-07
java 設(shè)計模式之State(狀態(tài)模式)
這篇文章主要介紹了java 設(shè)計模式之State(狀態(tài)模式)的相關(guān)資料,一個類的行為基于它的狀態(tài)的改變而改變。狀態(tài)模式歸屬于行為型模式,需要的朋友可以參考下2017-08-08
springboot設(shè)置加載靜態(tài)資源的路徑(spring.resources.static-locations)
這篇文章主要介紹了springboot設(shè)置加載靜態(tài)資源的路徑方式(spring.resources.static-locations),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Java如何使用itext向PDF插入數(shù)據(jù)和圖片
最近項目中使用到Java實現(xiàn)寫入PDF文件,這篇文章主要給大家介紹了關(guān)于Java如何使用itext向PDF插入數(shù)據(jù)和圖片的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-01-01
spring-data-jpa中findOne與getOne的區(qū)別說明
這篇文章主要介紹了spring-data-jpa中findOne與getOne的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Springboot實現(xiàn)阿里云通信短信服務(wù)有關(guān)短信驗證碼的發(fā)送功能
短信驗證碼是通過發(fā)送驗證碼到手機的一種有效的驗證碼系統(tǒng)。主要用于驗證用戶手機的合法性及敏感操作的身份驗證。下面通過本文大家分享Springboot實現(xiàn)阿里云通信短信服務(wù)有關(guān)短信驗證碼的發(fā)送功能,一起看看吧2017-08-08

