“教授就是出不來,講慣了的老老師都是這樣,他能教給你的,書本上找不到的,聽是學不會游泳的。”到游泳講座。只有當你熟悉這個主題並且幾乎和你的教授一樣了解時,講座才有用。”
“不過,他的課還是有用的。”
“是的。我的意思是,我們希望他們是。你聽到的關於這個主題的觀點越多,你就越接近真相。當你只聽到一個時,你所能做的就是相信或不相信。好吧,讓我們回去做生意吧。”
“讓我們看一下我之前給你看過的照片。”
┏
┃public class Variables
┃┏
┃┃{
┃┃ private static String TEXT = "The end.";
┃┃ ┗━━━━━━━━━━━━━━━━━━━┛
┃┃ public static void main (String[] args)
┃┃ ┏ ┗━━━━━━━┛
┃┃ ┃ {
┃┃ ┃ System.out.println("Hi");
┃┃ ┃ String s = "Hi!";
┃┃ ┃ ┏┗━━━━┛
┃┃ ┃ ┃ System.out.println(s);
┃┃ ┃ ┃ if (args != NULL)
┃┃ ┃ ┃ {
┃┃ ┃ ┃ String s2 = s;
┃┃ ┃ ┃ ┗━━━━┛ ┃┃ ┃ ┃ ┏
┃┃ ┃ ┃ ┃ System.out.println(s2);
┃┃ ┃ ┃ ┗
┃┃ ┃ ┃ }
┃┃ ┃ ┃ Variables variables = new Variables();
┃┃ ┃ ┃ System.out.println(variables.instanceVariable);
┃┃ ┃ ┃ System.out.println(TEXT);
┃┃ ┃ ┗
┃┃ ┃ }
┃┃ ┗
┃┃ public String instanceVariable;
┃┃ ┗━━━━━━━━━━━━━━━┛
┃┃ public Variables()
┃┃ {
┃┃ instanceVariable = "Instance variable test.";
┃┃ }
┃┃}
┃┗
┗
1. 在方法中聲明的變量從其聲明開始到方法結束一直存在(可見)。
2. 在代碼塊中聲明的變量一直存在到代碼塊結束。
3. 方法的參數一直存在,直到方法返回。
4. 對像中的變量存在於包含它們的對象的整個生命週期中。它們的可見性也由特殊的訪問修飾符控制。
5. 靜態(類)變量在程序運行的整個過程中都存在。它們的可見性也由訪問修飾符定義。”
“對,我記得這張照片。”
“太好了,讓我提醒你一些關鍵點。”
“在方法內部聲明的所有變量都存在(可見)從聲明它們的位置到方法結束(示例 1)。”
“如果在代碼塊中聲明了一個變量,它會一直存在到代碼塊的末尾(示例 2)。”
“如果變量是方法參數,則它存在(可見)在方法的整個主體中(示例 3)。”
》如果一個變量是一個實例變量(例4),它就鏈接到某個對象,只要該對象存在就存在。如果不存在對象,那麼就沒有該變量的實例。 您可以訪問該變量(即變量是可見的)從類的所有方法,無論它們是在它之前還是之後聲明的。為每個對象創建一個新變量。它 獨立於其他對象。 您不能從靜態方法訪問實例變量” _
“如果一個變量被聲明為靜態的,即用關鍵字static標記,只要它的類存在,它就存在。JVM 通常在第一次使用時將一個類加載到內存中。這也是靜態變量被初始化的時候。”

“上面的例子聲明了 Cat 類,它有四個變量:a、b、s(非靜態變量)和 count(靜態變量)。如果我們創建這個類的多個對象(比如三個),每個它們將包含自己的類非靜態變量實例。 靜態變量由類的所有對象共享。從技術上講,它甚至不在這些對象內部,因為它甚至在創建任何 Cat 對象之前就存在了。”
“如果我們將變量聲明為靜態,會發生以下情況s
:”

“好的。我想我明白了。”
“你能聲明同名變量嗎?”
“不是在方法內部。在方法內部聲明的所有變量都必須具有唯一的名稱。方法的參數也被視為局部變量。”
“成員變量呢?”
“每個類的成員變量也必須是唯一的。”
“但有一個例外:局部變量和成員變量的名稱可以相同。 ”
“如果我們改變這樣一個變量,那麼兩個同名變量中的哪一個會被改變?”
“如果我們的代碼中有多個可見(可訪問)變量——比如說,一個實例變量和一個局部變量——局部變量將被訪問。”
class Main
{
public int count = 0; // Declare an instance variable
public void run()
{
count = 15; // Access the instance variable
int count = 10; // Declare a local method variable
count++; // Access the method variable
}
}
“這段代碼聲明了兩個計數變量。第 3 行聲明了一個實例變量,第 8 行聲明了一個局部變量。”
“這是執行 run 方法時發生的情況:”
“在第 7 行,我們訪問實例變量並將值 15 賦給它”
“在第 8 行,我們聲明(創建)一個新的局部變量:count
。它屏蔽了實例變量。局部變量是該方法中所有後續代碼將看到(訪問)的內容。”
“知道了。”
“局部變量掩蓋了實例變量。換句話說,局部變量是要訪問的變量。但是,您也可以訪問實例變量。這樣做會稍微複雜一些。”
靜態(類)變量
|
非靜態(實例)變量
|
“關於靜態方法和靜態變量,你還能告訴我什麼?”
“靜態方法和變量不鏈接到類的對象;它們鏈接到類本身。如果我們創建十個Variables對象(參見本級別開頭的示例),我們將有十個instanceVariable變量(每個變量一個)對象)和只有一個共享(靜態)變量TEXT。”
“我有個問題。”
“靜態方法和非靜態方法有什麼區別?”
“讓我們來看看非靜態方法是如何工作的:”
代碼是什麼樣的
|
到底發生了什麼
|
“當你使用<object> dot <method name>調用一個方法時,你實際上是在調用一個類方法並將同一個對像作為第一個參數傳遞。在方法內部,該對象稱為'this'。所有操作在在此對象及其數據上執行方法。”
“哇!這就是它的工作原理!”
“這就是靜態方法的工作原理。”
代碼是什麼樣的
|
到底發生了什麼
|
“當你調用一個靜態方法時,沒有對像被傳遞給它。換句話說,'this'等於null。這就是為什麼靜態方法不能訪問非靜態變量和方法(因為它沒有'this'可以傳遞這些方法)。”
“嗯。我想我明白了。至少有一點。”
“迭戈叔叔來了……還有他的任務。”
GO TO FULL VERSION