簡體   English   中英

即使之前初始化了一個同名的實例變量,當我在方法中再次初始化時會發生什么

[英]what happens when i initialize again in method even though previously initialized a instance variable with same name

為什么在方法 insert() 中初始化 i 使其值為 0 而對於字符串 j (未初始化)按預期打印?

   import java.io.*;
   class Stu
   {
    int id,i;
    String name,j;
    void insert(int id,String name)
    {
     System.out.println(id+" "+name);
     int i=id;
     j=name;
    }
    void display()
    {
     System.out.println(id+" "+name);
     System.out.println(i+" "+j);
    }
  }

 class New
 {
 public static void main(String[] args)
  {
  Stu s1=new Stu();
  s1.insert(101,"sriram");
  s1.display();
  }
 }

輸出是:

C:\\Users\\ASUS\\Desktop>javac New.java

C:\\Users\\ASUS\\Desktop>java 新建

101 斯里拉姆

0 空

0 斯里拉姆

void insert(int id, String name) {
            System.out.println(id + " " + name);
            **int i** = id;
            j = name;
        }

看,在插入函數中,您再次聲明了 int i。

像 i=id 一樣使用;

根據,“實例變量”和“局部變量”之間存在巨大差異。

由於程序的范圍。 當您在類的開頭創建“i”時,類中的每個函數都可以訪問該函數; 您沒有將其聲明為任何內容,因此將其設置為 null。

在您的 insert() 方法中,您創建了一個名為 i 的新變量。 這個新的 i 變量與您的插入函數一起位於調用堆棧中。 當該函數完成調用時,它“超出范圍”,並從調用堆棧中擦除。 該函數內的變量也被擦除。

當您調用 display 時,它使用您在課程開始時創建的“i”值。

你在這里所做的不是在insert方法中再次初始化同一個變量,而是在insert塊內創建一個同名的新變量。 您的查詢可以總結為局部變量與全局變量的范圍。

當您聲明並使用一個變量時,編譯器會嘗試在可用的最窄范圍內解析該變量。 就像,在您的情況下,在insert方法中,您創建了一個變量,即i ,它是要insert的局部變量,其作用域直到您進入insert為止。 一旦退出該方法,它就會超出范圍或死亡。 因此,您正在使用某個值初始化該本地i ,一旦您退出insert就會死亡。

現在,當您要求編譯器解析display的變量i ,編譯器首先查找在本地范圍內聲明的任何i 如果沒有找到,它將在全局范圍內搜索。 然后它找到i並打印值。

現實生活中的例子可能是: 假設有一個 Sriram 人生活在你的社會中。 現在,當有人在您家內呼叫 Sriram 時,您會立即提示。 但是,如果有人叫斯里拉姆站在遠離你家的地方,另一個人會回應。

將您的插入方法更改為

void insert(int id,String name)
    {
     System.out.println(id+" "+name);
     i=id; // notice that i changed this line
     j=name;
    }

您在插入方法中聲明了一個名為 i 的變量,然后為其分配了 id 的值。 一旦方法 insert 完成執行這個局部 i 變量就會超出范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM