【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博客里考過來的,因為那邊用的不習慣,比較亂,沒有這邊純粹...雖然有些功能是挺好的...全轉過來之后,那邊就廢棄了....
*/

 

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM