簡體   English   中英

將參數傳遞給方法時會發生什么操作?

[英]What operations take place when we pass argument to method?

我知道,如果我通過:

  • 基本類型,則將發送元素的副本
  • 對象類型,然后將發送參考副本

我假設(請驗證):

  • 參考大小等於對象元素大小
  • 對象大小是它包含的所有原始類型和引用類型大小的總和
  • 靜態變量不包含在對象中
  • 如果原始類型不同,則結果類型始終至少是兩種類型中最寬的。

我不確定如果通過了會怎樣:

  • 'null'(空引用?)
  • 對象類型不同(第一個公共父對象?)(如何找到???)
  • 枚舉(int的副本?)
  • 匿名班

如果您在談論內存中的方法調用(而不是RMI之類的東西),則所有引用的大小都相同。 它們是堆上對象的句柄。 對象的大小無關緊要。

假設您可以編譯代碼,則原始類型將以某種方式與調用方法匹配。 通過顯式強制轉換或自動擴展,這取決於您正在執行的操作(您是使用int調用long方法,還是使用long調用int方法)。

無論引用是枚舉,轉換為不同的對象類型(對象相同,只是類型引用不同)還是匿名類,引用始終是相同的。 在所有情況下,它都是對堆上對象實例的引用。

匿名類(或任何未聲明為靜態的內部類)的確隱含對其父級的隱式引用。

Null表示沒有引用,所以我不知道大小,但是JVM將對此進行內部表示。 我懷疑實際上,就內存數量而言,它實際上小於對象引用,但是它可能會更小,尤其是在JavaME中。

應該指出的是,在實踐中,java開發人員對這些事情的考慮不多。 只有實現JVM的人才會關心這些問題(例如,引用的大小)。 您無法使用該語言對其進行任何操作,因此,如果由於該原因而導致性能問題,請選擇其他語言。

您為什么不簽出Google?

http://www.yoda.arachsys.com/java/passing.html

另外-Java中沒有sizeof。

我不確定您在使用“參考大小”點尋找什么,但是我可以肯定地回答一些問題:

如果原始類型不同,則結果類型始終至少是兩種類型中最寬的。

不太正確。 如果指定int並傳入long,則必須向下轉換為int,將傳遞的是int。 如果傳遞一個字節,它將自動向上轉換為一個int。 它將始終通過一個int。

對象大小是它包含的所有原始類型和引用類型大小的總和

還有一個函數指針表和其他一些東西,我不認為這是直接的。

靜態變量不包含在對象中

我會說它們不包含在對象實例中,但是對象實例中可能有一個指向它們的指針(在我所討論的指針表中)...但是我不這么認為。

'null'(空引用?)

如果您傳遞null,它將像c(我相信指向0或其他預定義的錯誤位置的指針,表示“ Null”)的行為一樣,但是您無權訪問該函數,除非將其與null進行比較或獲得NPE,您無法像在c中那樣以其他方式處理它

對象類型不同(第一個公共父對象?)(如何找到???)

對象中存儲有元數據以告訴您它是什么類型,但更重要的是,有一個指針表,因此調用的“ Correct”方法始終只是指針的取消引用,而您沒有找出您實際擁有的類並掃描“擴展”樹以找到給定方法的第一個實現,而不管您的類被強制轉換為哪種類型,都有一個指向正確的“ toString”方法的指針使用。

匿名班

根據父類的類名稱為它們賦予魔術名稱,並編譯為常規類,但有一些特殊的例外。

暫無
暫無

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

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