鍍金池/ 教程/ Java/ Java static關(guān)鍵字
Java for循環(huán)
Java接口
Java是什么?
Java命名約定
java中方法重載和方法重寫的區(qū)別
Java運算符
Java抽象類
Java快速入門
Java實例初始化程序塊
Java靜態(tài)綁定和動態(tài)綁定
Java do-while循環(huán)
Java對象克隆
Java Object類
Java聚合
Java繼承
Java this關(guān)鍵字
Java虛擬機(jī)內(nèi)部體系結(jié)構(gòu)
Java構(gòu)造器(構(gòu)造方法)
Eclipse安裝和配置
Java多態(tài)
Java方法重載
Java while循環(huán)
Java教程
Java按值調(diào)用和引用調(diào)用
Java strictfp關(guān)鍵字
Java封裝
Java語言特點
Java數(shù)組
Java instanceof運算符
Java包裝類
Java命令行參數(shù)
Java包
Java面向?qū)ο螅∣OP)概念
簡單Java程序
Java基礎(chǔ)實例程序
Java對象和類
Java continue語句
Java抽象類和接口的區(qū)別
C++ VS Java比較
Java if/else語句
Java switch語句
Java歷史
Java變量和數(shù)據(jù)類型
安裝Java環(huán)境(Linux)
Java JDK安裝和配置
Hello Java程序的內(nèi)部細(xì)節(jié)
Java break語句
Java方法重寫
Java Unicode編碼系統(tǒng)
怎么樣開始學(xué)習(xí)Java編程?
對象和類之間的區(qū)別
Java訪問修飾符
Java super關(guān)鍵字
Java注釋
JDK,JRE和JVM之間的區(qū)別
Java final關(guān)鍵字
Java static關(guān)鍵字

Java static關(guān)鍵字

java中的static關(guān)鍵字主要用于內(nèi)存管理。我們可以應(yīng)用java static關(guān)鍵字在變量,方法,塊和嵌套類中。 static關(guān)鍵字屬于類,而不是類的實例。

靜態(tài)(static)可以是:

  1. 變量(也稱為類變量)
  2. 方法(也稱為類方法)
  3. 代碼塊
  4. 嵌套類

1. Java靜態(tài)變量

如果將一個變量聲明為static,它就是所謂的靜態(tài)變量了。

  • 靜態(tài)變量可以用于引用所有對象的公共屬性(對于每個對象不是唯一的)。如:員工公司名稱,學(xué)生所在的大學(xué)名稱。

靜態(tài)變量的優(yōu)點:

  • 它能使程序存儲器高效(即它節(jié)省內(nèi)存)。

理解不使用靜態(tài)變量的問題

class Student{  
     int rollno;  
     String name;  
     String college="ITS";  
}

假設(shè)在一所學(xué)校有500名學(xué)生,現(xiàn)在所有實例數(shù)據(jù)成員將在每次創(chuàng)建對象時獲取內(nèi)存。所有學(xué)生都有其唯一的注冊ID:rollno和 name ,因此實例數(shù)據(jù)成員沒有什么問題。college 指的是所有對象的共同屬性。如果使它靜態(tài)化(使用static關(guān)鍵字修飼),這個字段將只獲得內(nèi)存一次。

Java靜態(tài)屬性被共享給所有對象。

靜態(tài)變量的示例

//Program of static variable  

class Student8 {
    int rollno;
    String name;
    static String college = "ITS";

    Student8(int r, String n) {
        rollno = r;
        name = n;
    }

    void display() {
        System.out.println(rollno + " " + name + " " + college);
    }

    public static void main(String args[]) {
        Student8 s1 = new Student8(111, "Karan");
        Student8 s2 = new Student8(222, "Aryan");

        s1.display();
        s2.display();
    }
}

上面代碼執(zhí)行結(jié)果如下 -

111 Karan ITS
222 Aryan ITS

創(chuàng)建對象示例圖如下所示 -

不使用靜態(tài)變量的計數(shù)器程序

在這個例子中,我們創(chuàng)建了一個名為count的實例變量用來統(tǒng)計創(chuàng)建對象的數(shù)目,它在構(gòu)造函數(shù)中執(zhí)行遞增。 由于實例變量在創(chuàng)建對象時要獲取內(nèi)存,每個對象都將具有實例變量的副本,如果它被遞增了,它也不會反映到其他對象中。所以每個對象在count變量中的值還是1

