Java之static
? ? ? ? 可以基于一個類創建多個該類的對象,每個對象都擁有自己的成員,互相獨立。然而在某些時候,希望該類所有的對象共享同一個成員。此時就是?static 發揮其功效的地方,即存在以下結論:
-
static修飾的成員變量和方法,從屬于類
-
普通變量和方法從屬于對象
-
靜態方法不能調用非靜態成員,編譯會報錯
Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。
1.靜態變量
public class staticStudy {static String var = "staticvar";public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("通過類名訪問靜態變量: "+staticStudy.var);//通過對象名訪問staticStudy objectname = new staticStudy();System.out.println("通過對象名訪問靜態變量: "+objectname.var);//靜態方法直接調用靜態變量System.out.println("靜態方法直接訪問靜態變量:"+var);//使用對象名訪問修改靜態變量的值objectname.var = "staticvarnew;}}2.靜態方法
? ? ? static方法也成為靜態方法,最常見的靜態方法就是main(),由于靜態方法不依賴于任何對象就可以直接訪問,因此對于靜態方法來說,是沒有this的,因為不依附于任何對象,既然都沒有對象,就談不上this了,并且由于此特性,在靜態方法中不能訪問類的非靜態成員變量和非靜態方法,因為非靜態成員變量和非靜態方法都必須依賴于具體的對象才能被調用。
? ?靜態方法中不能訪問非靜態成員方法和非靜態成員變量,但是在非靜態成員方法中是可以訪問靜態成員方法和靜態成員變量。
2.1?靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。
靜態方法中訪問非靜態變量會報錯。那如果希望在靜態方法中調用非靜態變量,可以通過創建類的對象,然后通過對象來訪問非靜態變量。
public class staticStudy {static String varStatic = "staticvar";String varGeneral = "vargeneral";public static void print() {System.out.println("靜態方法訪問靜態變量:"+varStatic);staticStudy object = new staticStudy();System.out.println("靜態訪問訪問非靜態變量:"+object.varGeneral);} }2.2??在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量
public class staticStudy {static String varStatic = "staticvar";String varGeneral = "vargeneral";public static void print() {System.out.println("靜態方法訪問靜態變量:"+varStatic);staticStudy object = new staticStudy();System.out.println("靜態訪問訪問非靜態變量:"+object.varGeneral);}public void show() {System.out.println("普通方法訪問普通變量:"+varGeneral);System.out.println("普通方法訪問靜態變量:"+varStatic);} }2.3?靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法
public class staticStudy {static String varStatic = "staticvar";String varGeneral = "vargeneral";public static void print() {System.out.println("靜態方法訪問靜態變量:"+varStatic);staticStudy object = new staticStudy();System.out.println("靜態訪問訪問非靜態變量:"+object.varGeneral);}public void show() {System.out.println("普通方法訪問普通變量:"+varGeneral);System.out.println("普通方法訪問靜態變量:"+varStatic);}public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("通過類名訪問靜態變量: "+staticStudy.varStatic);//通過對象名訪問staticStudy objectname = new staticStudy();System.out.println("通過對象名訪問靜態變量: "+objectname.varStatic);//靜態方法通過對象訪問非靜態方法objectname.show();//靜態方法直接調用靜態變量System.out.println("靜態方法直接訪問靜態變量:"+varStatic);}3?static 使用之靜態初始化塊
package com.imooc;public class staticStudy {static String varStatic;String varGeneral1,varGeneral2;public staticStudy() {varGeneral1 = "structInitialGeneral";System.out.println("通過構造函數為普通變量賦值");}{//普通變量初始化varGeneral2 = "blockInitialGeneral";System.out.println("通過初始化塊為普通變量賦值");}{//靜態變量初始化varStatic = "blockstaticvar";System.out.println("通過初始化塊為靜態變量賦值");}public static void main(String[] args) {// TODO Auto-generated method stubstaticStudy objectVar = new staticStudy();System.out.println("varGeneral1:"+objectVar.varGeneral1);System.out.println("varGeneral2:"+objectVar.varGeneral2);System.out.println("varStatic:"+varStatic);staticStudy objectVar2 = new staticStudy();}}通過輸出結果,我們可以看到,程序運行時普通初始化塊最先被執行,然后執行靜態初始化塊,最后才執行構造方法。
總結
以上是生活随笔為你收集整理的Java之static的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java线程池总结
- 下一篇: Java之String,StringBu