簡體   English   中英

為什么在Java中實例化新對象時必須兩次鍵入類名稱?

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

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