static關鍵字的用法

static關鍵字用法

一. 概述

static是一個靜態修飾符關鍵字,表示靜態的意思,①方便在沒有建立對象的狀況下進行調用。能夠修飾類、方法、變量以及代碼塊。函數

【註釋①】一般來講,當建立類時,就是在描述那個類的對象的外觀和行爲。除非用new建立那個類的對象,不然實際上並未得到任何對象。執行new來建立對象時,數據存儲空間才被分配,其方法才供外界調用。即,不須要建立對象而直接經過類名進行訪問。this

二. 使用動機

當一個方法或者變量須要初始化加載,或者是常常被調用的時候能夠加上static.用static修飾的方法能夠用類名直接調用,不用必定要先實例化一個對象而後才能夠調用。3d

三. 使用方法

3.1 static關鍵字修飾類

在Java中,static通常用來修飾成員變量或者函數。但有一種特殊用法是用static修飾內部類(普通類是不容許聲明爲靜態的,只有內部類才能夠),被static修飾的內部類能夠直接做爲一個普通類來使用,而不需實例一個外部類。code

class OuterClass {
    public static class InnerClass {
        InnerClass() {
            System.out.println("InnerClass Class");
        }

        public void Method() {
            System.out.println("InnerClass Method");
        }
    }
}

public class StaticClassTest01 {
    public static void main(String[] args) {
        // 不須要new一個OuterClass
        new OuterClass.InnerClass();
        new OuterClass.InnerClass().Method();
    }
}

須要注意的是,當一個內部類沒有使用static修飾的時候,是不能直接使用內部類建立對象,須要先使用外部類對象+ . + new內部類對象,以下代碼所示:對象

class OuterClass{
    public class InnerClass{
        InnerClass(){
            System.out.println("InnerClass Class");
        }

        public void Method(){
            System.out.println("InnerClass Method");
        }
    }
}


public class StaticClassTest02 {
    public static void main(String[] args) {
        //須要先生成OuterClass的實例,而後再new一個InnerClass()
        OuterClass oc = new OuterClass();
        oc.new InnerClass();
        oc.new InnerClass().Method();
    }
}

3.2 static關鍵字修飾方法

static修飾的方法被稱之爲靜態方法,也叫類方法blog

Attention!加Static修飾的方法與不加Static修飾的方法的區別

☺ 加static的方法,能夠經過類名直接訪問,也能夠經過對象名訪問;加了static的方法,不能再內部寫this,由於直接用類名.方法的時候,沒有當前對象

而不加static只能經過對象名訪問

☺ 加了static的方法,不能在內部訪問非static的屬性和行爲,由於在靜態方法的內部沒法肯定非static的內容屬於那個對象,它是經過類名調用io

class StaticMethod {
    public static void Method(){
        System.out.println("Static Method");
    }
}

public class StaticMethodTest{
    public static void main(String[] args) {
        //1.直接經過類名.方法
        StaticMethod.Method();
        //2.建立對象,經過對象.方法
        StaticMethod sm = new StaticMethod();
        sm.Method();
    }
}

3.3 static關鍵字修飾變量

被static修飾的成員變量屬於類,不屬於某個對象(也就是說:多個對象訪問或修改static修飾的成員變量時,其中一個對象將static成員變量進行了修改,其餘的對象的static成員變量值跟着改變,即多個對象共享同一個static成員變量

被static修飾的成員,能夠經過類名直接訪問

在靜態方法中,不能訪問非靜態的內容(變量),不能使用this/super;非靜態中,能夠訪問靜態中的變量
class

public class StaticVar {
    private static String name = "Static Var";

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

3.4 static修飾代碼塊

靜態代碼塊在非靜態代碼塊以前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。變量

靜態代碼塊只在第一次new執行一次,以後再也不執行,而非靜態代碼塊在每new一次就執行一次。非靜態代碼塊可在普通方法中定義(不過做用不大);而靜態代碼塊不行。方法

package com.practice.StaticTest;

class StaticBlock {
    //構造方法
    public StaticBlock(){
        System.out.print("默認構造方法!-->");
    }

    //非靜態代碼塊
    {
        System.out.print("靜態代碼塊!-->");
    }

    //靜態代碼塊
    static{
        System.out.print("靜態代碼塊!-->");
    }

    public static void Method(){
        System.out.println("方法中的代碼塊!");
    }
}

public class StaticBlockTest{
    public static void main(String[] args) {
        //兩次建立對象,static代碼塊只執行一次
        StaticBlock sb = new StaticBlock();
        sb.Method();

        StaticBlock sb1 = new StaticBlock();
        sb1.Method();
    }
}

相關文章
相關標籤/搜索