“教授就是出不來,講慣了的老老師都是這樣,他能教給你的,書本上找不到的,聽是學不會游泳的。”到游泳講座。只有當你熟悉這個主題並且幾乎和你的教授一樣了解時,講座才有用。”

“不過,他的課還是有用的。”

“是的。我的意思是,我們希望他們是。你聽到的關於這個主題的觀點越多,你就越接近真相。當你只聽到一個時,你所能做的就是相信或不相信。好吧,讓我們回去做生意吧。”

“讓我們看一下我之前給你看過的照片。”


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 通常在第一次使用時將一個類加載到內存中。這也是靜態變量被初始化的時候。”

有關變量範圍的更多信息 - 1

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

“如果我們將變量聲明為靜態,會發生以下情況s:”

關於變量作用域的更多信息 - 2

“好的。我想我明白了。”

“你能聲明同名變量嗎?”

“不是在方法內部。在方法內部聲明的所有變量都必須具有唯一的名稱。方法的參數也被視為局部變量。”

“成員變量呢?”

“每個類的成員變量也必須是唯一的。”

“但有一個例外:局部變量和成員變量的名稱可以相同。

“如果我們改變這樣一個變量,那麼兩個同名變量中的哪一個會被改變?”

“如果我們的代碼中有多個可見(可訪問)變量——比如說,一個實例變量和一個局部變量——局部變量將被訪問。”

具有兩個計數變量的示例
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。它屏蔽了實例變量。局部變量是該方法中所有後續代碼將看到(訪問)的內容。”

“知道了。”

“局部變量掩蓋了實例變量。換句話說,局部變量是要訪問的變量。但是,您也可以訪問實例變量。這樣做會稍微複雜一些。”

靜態(類)變量
ClassName.variableName

// Here are some examples:
Cat.catsCount
非靜態(實例)變量
this.variableName

// Here are some examples:
this.catsCount

“關於靜態方法和靜態變量,你還能告訴我什麼?”

“靜態方法和變量不鏈接到類的對象;它們鏈接到類本身。如果我們創建十個Variables對象(參見本級別開頭的示例),我們將有十個instanceVariable變量(每個變量一個)對象)和只有一個共享(靜態)變量TEXT。”

“我有個問題。”

“靜態方法和非靜態方法有什麼區別?”

“讓我們來看看非靜態方法是如何工作的:”

代碼是什麼樣的
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
到底發生了什麼
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

“當你使用<object> dot <method name>調用一個方法時,你實際上是在調用一個類方法並將同一個對像作為第一個參數傳遞。在方法內部,該對象稱為'this'。所有操作在在此對象及其數據上執行方法。”

“哇!這就是它的工作原理!”

“這就是靜態方法的工作原理。”

代碼是什麼樣的
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
到底發生了什麼
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

“當你調用一個靜態方法時,沒有對像被傳遞給它。換句話說,'this'等於null。這就是為什麼靜態方法不能訪問非靜態變量和方法(因為它沒有'this'可以傳遞這些方法)。”

“嗯。我想我明白了。至少有一點。”

“迭戈叔叔來了……還有他的任務。”