【java基礎】成員變量和局部變量

成員變量和局部變量java

根據定義變量位置的不一樣,能夠將變量分爲成員變量和局部變量
       成員變量是在類範圍內定義的變量
       局部變量是在一個方法內定義的變量
 
成員變量能夠分爲:
       實例屬性 (不用static修飾)
              隨着實例屬性的存在而存在
      類屬性 (static修飾)
              隨着類的存在而存在
 
成員變量無需顯式初始化,系統會自動對其進行默認初始化
 
局部變量可分爲:
       形參(形式參數)
              在整個方法內有效
       方法局部變量 (方法內定義)
              從定義這個變量開始到方法結束這一段時間內有效
       代碼塊局部變量 (代碼塊內定義)
              從定義這個變量開始到代碼塊結束這一段時間內有效
 
局部變量除了形參外,都必須顯示初始化,也就是要指定一個初始值,不然不能訪問。
 
示例代碼:
package object;

/**
 * 成員變量和局部變量
 * 
 * */
public class VariableTest {
    
    //成員變量
    public static String staticname = "類屬性";
    public String nostaticname = "實例屬性";
    
    //沒有初始化的成員變量
    public static String staticname1;
    public String nostaticname1;
    
    //定義一個方法
    public void info(){
        //在方法中定義一個局部變量i
        //int i;
        //直接輸出是輸出不出來的,由於沒有初始化
        //System.out.println(i);
        //定義一個局部變量i並初始化
        int i = 10;
        //輸出i
        System.out.println(i);
    }
    
    //定義了一個靜態的方法
    public static void infos(){
        int i = 20;
        System.out.println(i);
    }
    
    public static void main(String[] args) {
        /*第一問:類屬性和實例屬性的範圍同樣嗎?*/
        //在沒建立實例以前 能夠調用類屬性,但不能調用實例屬性
        System.out.println(VariableTest.staticname);//結果:類屬性
        //實例化對象以後,就能夠調用實例屬性了
        VariableTest vt = new VariableTest();
        System.out.println(vt.nostaticname);//結果:實例屬性
        /*--- 結論:在成員變量中,類屬性的範圍比實例屬性大一點 ---*/
        
        System.out.println("----------");
        
        /*第二問:成員變量須要顯性初始化嗎?*/
        //直接調用沒有初始化的類屬性
        System.out.println(VariableTest.staticname1);//結果:null
        //用實例化對象調用沒有初始化的實例屬性
        System.out.println(vt.nostaticname1);//結果:null
        /*--- 結論:成員變量會自動隱性初始化,賦給變量一個默認值  ---*/
        
        System.out.println("----------");
        
        /*第三問:若是用實例化後的對象去調用類屬性會怎麼樣?*/
        //vt.staticname; 
        //這樣會報錯
        //Syntax error, insert "VariableDeclarators" to complete LocalVariableDeclaration
        //翻譯:語法錯誤,插入「變量聲明符」來完成局部變量聲明
        /*爲何會報錯。一開始我覺得是由於eclipse出錯了
         *後來我直接用文本文檔重寫了一個test
         *編譯文件後,報不是語句的錯,而後我又試了一下
         *VariableTest.staticname
         *也是報錯,說明這種寫法是不正確的,具體爲何有待研究*/
        vt.staticname = "改變了的類屬性";
        //若是同時給類屬性賦值,就不會報錯...有警告
        //The static field Variable Test.static name should be accessed in a static way
        //翻譯:靜態字段變量測試。靜態的名字應該在一個靜態方法訪問
        System.out.println(vt.staticname);//結果:改變了的類屬性
        //這樣就不會報錯,可是會有警告,同上↑
        /*結論:用實例化後的對象調用類屬性,格式正確的狀況下,是能夠調用的,但有警告
         *經過對象調用類屬性,一樣能夠改變類屬性的值*/
        
        System.out.println("----------");
        
        //定義在方法中的局部變量
        /*第四問:定義在方法中的局部變量,出了方法還能訪問嗎?*/
        //調用方法
        vt.info();//結果:10
        //如今還能用info中的i嗎?
        //System.out.println(i);
        //報錯:i cannot be resolved to a variable
        //翻譯:i 不能轉換成一個變量
        /*結論:定義在方法中的局部變量,出了方法就不能被訪問了*/
        
        System.out.println("----------");
        
        //定義在代碼塊中的局部變量
        /*第五問:定義在代碼塊中的局部變量,出了代碼塊還能訪問嗎?*/
        {
            int j = 11;
            System.out.println(j);//結果:11
        }
        //出了代碼塊
        //System.out.println(j);
        //一樣報錯,內容與上面的同樣
        /*定義在代碼塊中的局部變量,出了代碼塊就不能訪問了*/
        
        System.out.println("----------");
        
        //後續:一個靜態方法
        infos();//結果:20
        //這樣依然報錯
        //System.out.println(i);
        
    }
}

 

 
java容許局部變量和成員變量重名,局部變量會覆蓋成員變量的值
 
代碼示例:
package object;

/**
 * 局部變量覆蓋成員變量
 * */
public class VariableCover {
    
    /*當實例變量與方法中的局部變量同名時,
     *局部變量的值會覆蓋實例變量*/
    //定義實例變量
    public String city = "合肥";
    private static String citys = "滁州";
    //定義一個方法
    public void function(){
        String city = "蚌埠";
        //輸出
        //方法中的同名局部變量會覆蓋實例變量
        System.out.println(city);//結果:蚌埠
        //要想調用實例變量,能夠用this
        System.out.println(this.city);//結果:合肥
    }
    
    public static void main(String[] args) {
        String citys = "南京";
        //方法中的同名局部變量會覆蓋實例變量
        System.out.println(citys);//結果:南京
        //能夠經過類名調用被覆蓋的類屬性
        System.out.println(VariableCover.citys);//結果:滁州
        
        String city = "上海";
        System.out.println(city);//結果:上海
        //這樣也能夠
        System.out.println(new VariableCover().city);//結果:合肥
        new VariableCover().function();
    }
}

 

/*
文章是我從個人CSDN博客裏考過來的,由於那邊用的不習慣,比較亂,沒有這邊純粹...雖然有些功能是挺好的...全轉過來以後,那邊就廢棄了....
*/
相關文章
相關標籤/搜索