1. 程式人生 > >Java之靜態變數和靜態方法

Java之靜態變數和靜態方法

靜態變數 和 靜態方法(使用static修飾)

靜態變數 儲存在 方法區的靜態區(共享區)

靜態變數 是共享的區間

靜態變數 是如何呼叫 ?

1.可以使用物件來呼叫
2.推薦 使用類名來呼叫

為什麼靜態變數 要使用類名去呼叫 ?

只要載入了.class檔案 就載入了靜態變數 這時還沒有物件產生

靜態變數(屬於類 也叫類變數) 和 非靜態變數(屬於物件 物件變數) 的區別

1.呼叫方式不同

靜態變數: 物件或類名去呼叫(推薦 類名)
非靜態變數: 只能使用物件去呼叫

2.記憶體中存在的位置不同

靜態變數 : 方法區的靜態區
非靜態變數: 堆記憶體

3.載入的時機不同

靜態變數: 隨著類的載入而載入(不依賴物件而載入)
非靜態變數: 隨著物件的建立而建立(依賴物件)

4.生命週期不同

靜態變數: 隨著類的銷燬而銷燬(相當於程式結束)
非靜態變數: 隨著物件的銷燬而銷燬

當你在設計類的時候 需要考慮成員變數是否需要共享

靜態變數在記憶體中載入步驟

1.載入.class檔案(位元組碼檔案)到方法區
2.main方法入棧
3.要建立 AVGril 的物件 先要載入 AVGril.class
AVGril.class中 分為 靜態區和非靜態區
這時初始化靜態變數conutry初值為null;
4.建立物件(堆區開闢空間)
5.把物件的地址 賦值給 gril1 變數 儲存
6.通過類名 修改 類變數的值
7.sayHi 方法入棧 列印
8.sayHi 出棧
9.main 出棧
    public static void main(String[] args) {
        AVGirl girl1 = new AVGirl();
        girl1.name = "蒼老師";
        AVGirl.country = "日本";
        girl1.sayHi();


        AVGirl girl2 = new
AVGirl(); girl2.name = "波多老師"; AVGirl.country = "日本213"; girl2.sayHi(); } class AVGirl{ String name; // 姓名 static String country; // 國籍 public void sayHi() { System.out.println(name + "..." + country); } }

這裡寫圖片描述
這裡寫圖片描述

靜態方法 (使用static修飾方法)

非靜態方法:

1.可以使用靜態變數 和 非靜態變數
2.可以使用靜態方法 和 非靜態方法

靜態方法:

1.只能使用靜態變數
2.只能使用靜態方法
    public static void main(String[] args) {
        Man man = new Man();
        man.fun();
    }

class Man{
    int num1 = 10;
    static int num2 = 5;
    // 非靜態方法 可以訪問 靜態變數 和 非靜態變數
    // 靜態方法 可以訪問啥 ? (加上靜態 相當於 隨著類改變 和物件沒關係)
    public void fun() {
        System.out.println(num1);
        System.out.println(num2);
        // 呼叫靜態方法 (類方法) 推薦使用 類名調方法
        Man.sayHi();
    }

    public static void sayHi() {
        System.out.println("我是sayHi");
    }   
    // 靜態方法
    // 靜態方法中 不能訪問 非靜態變數(因為載入類的時候 還沒有物件)
    // 簡單記: 靜態只能使用靜態
    public static void fun1() {
        // System.out.println(this.num1);
        System.out.println(num2);

        Man.sayHi();
    }
}

main解析

main就是為了讓JVM去呼叫的方法
public JVM 呼叫這個方法 要使用最大許可權
static JVM 呼叫時是不需要建立物件的 直接使用類名調就行
mian 不是關鍵字 JVM 只認識main這個詞
String[] args 接受鍵盤輸入的值