[英]Why do we have to type the class name twice when instantiating a new object in Java?
在Java中創建新對象時,使用以下語法:
ClassName instancename = new ClassName();
我的問題是為什么我們必須在開頭鍵入類名? 為什么根本沒有'object'關鍵字?
例:
object instancename = new ClassName();
在左側:
ClassName instancename
ClassName
聲明變量instancename
類型(=類)。
在右邊:
new ClassName();
ClassName()
正在調用一個名為ClassName()
的(構造方法)方法。
因此,您同時要做兩件事。
ClassName instancename; // declaring type
instancename = new ClassName(); // invoking method
你的例子:
ClassName instancename = new ClassName();
只是縮短了兩條指令的樣式。
獲取類的實例還有其他樣式-例如newInstance()
或getInstance()
。
也就是說:類型的聲明和實例化的方法是分開的。 為了自己的目的需要它們。
Object是所有java類的父類。 第一次上課時,
ClassName instancename
它為該變量名創建內存引用,但該引用尚未指向實際對象,因為尚未在內存中創建它。 當您第二次打電話時,
instancename = new ClassName();
它調用ClassName的默認構造函數,該構造函數分配內存並實際在內存中創建對象。
使用多個類時,創建ClassName實例而不是object更為安全。 如果使用對象聲明類,則通常將不得不頻繁使用類型轉換,因此代碼將得以編譯,因為編譯器將知道要查找哪個類以查找相應類的方法。
我的問題是為什么我們必須在開頭鍵入類名? 為什么根本沒有'object'關鍵字?
您正在做兩個“事情”,正在創建一個可以保存ClassName
的引用,並創建ClassName
的實例。
許多語言可以從另一種語言推斷出一側,但是Java(默認情況下,請參閱Lombok )不能。 從內存開始原本是通過這種方式來使語言規范保持簡單的。
有許多新的語言可以理解所創建對象的類型。 Java是其中之一。
new ArrayList<String> ()
Java知道結果的類型是ArrayList<String>
。 但是,在Java中,您不必將結果分配給該類型的對象,可以在層次結構中一直使用任何類型,直到Object
為止-實際上,甚至鼓勵您這樣做。 最常見的是,您將向上移動到最近的interface
(在這種情況下為List<String>
),但向上移動可能會很有用( Iterable<String>
在這里可以很好地工作)。 在這種情況下,推薦的技術是:
List<String> myList = new ArrayList<String> ();
或者-在Java 7中更簡潔
List<String> myList = new ArrayList<> ();
要么
Iterable<String> myList = new ArrayList<> ();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.