java 中的static關鍵字

一、方便在沒有建立對象的狀況下來進行調用(方法/變量)java

  • static方法就是沒有this的方法
  • 在static方法內部不能調用非靜態方法,反過來是能夠的
  • 能夠在沒有建立任何對象的前提下,僅僅經過類自己來調用static方法(這實際上正是static方法的主要用途)
  • 被static關鍵字修飾的方法或者變量,只要類被加載了,就能夠經過類名去進行訪問
  • 能夠編寫static代碼塊來優化程序性能

二、static方法函數

  • 在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法
  • 由於非靜態成員方法/變量都是必須依賴具體的對象纔可以被調用
  • 在非靜態成員方法中是能夠訪問靜態成員方法/變量的

三、static變量性能

  • static成員變量的初始化順序按照定義的順序進行初始化

四、static代碼塊優化

  • static塊能夠用來優化程序性能,是由於它的特性:只會在類加載的時候執行一次

五、構造器實際上不是靜態方法this

  • 在thinking in java中,第96頁提到,「即便沒有顯示地使用static關鍵字,構造器實際上也是靜態方法「
  • 一篇大神的博客中獲得了答案,那就是構造器不是靜態方法
  • Java的實例構造器只負責初始化,不負責建立對象
  • new指令專門用於建立對象實例,而調用實例構造器則使用invokespecial指令
  • this是做爲實例構造器的第一個實際參數傳入的
  • 靜態方法中不能使用this,而構造器中可使用this關鍵字

六、Java中的static關鍵字不會影響到變量或者方法的做用域3d

  • Java中可以影響到訪問權限的只有private、public、protected(包括包訪問權限)這幾個關鍵字

七、能經過this訪問靜態成員變量code

  • this表明當前對象
  • static變量是被對象所享有的

八、static是不容許用來修飾局部變量(Java語法的規定)對象

九、靜態內部類:blog

  • 普通類是不容許聲明爲靜態的,只有內部類才能夠

  • 要建立嵌套類的對象,並不須要其外圍類的對象(可是仍是會執行外部類的構造方法

  • 內部靜態類不須要有指向外部類的引用,但非靜態內部類須要持有對外部類的引用
  • 非靜態內部類可以訪問外部類的靜態和非靜態成員,靜態類不能訪問外部類的非靜態成員

十、靜態導入繼承

  • 可使被導入類的靜態變量靜態方法在當前類直接可見,用這些靜態成員無需再給出他們的類名

 import static 包名.類名.靜態成員變量; 

 import static 包名.類名.靜態成員函數; 

十一、代碼執行結果 

public class Test extends Base{
 
    static{
        System.out.println("test static");
    }
     
    public Test(){
        System.out.println("test constructor");
    }
     
    public static void main(String[] args) {
        new Test();
    }
}
 
class Base{
     
    static{
        System.out.println("base static");
    }
     
    public Base(){
        System.out.println("base constructor");
    }
}

代碼執行結果:

public class Test {
    Person person = new Person("Test");
    static{
        System.out.println("test static");
    }
     
    public Test() {
        System.out.println("test constructor");
    }
     
    public static void main(String[] args) {
        new MyClass();
    }
}
 
class Person{
    static{
        System.out.println("person static");
    }
    public Person(String str) {
        System.out.println("person "+str);
    }
}
 
 
class MyClass extends Test {
    Person person = new Person("MyClass");
    static{
        System.out.println("myclass static");
    }
     
    public MyClass() {
        System.out.println("myclass constructor");
    }
}
  • 首先加載Test類,所以會執行Test類中的static塊
  • main所在類會被優先加載
  • 以類爲標準進行加載,儘管在一個文件
  • 接着執行new MyClass(),而MyClass類尚未被加載,所以須要加載MyClass類
  • 加載MyClass類的時候,發現MyClass類繼承自Test類,可是因爲Test類已經被加載了,因此只須要加載MyClass類
  • 就會執行MyClass類的中的static塊

代碼執行結果:

public class Test {
     
    static{
        System.out.println("test static 1");
    }
    public static void main(String[] args) {
         
    }
     
    static{
        System.out.println("test static 2");
    }
}
  • static塊能夠出現類中的任何地方(只要不是方法內部,記住,任何方法內部都不行)
  • 而且執行是按照static塊的順序執行的

相關文章
相關標籤/搜索