1. 程式人生 > 其它 >static關鍵字詳解(屬性、方法、靜態程式碼塊、靜態匯入包)

static關鍵字詳解(屬性、方法、靜態程式碼塊、靜態匯入包)

import java.util.Scanner;
//屬性
public class Main {
    public static int age=10;
    public double score;
    public static void main(String[] args) {
        Main ma=new Main();
        //建議:當你的變數是類變數時,建議使用“類名.變數”去訪問
        System.out.println(Main.age);//因為是靜態變數,而且靜態是跟類一起載入的,所以使用類去呼叫他時是正常存在的,不會報錯
        
// System.out.println(Main.score);//使用類去呼叫時,會報錯並提示,這屬性不是static修飾的方法 System.out.println(ma.age);//正常執行 System.out.println(ma.score);//正常執行 } }

方法:

import java.util.Scanner;

public class Main {
   public void run(){
       System.out.println("run");
        go();
//非靜態方法,可以呼叫靜態方式,因為靜態是跟類載入的,非靜態是跟物件載入的,當去呼叫靜態方法時,他已經存在了 } public static void go(){ System.out.println("go"); //靜態方法不可以呼叫非靜態方法,因為當靜態方法建立時,非靜態方法還沒有建立,所以呼叫的話會出錯 } run();//報錯:Main.java:11: error: invalid method declaration; return type required public static void main(String[] args) {
//呼叫靜態方法 Main.go();//正常情況下是使用這個,類名.方法 go(); //呼叫非靜態方法 // Main.run();//無法使用類名去點非靜態方法,會報錯:Main.java:17: error: non-static method run() cannot be referenced from a static context new Main().run();//new物件,但是不建立物件名呼叫方法 Main ma=new Main();//建立物件並呼叫方法 ma.run(); } }

 


程式碼塊:

import java.util.Scanner;

public class Main {
    //匿名程式碼塊:程式是不會主動呼叫他的,只有建立物件的時候,才會自動建立,並且比構造器建立的更早
    {
        //這個大括號是匿名程式碼塊,就是這個塊沒有名字
        System.out.println("匿名程式碼塊");//建立順序為:2
        //作用:為物件或屬性賦初始值
    }
    //靜態程式碼塊:跟類一載入就執行,永久只執行一次
    static {
        
         //這個大括號是靜態程式碼塊,也是跟隨類載入而載入
     System.out.println("靜態程式碼塊");//建立順序為:1
    }
    
    
    public Main(){
        
        System.out.println("構造器");//建立順序為:3
    }
    
    
    public static void main(String[] args) {
    Main me1=new Main();//物件建立時,匿名程式碼塊會把物件把構造器建立前執行
    System.out.println("=========");
    //注:當有建立程式碼塊的時候,無論怎麼執行,都是會先再程式碼塊,再走構造方法,那靜態程式碼塊只會再第一次才會執行,後面的不會再執行
    Main me2=new Main();//當建立過一次物件後,我們再建立一個物件,那個就不會再執行靜態的程式碼塊,因為靜態程式碼塊是類執行的並且永久只執行一次
    
    }
}

 


靜態匯入包:

import java.util.Scanner;
//靜態匯入包的方法
import static java.long.Math.PI;
public class Main {
    public static void main(String[] args) {
    System.out.println(Math.PI);//未匯入包時,呼叫方法的時候,我們要用包名呼叫
        System.out.println(PI);//靜態匯入包後,我們直接寫這個方法名即可
    }
}

靜態方法:
特點:一:
1、跟著的載入而載入,可以通過“類.靜態方法”的方法進行呼叫
2、4、呼叫方式
靜態方法 非靜態方法
類 yes no
物件 yes yes
用類去呼叫非靜態方法會編譯不通過
3、方法呼叫方法時
靜態方法中,只能呼叫靜態方法的屬性(因為非static的生命週期不夠)
非靜態方法中,既可以呼叫非靜態的方法或屬性,也可以呼叫靜態的方法或屬性


二:static的注意點:
1、在靜態的方法內,不能使用this關鍵字、super關鍵字(這兩個關鍵字都是基於你有物件的,你連物件都沒有怎麼用)
2、關於靜態屬性和靜態方法的使用,大家都從生命週期的角度去理解
3、在宣告一個sataic的private的屬性時他的set、get方法都要是有static的

三:
1、在開發中如何確定一個屬性是否要宣告為static的?
>屬性是可以被多個物件所共享的,不會跟著物件的不同而不同的。
比如賬號和密碼:如果賬號都一樣打錢進到底是打進誰的卡呢,再比如密碼一樣,你到處撿一個卡你不是就能領錢了嗎?
但是利率這種是可以用static的
注:每個物件都有所不同就不要用static,只有這個變數在每個物件中是相同的就可以用static

>類中常量也常常宣告為static


2、在開發中如何確定一個方法是否要宣告為static的?

>操作靜態屬性有方法通常設定為static的
>工具類中的方法,習慣上宣告為static的