2013-09-26 44 views
0

我有兩個關於Java的非常基本的問題:導入包和使用實例變量

首先,爲什麼導入java.awt。*不會導入java.awt.geom。* ? java.awt中的java.awt.geom中的所有內容都不是?我認爲是這樣,從包裝的名稱來判斷。

其次,我的教授告訴我這個矩形制造者項目的事情,直接訪問實例變量是不好的,我應該使用訪問器方法。這是爲什麼?這只是慣例嗎?例如:

Rectangle rectangle = new Rectangle(1, 2, 3, 4); 

int tallness = rectangle.height; //"bad" 

int tallness = rectangle.getHeight(); //"good" 

這兩個都是有效的,並且按我的理解做同樣的事情。唯一的區別是前者感覺更快。

此外,爲什麼訪問者出現拼寫錯誤在本網站的拼寫檢查? (或者Chrome的拼寫檢查器)

回答

0

爲什麼導入java.awt。*不會導入 java.awt.geom。*?並不是java.awt.geom中的所有內部 java.awt?我認爲是這樣,從包裝的名稱來判斷。

包的名稱具有誤導性。它們的名字如java.awtjava.awt.geom,但這些名稱實際上完全不同。在Java中,並沒有真正的「包層次結構」。

import java.awt.*; 

導入所有java.awt包內。由於java.awt.geom是不同類的不同包,因此您也必須導入該包。分層名稱主要用於組織!

直接訪問實例變量很糟糕,我應該使用accessor方法代替。這是爲什麼?這只是慣例嗎?

什麼索蒂里奧斯Delimanolis談到封裝是好的,但我認爲最好的解釋是,在面向對象編程,你最程序員負責決定用戶(或使用你的包程序員)是什麼允許使用來處理類的成員變量。

這就是爲什麼它的約定,以使成員變量private;存儲在對象中的數據是Objet公司的責任,這是你的工作,作爲一個程序員,以確保通過正確定義的工作方法與該對象的接口。所以,如果你想讓某人允許直接改變一個對象的數據,你可以做一個set的方法來做到這一點。

考慮這樣的事情:

Pizza myPizza = new Pizza(18) //18-inch pizza. Yum! 

當我這樣做,比薩餅將計算其他成員變量如numSlices(目前爲1,因爲它是完整無缺的)和pizzaLeft(這是(18/2)^ 2 * pi英寸)。哪些更有意義?

myPizza.pizzaLeft -= 50; //50 inches of pizza eaten 
myPizza.pizzaLeft; //returns about 204.47 

myPizza.slice(8); // cut into 8 pieces which are about 32 square inches each 
myPizza.eat(1); // eat one slice 
myPizza.getPizzaLeft(); //returns about 222.47 

既然你正在處理一個比薩餅,它更有意義,只是切成片,吃塊。比薩餅對象本身將負責計算諸如pizzaLeft之類的東西或諸如slicesLeft之類的變化,並且與該類接口的人看不到它。

這是因爲這個原因,成員變量通常設置爲private,這意味着您必須使用訪問器方法。

我希望這會有所幫助。

+0

那麼這是否意味着Rectangle類中的實例變量是公共的? –

+0

如果你能夠以這種方式操作它們: int tallness = rectangle.height; 然後是的,他們被宣佈爲公開。通常這些將被設置爲私人,迫使您使用: int tallness = rectangle.getHeight(); –

0

當您編寫java.awt.*時,它只會導入awt中存在的類包 如果某些包存在於一個包中,它將不會導入。 java.awt.geom在這種情況下GEOM是另一個軟件包,因此導入你需要做的java.awt.geom.*

點擊here有關包

1

首先的更多信息的所有類,那爲什麼進口java.awt中。*不會同時導入java.awt.geom。*? java.awt中的java.awt.geom中的所有內容都不是?

要獲得軟件包的所有類GEOM你必須寫java.awt.geom.*

我的教授告訴我這個矩形Maker項目件事直接訪問實例變量是壞的,並我應該使用訪問器方法。

是的,你的教授是正確的。

原因是數據封裝,

  • 限制對某些對象的 組件的訪問的語言機制。
  • 一種語言結構,便於將數據與在該數據上運行的方法(或其他函數)捆綁在一起。

瞭解更多關於Encapsulation

0
int tallness = rectangle.height; //"bad" 

int tallness = rectangle.getHeight(); //"good" 

這是因爲在後一種情況下,使用您的代碼的其他程序員將無法通過像代碼分配給它的隨機值來改變rectangle.heightrectangle.height= 5;如同你將封裝高度變量通過獲取器設置器通過聲明方法private