天天看點

Java自學|static詳解

Java自學|static詳解

1.靜态屬性

我們線定義一個Person類,他有一個靜态屬性age和一個和非靜态屬性name:

public class Person{
    private static int age; //靜态屬性
    private String name;    //非靜态屬性

    public static void main(String[] args) {
        System.out.println(age);    //直接用靜态屬性,正常
        //System.out.println(name);   //直接用非靜态屬性,報錯
    }
}      

這個程式,是沒有任何問題的,能直接輸出age,但是如果我們将第二個輸出語句的注釋符去掉的話,就會出現錯誤:

Java自學|static詳解

這個問題,我們之前也提到過,因為靜态屬性是有類的時候就加載出來了,而非靜态屬性必須要在執行個體化了之後才會生成。

2.靜态方法

我們線定義一個Person類,他有一個非靜态方法say2,和靜态方法say1和main

public class Person{
    //靜态方法
    public static void say1(){
        
    }
    //非靜态方法
    public void say2(){
        
    }
    
    public static void main(String[] args) {
        
    }
}      

我們在main方法中調用say1和say2,會發現say1正常調用,而say2會出現報錯,不同的嘗試,我們會發現,可以在say1中調用say1,say2中調用say2(這裡可以和遞歸聯系一下),也可以在say2中調用say1,但是不能在say1中調用say2.

3.靜态代碼塊

我們還是定義一個Person類,如下:

public class Person {
    {
        System.out.println("匿名代碼塊");
    }
    static {
        System.out.println("靜态代碼塊");
    }
    public Person(){
        System.out.println("構造");
    }

    public static void main(String[] args) {
        Person person = new Person();
    }
}      

我們在main方法中new了一個Person,發現輸出的順序為:

Java自學|static詳解

我們再做另一個測驗

public class Person {
    {
        System.out.println("匿名代碼塊");
    }
    static {
        System.out.println("靜态代碼塊");
    }
    public Person(){
        System.out.println("構造");
    }

    public static void main(String[] args) {
        Person person = new Person();
        Person person1 = new Person();
    }
}      

我們new了兩個對象,輸出發現靜态代碼塊隻輸出一次,這說明了,static代碼塊隻執行一次

4.靜态導入包

假如我們要生成一個随機數,我們可以用Math的random方法:

public class Person {
    public static void main(String[] args) {
        System.out.println(Math.random());
    }
}      

如果我們不想每次都寫一個Math,是吧,很麻煩,那麼我們可以怎麼操作呢?

正常情況下,我們要使用一個包,是不是直接導入這個包就行了

import java.lang.Math;      

我們可以加上static直接導入這個random方法:

import static java.lang.Math.random;      

這樣就可以直接用random了不用加Math.

世上沒有白走的路,每一步都算數!