簡體   English   中英

參考變量類型的重要性是什么?

[英]what is the importance of reference variable type?

Dog dogObj = new Dog();

是的,我知道我們必須為引用變量提供合適的類型,以便它可以為對象的位置地址或我們放置的內容保留位置。

參考變量存儲位於寄存器堆中的真實對象的8字節地址(編號)。 因此,它的工作只是保留該位置的地址。 那為什么需要一個類型呢? 給它一個類型后,這8個字節會發生什么變化。 即使沒有類型,它仍然可以將8字節數據指向該位置。

這背后的細節是什么?

如果您想要一個僅包含任何參考值的變量,則很容易做到:

Object dogObj = new Dog();

但是,如果您隨后嘗試致電:

dogObj.bark();

...編譯器不知道您在說什么,您應該不會感到驚訝。 編譯器使用變量的聲明類型來知道如何使用它……就這么簡單。

閱讀此: http : //www.javaranch.com/campfire/StoryCups.jsp

然后閱讀其后續內容: http : //www.javaranch.com/campfire/StoryPassBy.jsp

但基本上,您需要給它一個類型,以便編譯器知道它是該類型。 請注意,您也可以執行此操作,這基本上就是您正在談論的內容:

Object dogObj = new Dog();

但是,您只能在該變量上使用Object中定義的方法,因為編譯器無法保證某些Object是否為更特定的類型。

編輯:假設您有兩個班級,狗和貓。 Dog具有bark()方法,而Cat具有meow()方法。

您可以這樣做,因為正如您所說,引用就是引用:

Object dog = new Dog();

但是,您將無法執行此操作:

dog.bark();

即使Dog類具有bark()方法,並且dog變量是Dog的實例, 編譯器也不知道 實際上,編譯器知道什么。 畢竟,您也可以這樣做:

Object dog = new Dog();
dog = new Cat();
dog.bark(); //good thing this is a compiler error!

您可能會想,為什么編譯器無法弄清楚呢? 原因是這樣的代碼可能會發生:

Object dog = new Dog();
if(Math.random() < .5){
   dog = new Cat();
}
//what type is dog now??

因此,編譯器只能保證Object是變量的類型。 這就是為什么需要為每個變量指定類型。

請注意,您還可以強制轉換變量以明確告訴編譯器什么是某種類型:

Object dog = new Dog();
dog = new Cat();
((Cat)dog).meow(); //this will now work, since the compiler knows dog is a Cat!

但是請注意,因為如果輸入錯誤,則會出現運行時錯誤:

Object dog = new Dog();
dog = new Cat();
((Dog)dog).bark(); //this won't work, since dog is actually a Cat!

我強烈建議您編寫自己的小測試程序,該程序運行類似於這些示例的代碼,這樣您可以更好地了解發生了什么。

聲明不僅是內存分配。 不使用類型的OOP不會是OOP,您不是要操縱原始字節,而是要操縱具有精確角色和精確邏輯的對象。 那就是上課的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM