作為 Codegym 大學課程一部分的導師授課片段。報名參加完整課程。
“你好,阿米戈!聽說你已經掌握了很好的方法?”
“嗨,Rishi。是的,我已經成功破解了那個老師的詭計。我會說它還不錯,但你會告訴我,‘不,不!你什麼都沒弄清楚。 '"
“你明明跟某些老師聊的太久了,估計是和迪亞哥聊的太多了。總之……我還是希望你對方法的理解足夠好,畢竟今天我要教你一些有助於勾畫方法的神奇詞彙。” ‘勢力範圍’。”
“聽起來很有趣。”
“其實,這一切都很簡單。在每個方法之前,程序員可以指定所謂的訪問修飾符。這些包括以下關鍵字:public
, protected
, private
。
“這些訪問修飾符讓您可以限制其他類對方法的訪問。
“例如,如果您private
在方法聲明之前寫關鍵字,則只能從聲明它的同一個類中調用該方法。關鍵字public
允許從任何類的任何方法訪問標記的方法。
這樣的修飾符一共有3個,但是一個方法的訪問有4種。這是因為沒有訪問修飾符也意味著一些事情。這是一個完整的表格:
從...訪問 | ||||
---|---|---|---|---|
修飾符 | 任何班級 | 兒童班 | 它的包裝 | 它的班級 |
public |
是的 | 是的 | 是的 | 是的 |
protected |
不 | 是的 | 是的 | 是的 |
沒有修改器 | 不 | 不 | 是的 | 是的 |
private |
不 | 不 | 不 | 是的 |
“這裡是訪問修飾符的完整解釋:
1.public
修改器
可以從程序的任何地方public
訪問用修飾符標記的方法(或變量,或類)。這是最高程度的開放——沒有限制。
2.private
修改器
用修飾符標記的方法(或變量,或類)private
只能從聲明它的同一個類中訪問。對於所有其他類,標記的方法(或變量)是不可見的。就好像它不存在一樣。這是最高級別的限制——只有它自己的類。
3.無修飾符(默認修飾符)
如果一個方法(或變量)沒有用任何修飾符標記,那麼它被認為具有“默認修飾符”。具有該修飾符(即根本沒有)的變量或方法對於聲明它們的包中的所有類都是可見的。並且只對他們。這個修飾符有時也被稱為package-private
,暗示對變量和方法的訪問是對它們的類所在的整個包開放的。
4.protected
修改器
如果方法用修飾符標記protected
,則可以從同一個類、同一個包和後代(繼承聲明該方法的類的類)訪問它。我們將在 Java Core 探索中更詳細地分析這個主題。”
“很有趣,但我不確定我是否可以立即將這些修改器放在所有正確的地方。
“您會逐漸到達那裡。無需提前擔心。在完成 Java 語法任務之前,您可以在所有public
方法(以及類和實例變量)上使用修飾符。您將需要當我們開始積極學習 OOP 時,其他修飾符。”
“你能更詳細地解釋一下為什麼需要訪問修飾符嗎?”
“對於同時由數十名和數百名程序員編寫的大型項目,它們變得必不可少。
“有時會有這樣的情況,當一個程序員想要將一個過大的方法拆分成多個部分並將部分代碼移動到輔助方法中。但與此同時,他或她又不希望其他程序員調用這些輔助方法,因為相應的代碼可能無法正常工作。”
“所以他們想出了這些訪問修飾符。如果你用private這個詞標記一個輔助方法,那麼除了你的類之外沒有任何代碼可以看到你的輔助方法。”
“我想我明白。”
static
關鍵詞
“還有另一個有趣的關鍵字。它是static
。不出所料,它使方法成為靜態的。”
“這意味著什麼?”
“稍後我會告訴你更多關於它的信息。別擔心。現在,只要試著記住一些關於靜態方法的事實。
事實 1.靜態方法不附加到任何對象,而是屬於聲明它的類。要調用靜態方法,您需要編寫:
ClassName.MethodName()
靜態方法的例子:
班級名稱 | 靜態方法名 | |
---|---|---|
Thread.sleep() |
Thread |
sleep() |
Math.abs() |
Math |
abs() |
Arrays.sort() |
Arrays |
sort() |
如果從其類中調用靜態方法,則可以省略靜態方法名稱之前的類名。這就是為什麼您不需要在調用的每個靜態方法的名稱之前寫的原因。Solution
事實 2.靜態方法不能訪問它自己類的非靜態方法。靜態方法只能訪問靜態方法。結果,我們將要從main
靜態方法調用的所有方法聲明為靜態。”
“這是為什麼?”
“當你開始學習 OOP 並了解靜態方法的工作原理時,你會自己回答這個問題。在那之前,請相信我。
throws
關鍵詞
“您可能在方法聲明中看到了另一個關鍵字——關鍵字throws
。與訪問修飾符和static
關鍵字不同,此關鍵字位於方法參數之後:
public static Type name(parameters) throws Exception
{
method body
}
“這是什麼意思?”
“我必須再次告訴你,當我們學習異常時(第 15 級),你將在稍後了解它的真正用途。
但是從表面上看,我們可以說用throws
關鍵字標記的方法可以拋出錯誤(異常),這意味著該類(以及繼承它的類)的實例Exception
。如果一個類中可能出現幾種不同類型的錯誤,那麼您需要列出每一種錯誤,並用逗號分隔。”
“聽起來神秘莫測!我得等14級了。”
主要方法
“現在讓我們仔細看看 main 方法。您已經了解聲明方法的行,其中包含所有修飾符,將影響如何從其他類和方法調用此方法。此外,它會影響類型result 該方法將返回並指示在運行時可能出現的錯誤。
“這樣的一行稱為方法聲明,一般格式如下:
access modifier static Type name(parameters) throws exceptions
哪裡access modifiers
被替換為public
, protected
, private
, 或什麼都沒有;
如果方法是靜態的,則static
出現關鍵字(非靜態方法不存在)
Type
是返回值的類型(void
如果沒有結果)
“現在你對方法聲明中所有這些詞的含義有了更好的理解main
:
public static void main(String[] args) throws Exception
main
方法
“好吧,現在我意識到可以從任何類訪問該main()
方法,如關鍵字所示public
。該方法是靜態的,因此可以顯式調用它Solution.main()
。”
“該方法返回什麼結果main()
?”
“一點都沒有!結果類型是void
。它有點像一個空類型,一個佔位符。”
“main()
括號裡是什麼?”
“嗯……事實證明,該main
方法採用參數(!)。它們作為字符串數組傳入。”
“沒錯。參數名稱args
在我們的腦海中暗示了‘參數’。當程序啟動時,您可以向它傳遞參數——一個字符串數組。它們將包含在方法args
的數組中main()
。”
“哇哦!第一次看到的時候還納悶呢,後來就習慣了,想都沒想就開始寫參數表了。”
“我們都去過那裡。最後,方法Exception
中可能會出現未處理的錯誤(或其後代)main()
。我們知道這要歸功於throws Exception
聲明的一部分。”
“謝謝你,Rishi。我不是什麼都明白,但這很有趣。”
“不客氣。我敢肯定,你會逐漸理解所有這些微妙之處。”
GO TO FULL VERSION