[英]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.