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,但是如果我們将第二個輸出語句的注釋符去掉的話,就會出現錯誤:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3QzN1MjNhljNmJ2YkJ2YyYzX3ADOxYTMxEzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
這個問題,我們之前也提到過,因為靜态屬性是有類的時候就加載出來了,而非靜态屬性必須要在執行個體化了之後才會生成。
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,發現輸出的順序為:
我們再做另一個測驗
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.
世上沒有白走的路,每一步都算數!