[英]Why use public and private to static members and method?
我正在學習Java,我只是想知道為什么當一個方法或成員是靜態的時,為什么要使用public和private? 當使用static時,它們是類方法和類成員,可以在不創建對象的情況下用於其他類,因此有必要使用public和private嗎? 希望能有所幫助。 抱歉,這個問題對某些人來說太簡單了。
字段或方法的可訪問性與它是否是靜態的這一事實正交。
您可以有一個可以從外部訪問的靜態方法,而一個靜態方法只能從類本身內部使用(由其他靜態或非靜態方法使用)。 字段也是如此。
例如:
// not visible from the outside
private static final long MILLISECONDS_IN_A_MINUTE = 1000L * 60 * 60;
public static Date addMinutes(Date d, int amount) {
return addMillis(d, MILLISECONDS_IN_A_MINUTE * amount);
}
// not visible from the outside
private static Date addMillis(Date d, long amount) {
return new Date(d.getTime() + amount);
}
我正在學習Java,我只是想知道為什么當一個方法或成員是靜態的時,為什么要使用public和private?
我相信您的問題是由於普遍的誤解,即訪問修飾符是針對instance的 ,但事實並非如此!
如果兩個私有實例屬於同一類,則它們可以彼此訪問。
換句話說, 訪問修飾符在類級別上起作用 。 由於靜態成員也屬於某個類,因此在它們上也具有訪問修飾符是有意義的。
只能由同一類中的代碼使用的靜態方法(或變量)(如JB Nizet的示例中)應為私有,而任何類中的代碼可以使用的靜態方法或變量應為公共。
這不是必需的,但是可以有static
方法和數據成員僅供內部使用。
例如,如果您想要該類的每個實例的唯一ID:
class Foo
{
private static int nextId = 0;
private static int generateId() { return ++nextId; }
private int id;
public Foo()
{
id = generateId();
}
}
如您所見,在類外不需要nextId
和generateId()
也不必在類外使用它們。 該類本身負責生成id。 但是您需要它們是static
(好吧,您需要nextId
是static
,但是還可以使generateId()
靜態的,因為它不訪問非靜態成員)。
每當創建對象Foo
, static
計數器都會增加,因此對於該類的每個實例,您將獲得不同的ID。 (此示例不是線程安全的)
假設您有一個靜態的public方法,並且此方法必須訪問private屬性。 此私有屬性也必須是靜態的。 私有靜態存在的一個原因。
范例:
public class Test {
private static int myattr = 0;
public static void foo() {
myattr = 2;
}
}
上面, myattr
必須是靜態屬性,才能在foo()
方法中使用它。
是的,這是必需的。
如果您有一個靜態方法,並且想在該方法中使用私有變量,那么您也需要將其聲明為靜態。
或者,您希望靜態變量對其他軟件包不可見,那么不要將其聲明為公共變量。
從我的記憶中,並不需要它 。 但是,從根本上講,任何一種編程語言中的公開手段都可以由外部文件使用。 使用private只能在該文件中使用,而static意味着您不能更改該引用的值。 無論這些是函數還是變量,都適用相同的規則。 我可能會離開。 大約一年半沒做過Java。
合並這些類型的方式由您決定。 畢竟,一個程序只是其用戶而已。 ^ _ ^
公共和私有密鑰與可見性有關:您希望其他類可以訪問哪些成員,哪些應該隱藏或封裝。 靜態成員與整個類有關,而非靜態成員對對象實例進行操作。
當將靜態方法與方法一起使用時,它不僅意味着應由其他類的成員使用。
當我們無法訪問該類的靜態方法時,該類(包含該方法)無法實例化,即無法創建該類的對象 。
在某些情況下,兩個不同的類可能具有名稱相同的靜態方法。 在這種情況下,您要使用同一類的方法,而不要使用其他類的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.