簡體   English   中英

C ++和Java中的靜態變量

[英]Static variables in C++ and Java

我有一個問題:假設我們有這個功能:(在C ++中)

int& f() {
    static int x = 0;
    return x;
} // OK

int& h() {
    int x=0;
    return x;
} // ERROR

為什么h會出錯? 是因為關鍵字static 我發現static關鍵字讓我的x變量在我的函數終止后生效。 所以我仍然可以從外部訪問該內存位置(另一個功能或主要?對嗎?)。 而是在h終止后丟失int x = 0 對? 我不確定我真的得到了它!

那Java呢? 我讀過我不能在方法中聲明static變量,只能在類中聲明。

謝謝。

在C ++中, static是該語言最重載的關鍵字之一。 你在這里使用的意思是這樣的:

在具有static說明符的函數內定義的變量具有靜態存儲持續時間 - 它占用程序的整個運行時的相同空間,並在對函數的不同調用之間保持其值。 因此,您可以安全地返回對它的引用,因為變量總是在那里支持引用。

當函數調用返回時,正常(非static )函數局部變量被銷毀,因此引用變為懸空 - 它不引用任何有效的東西。 使用它會導致未定義的行為。

Java根本沒有函數范圍的static變量(它沒有關鍵字static含義)。 這就是為什么你不能在那里宣布它。

C ++和Java都具有static關鍵字的“類范圍”含義。 當使用static關鍵字聲明類的成員時,意味着該成員未綁定到該類的任何實例,而只是一個全局變量,其標識符位於類的范圍內。

Static關鍵字在C ++和Java中幾乎用於相同的目的。 但是有一些不同之處。

1)靜態數據成員:與C ++一樣,Java中的靜態數據成員是類成員,並在所有對象之間共享。

2)靜態成員方法:與C ++一樣,聲明為static的方法是類成員,具有以下限制:

  • (i)他們只能調用其他靜態方法。
  • (ii)他們只能訪問靜態數據。
  • (iii)他們無法訪問thissuper

與C ++一樣,可以在不創建對象的情況下訪問靜態數據成員和靜態方法。 可以使用類名訪問它們。

3)靜態塊:與C ++不同,Java支持一個特殊的塊,稱為靜態塊(也稱為靜態子句),可用於類的靜態初始化。 靜態塊中的此代碼僅執行一次(第一次創建該類的對象或第一次訪問該類的靜態成員時(即使您從未創建該類的對象))。

4)靜態局部變量:與C ++不同,Java不支持靜態局部變量。 如果使用,Java程序將在編譯時失敗。

5)靜態類:在Java中也可以使類成為靜態。在java中,我們不能使頂級類靜態化。 只有嵌套類可以是靜態的。

  • 嵌套的靜態類不需要引用外部類,但非靜態嵌套類或內部類需要外部類引用。
  • 內部類(或非靜態嵌套類)可以訪問外部類的靜態和非靜態成員。 靜態類無法訪問外部類的非靜態成員。 它只能訪問外部類的靜態成員。

    參考: www.geeksforgeeks.org

函數中C ++中的靜態變量是函數范圍內的持久變量。 在Java中,您不能在方法中使用靜態變量。 靜態變量是類的變量,而不是其實例。

對於Java方面,你是對的。 Java中的靜態變量必須在類級別而不是在方法內部聲明。

如果你需要調整靜態變量的范圍,那么你可能會有一些嚴重破壞的體系結構,但你可以通過使用內部類來存儲靜態變量來在一定程度上完成它。

暫無
暫無

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

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