簡體   English   中英

類中的字段不是類似於全局變量嗎?

[英]Aren't fields in classes similar to global variables?

我開始學習函數式編程語言(SML)並用這種語言編寫一些程序。 然后我開始檢查Java,我覺得類字段看起來像全局變量,它們使編程變得復雜。 例如,我必須閱讀方法,以查看哪一個讀/寫它們等。

從我所聽到的,使用像C這樣的編程語言中的全局變量是一個壞主意。 但是Java類字段呢,它們不是像所有類方法的全局變量一樣嗎? 使用字段是個壞主意嗎? (或者我可能理解錯誤或者我以“錯誤的方式”Java編程)

Class級變量是Class的上下文中的全局變量。 這是為了保持一些狀態,你需要把它們放在某個地方。 在某些情況下, Class級變量被認為是不好的做法,尤其是當它們不是不可變的時。

我假設“類變量”是指“靜態變量”。

你問“他們不是所有類方法的全局變量嗎?”。

是的,你是對的。 在類中,行為像全局因素一樣。

不同之處在於,您的類不應該像整個程序一樣復雜,因此更容易理解和修復由它們引起的問題。
代碼越少,修改變量的情況就越少。 Globals可以通過任意未知代碼進行修改。

在某些情況下,讓一個類的所有實例共享一個變量(例如單例)也是絕對有意義的。 你只需負責任地使用它。

你不應該使用它們嗎?
不,你可以使用它們。 但是將它們的可見性限制在所需的最小值,因此它們不會成為“事實上的”全局變量。
如果可能的話,也讓他們最終。

我會說你不太了解Java(或任何其他面向對象語言)的工作方式。

在面向對象語言中,類表示整個程序中可能需要的不同類型的事物。 最好通過一個例子說明這一點。 讓我們在你的計划中說你要模擬汽車。

您將擁有Car類,並將創建Car類的新對象(新實例)來表示您需要的每輛新車。 汽車本身由不同的組件構成,你有輪子,電機,窗戶等。所以你將擁有每個組件的類,每個汽車對象將包含來自所有不同類的自己的一組對象,即:

Car1 {
       motor1
       window1.1, window1.2
       wheel1.1,wheel1.2
}

Car2 {
       motor2
       window2.1, window2.2
       wheel2.1,wheel2.2
}

在這種情況下,您可以將每個汽車的組件定義為類字段。 這些字段適用於所有“全局”效果,因為可以從該類中的任何方法訪問它們。 您似乎缺少的細節是此類的每個新對象都有自己的字段和方法集。 它們不共享它們,因此每個電機,一組輪子等屬於Car類的一個實例。 因此,如果在汽車類中你有一個方法,比如說,刪除所有窗口的deleteWindows(),你在car2上調用了這個方法,這就不會刪除car1的窗口了。

另一個重要細節是您可以使用多個“前綴”(方法)來定義這些變量。 首先你有公共和私人(受保護,但我不會進入)。 通過將變量聲明為私有,您說可以訪問和更改該變量的唯一對象是擁有該變量的變量。 另一方面,公共變量可以被任何其他對象訪問和更改。 它們是可訪問的,但您必須明確地說要更改該對象的變量(通過編寫objectsName.variable,在我們的例子中為car1.motor)。

您還可以擁有所有類實例共享的變量/方法。 為此,您將它們聲明為靜態(這些實際上屬於類,而不是特定於任何類的對象)。 私有/公共仍然適用,私有靜態變量只能由該類的實例(以及同一類的靜態方法)訪問,而公共變量只能由任何其他類/對象訪問。 為了從它們所屬的類外部訪問它們,可以使用ClassName.variable / method(在前面的示例中為Car.variable)。

有時你可能想要一個沒有意義的類來創建一個實例。 我發現我經常需要創建一個Maths類,其中包含我想在整個程序中使用的幾個數學運算符。 創建Maths對象沒有任何意義,因此您只需將其所有方法定義為“public static”,並在其他類中隨時訪問它們。

我希望我已經克服了你的疑慮。 無論哪種方式,我建議你做一些關於面向對象編程的閱讀,也許得到一本教授Java的書,重點關注面向對象(OO),盡管它不是一個難以理解的概念,但它可能很難如果你來自非OO背景,習慣它並用OO語言正確編程。

你可能想看看BlueJ。 它是一個Java IDE,它基本上迫使您理解和使用OO編程。 這不是我建議使用太久的東西,但它可能是一個好的開始,直到你掌握了OO基礎知識。

Zepee

不,類字段不是全局變量,盡管它們可能被濫用於同樣的目的。

可以從每個范圍訪問全局變量。 它們往往也可以在各個范圍內寫入。 這使得大型代碼庫難以理解和調試。 全局變量也會邀請nameclash。

類字段在類范圍內。 它們傾向於封裝在具有私有訪問權的類中,從而阻止從類外部訪問。 這限制了對一小部分代碼的直接訪問和修改。

但是在Java中,整個程序不是使用單個類編寫的。 它是常量(公共靜態最終字段),就像全局變量一樣。 我的建議是你不要專注於java的這一部分,java的優點在於它作為一個整體提供什么。 因為當你看到java的每個特性的傳播時。

暫無
暫無

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

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