class Counter {
    int count = 0;// will get memory when instance is created

    Counter() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();

    }
}

上面代碼執(zhí)行結(jié)果如下 -

1
1
1

計數(shù)器靜態(tài)變量的程序
如上所述,靜態(tài)變量將只獲取一次內(nèi)存,如果任何對象更改靜態(tài)變量的值,它將保留其值,所有實例均可訪問同一變量值。

class Counter2 {
    static int count = 0;// will get memory only once and retain its value

    Counter2() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        Counter2 c1 = new Counter2();
        Counter2 c2 = new Counter2();
        Counter2 c3 = new Counter2();

    }
}

上面代碼執(zhí)行結(jié)果如下 -

1
2
3

2. Java靜態(tài)方法

如果在任何方法上應(yīng)用static關(guān)鍵字,此方法稱為靜態(tài)方法。

  • 靜態(tài)方法屬于類,而不屬于類的對象。
  • 可以直接調(diào)用靜態(tài)方法,而無需創(chuàng)建類的實例。
  • 靜態(tài)方法可以訪問靜態(tài)數(shù)據(jù)成員,并可以更改靜態(tài)數(shù)據(jù)成員的值。

靜態(tài)方法的示例

//Program of changing the common property of all objects(static field).  

class Student9 {
    int rollno;
    String name;
    static String college = "ITS";

    static void change() {
        college = "BBDIT";
    }

    Student9(int r, String n) {
        rollno = r;
        name = n;
    }

    void display() {
        System.out.println(rollno + " " + name + " " + college);
    }

    public static void main(String args[]) {
        Student9.change();

        Student9 s1 = new Student9(111, "Karan");
        Student9 s2 = new Student9(222, "Aryan");
        Student9 s3 = new Student9(333, "Sonoo");

        s1.display();
        s2.display();
        s3.display();
    }
}

上面代碼執(zhí)行輸出以下結(jié)果 -

111 Karan BBDIT
222 Aryan BBDIT
333 Sonoo BBDIT

執(zhí)行正常計算的靜態(tài)方法的另一個示例:

//Program to get cube of a given number by static method  

class Calculate {
    static int cube(int x) {
        return x * x * x;
    }

    public static void main(String args[]) {
        int result = Calculate.cube(5);
        System.out.println(result);
    }
}

上面代碼執(zhí)行輸出以下結(jié)果 -

125

靜態(tài)方法的限制

靜態(tài)方法有兩個主要限制。它們分別是:

  • 靜態(tài)方法不能直接使用非靜態(tài)數(shù)據(jù)成員或調(diào)用非靜態(tài)方法。
  • thissuper兩個關(guān)鍵字不能在靜態(tài)上下文中使用。
class A {
    int a = 40;// non static

    public static void main(String args[]) {
        System.out.println(a);
    }
}

上面代碼執(zhí)行輸出以下結(jié)果 -

[編譯錯誤!]Compile Time Error

為什么java main方法是靜態(tài)的?

這是因為對象不需要調(diào)用靜態(tài)方法,如果它是非靜態(tài)方法,jvm首先要創(chuàng)建對象,然后調(diào)用main()方法,這將導(dǎo)致額外的內(nèi)存分配的問題。

3. Java靜態(tài)塊

Java中的靜態(tài)塊主要有兩個作用:

  • 用于初始化靜態(tài)數(shù)據(jù)成員。
  • 它在類加載時在main方法之前執(zhí)行。

靜態(tài)塊的示例

class A2 {
    static {
        System.out.println("static block is invoked");
    }

    public static void main(String args[]) {
        System.out.println("Hello main");
    }
}

上面代碼執(zhí)行輸出以下結(jié)果 -

static block is invoked
Hello main

可以執(zhí)行程序沒有main()方法嗎?
答:是的,一種方式是靜態(tài)塊,但在以前舊的JDK版本中,不是在JDK 1.7。

class A3 {
    static {
        System.out.println("static block is invoked");
        System.exit(0);
    }
}

上面代碼執(zhí)行輸出以下結(jié)果 -

static block is invoked

在JDK7及以上版本中,輸出將為:

錯誤: 在類 Main 中找不到 main 方法, 請將 main 方法定義為:
   public static void main(String[] args)

上一篇:Java歷史