Static詳解


                                 static

                學習的過程就是填坑的過程,可不要偷懶想着跳過去,你現在跳過去,就相當於給自己挖了一個坑,你遲早會掉進去的,為了避免不掉坑,所以,努力填坑吧!

 

一.如果沒有static會怎樣?

需求:  

1:定義Student類

 

      1:姓名、國籍,說話行為

 

      2:多個構造,重載形式體現

 

2:學生的國籍都是確定的

 

      1:國籍可以進行顯示初始化

public class Student {
    String name;//姓名
    String country;//國籍

    public Student(String name, String country) {
        this.name = name;
        this.country = country;
    }

    public void speak(){
        System.out.println("姓名:"+this.name+" "+"國籍:"+this.country);
    }
}

class Test{
    public static void main(String[] args) {
        Student student = new Student("何道昌","中國");
        Student student1 = new Student("孫雙雙","中國");

        student.speak();
        student1.speak();
    }
}

  

運行結果:

姓名:何道昌 國籍:中國
姓名:孫雙雙 國籍:中國

  

目前存在的問題:

        現在我們已知學生都是中國人,現在我們每創建一個學生對象,就要給所有學生的國籍屬性賦相同的值,這樣造成堆內存空間資源浪費

目前方案:

        把“中國”這個數據移動到數據共享區中,共享這個數據給所有的Student對象使用即可

        疑問:如何才能把這個數據移動到數據共享區中共享呢?

解決方案:

        只需要用static修飾該數據即可

        靜態的成員變量只會在數據共享區中維護一份,而非靜態成員變量的數據會在每個對象中都維護一份

 

 

public class Student {
    String name;//姓名
    //使用了static修飾country,那么這時候country就是一個共享的數據
    static String country = "中國";//國籍
    //構造函數
    public Student(String name) {
        this.name = name;
    }
     //說話行為
    public void speak(){
        System.out.println("姓名:"+this.name+" "+"國籍:"+country);
    }
}

class Test{
    public static void main(String[] args) {
        Student student = new Student("何道昌");
        Student student1 = new Student("孫雙雙");

        student.speak();
        student1.speak();
    }
}

  

運行結果:

姓名:何道昌 國籍:中國
姓名:孫雙雙 國籍:中國

  

下面我來詳細解說static

 

static(靜態修飾符)

1.static修飾靜態變量

        如果有數據需要被共享給所有對象使用時,那么就可以使用static修飾

        靜態成員變量的訪問方式:

               方式一: 可以使用對象進行訪問

                             格式:對象.變量名

               方式二:可以使用類名進行訪問

                             格式:類名.變量名

               注意:

                         1.非靜態的成員變量只能使用對象進行訪問,不能使用類命進行訪問

 

public class Student {
    String name;//姓名     非靜態成員變量
    //使用了static修飾country,那么這時候country就是一個共享的數據
    static String country = "中國";//國籍    靜態成員變量
    //構造函數
    public Student(String name) {
        this.name = name;
    }
     //說話行為
    public void speak(){
        System.out.println("姓名:"+this.name+" "+"國籍:"+country);
    }
}

class Test{
    public static void main(String[] args) {
        Student student = new Student("何道昌");

        System.out.println(student.name);//用對象訪問非靜態變量
Systen.out.println(student.country);//用對象訪問靜態變量 System.out.println(Student.country);//用類命訪問靜態變量
} }

              

運行結果:

何道昌
中國 中國

           

                 2.千萬不要為了方便訪問數據而使用static修飾成員變量,只有成員變量的數據真正需要被共享的時候,才使用static修飾

            static修飾成員變量的應用場景:如果一個數據需要被所有對象共享使用的時候,用static修飾

2.static修飾成員函數(靜態的成員方法)

            

 靜態成員函數的訪問方式:

               方式一: 可以使用對象進行訪問

                             格式:對象.靜態的函數名

               方式二:可以使用類名進行訪問

                             格式:類名.靜態的函數名

 

推薦使用類名直接訪問靜態的成員

         原因:

                   1.方便      

                   2.節省內存

 

靜態函數要注意的事項:

        1.靜態函數是可以調用類名或者對象進行調用的,而非靜態函數只能使用對象進行調用

        2.靜態的函數可以訪問靜態的成員,但是不能直接訪問非靜態的成員

        3.非靜態的函數是可以直接訪問靜態與非靜態的成員

        4.靜態函數不能出現this或者super關鍵字

 

public class Student {
    String name;//姓名     非靜態成員變量
    //使用了static修飾country,那么這時候country就是一個共享的數據
    static String country = "中國";//國籍    靜態成員變量
    //構造函數
    public Student(String name) {
        this.name = name;
    }
     //說話行為
    //靜態成員方法
    public static void speak(){
        System.out.println("國籍:"+country);
    }
    //學習行為
    //非靜態成員方法
    public  void study(){
        System.out.println(name+"好好學習");
    }
}

class Test{
    public static void main(String[] args) {
        Student student = new Student("何道昌");

        System.out.println(student.name);//用對象訪問非靜態變量
        System.out.println(student.country);//用對象訪問靜態變量
        System.out.println(Student.country);//用類命訪問靜態變量

        student.study();//用對象訪問非靜態方法
        student.speak();//用對象訪問靜態方法
        Student.speak();//用類名訪問靜態方法
    }
}

  

運行結果:

何道昌
中國
中國
何道昌好好學習
國籍:中國
國籍:中國

  

靜態的成員變量與非靜態的成員變量的區別:

      1.作用上的區別:

                1、靜態的成員變量的作用是共享一個數據給所有的對象使用

                2、非靜態的成員變量的作用是描述一類事物的公共屬性

      2.數量和存儲位置上的區別:

                 1、靜態成員變量是在存儲方法區內存中,而且只會存在一份數據

                 2、非靜態的成員變量是存儲在堆內存中,有n個對象就有n份數據

      3、生命周期的區別:

                 1、靜態的成員變量數據是隨着類的加載而存在,隨着類文件的消失而消失

                 2、非靜態的成員變量數據是隨着對象的創建而存在,隨着對象被垃圾回收器回收而消失

 

靜態函數不能訪問非靜態的成員?

        靜態函數只要存在有對象,那么也可以訪問非靜態的數據,只是不能直接訪問。

 

 

最后,繼續用這個例子穿插一下靜態代碼塊的知識

           靜態代碼塊是在Student.class文件加載到內存的時候就馬上執行的

public class Student {
    String name;//姓名     非靜態成員變量
    //使用了static修飾country,那么這時候country就是一個共享的數據
    static String country = "中國";//國籍    靜態成員變量
    //靜態代碼塊
    static{
        System.out.println("靜態代碼塊執行了!!");
    }
    //構造函數
    public Student(String name) {
        this.name = name;
    }
     //說話行為
    //靜態成員方法
    public static void speak(){
        System.out.println("國籍:"+country);
    }
    //學習行為
    //非靜態成員方法
    public  void study(){
        System.out.println(name+"好好學習");
    }
}

class Test{
    public static void main(String[] args) {
        Student.speak();
    }
}

  

運行結果:

靜態代碼塊執行了!!
國籍:中國

  

理解到這,你再看看下面的分析圖,應該還會有所收獲

 

 

 

最后再跟大家分享一句話:

          一個人若想改變自己的命運,最重要的是要改變自己,改變心態,改變環境,這樣命運也會隨之改變

          讀完此篇,如若對你有用,記得推薦,如若有誤,歡迎指正!

          此篇為本人原創,轉載請說明出處

  本文已獨家授權給腳本之家(jb51net)公眾號獨家發布


免責聲明!

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



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