2010-11-29 34 views
7

我開始學習一種功能性編程語言(SML),並用這種語言編寫了一點。然後我開始檢查Java,並且我有這樣的感覺,即類字段看起來像全局變量,它們使編程複雜化。例如,我必須閱讀方法,看看哪一個讀/寫他們等類中的字段是否與全局變量類似?

從我聽到在編程語言像C使用全局變量是一個壞主意。 但是,Java類字段呢,它們不是像所有類方法的全局變量那樣嗎?使用字段是不好主意嗎? (或者,也許我已經瞭解錯誤的東西或我在「錯誤的方式」Java編程)

回答

0

但在Java整個程序不是使用一個單獨的類書寫。它是常量(公共靜態最終字段),就像全局變量一樣。 我的建議是,你不專注於每一個單一的部分的Java,什麼好的java是它作爲一個整體提供。因爲那是當你看到Java的這些特性的每一個特性的時候。

1

不,類字段不是全局變量,雖然它們可能會被濫用於相同的目的。

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

類字段在類範圍內。他們往往被封裝在一個班級,私人訪問,防止從課堂以外的訪問。這限制了對小部分代碼的直接訪問和修改。

2

我會說你不太瞭解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對象是沒有意義的,因此您只需將其所有方法定義爲「公共靜態」,並在您需要的其他類中訪問它們。

我希望我已經讓你懷疑。無論哪種方式,我建議你閱讀一下面向對象的程序設計,或許可以找一本教授Java的書,重點關注面向對象(OO),儘管這不是一個難以理解的概念,但可能很難如果你來自非OO背景,那麼習慣它並正確地用OO語言進行編程。

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

Zepee

+0

我知道靜態和非靜態字段之間的差異,並且每個對象都有自己的狀態。讓我以其他方式說。假設你在一個基本上有很多函數的文件中有2000行C代碼,在這個文件中使用這些函數將使用的全局變量是否好?據我所知,答案是否定的(因爲你不知道哪些函數寫/讀每個全局變量)。同樣的情況發生在類上,一個類可以有2000行代碼,在這個類的作用域中,這些字段就像全局變量。是不是像C代碼示例這樣的壞事? – 2010-11-29 20:13:53

+0

我在OO語言之外沒有那麼多的經驗,但是它似乎是你指出的問題,不知道什麼改變了它自身適用於公共變量的事實。您應該擔心哪些對象可以直接訪問並更改變量。這是面向對象封裝的基本原則之一,它說明對象/類只應該知道其他事情做什麼,但不知道它們是如何做的。因此,通常的做法是將領域設置爲私人領域,並且僅在每個對象可以控制對外部世界的透明度的地方提供獲取者/設置者。 – Zepee 2010-11-30 04:28:22

+0

但是,每個課程都需要完全透明。即使你不知道你的長相,你的存在有多好?換句話說,沒有類變量,你會如何區分對象A和對象B? 你不應該擔心你的對象有幾種方法訪問它的字段,只有其他對象訪問它的字段。 類變量不僅不壞,因爲它們是必需的,它們定義了一個對象,並且能夠擁有一個具有它自己的一組屬性的類的多個實例,這正是爲什麼OO語言首先被創建的原因。 – Zepee 2010-11-30 04:31:12

3

Class級變量是在類的上下文中的全局變量。這是爲了保持某種狀態,你需要把它們放在某個地方。在某些情況下,Class級別變量被認爲是不好的做法,儘管特別是當它們不是不可變的時候。

3

我認爲「類變量」是指「靜態變量」。

你問「他們是不是像所有類方法的全局變量?」。

是的,你是對的。在課堂上,他們的表現就像全局問題一樣。

區別在於你的類不應該像整個程序那樣複雜,因此它會更容易理解和修復由它們引起的問題。
越少的代碼就可以修改變量,你必須考慮的情況越少。全局變量可以通過任意未知的代碼進行修改。

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

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