在c++和java中static關鍵字用於修飾靜態成員變量和成員函數
舉例一個普通的javabean
class AA { int a; static int b; geta/seta;//此處省略getset getb/setb; }
如果創建了一個對象AA,
AA a =new AA();
這個時候只會在內存中給這個對象分配四個字節,也就是a變量所占的字節數,因為static申明的全局變量在全局區中,是所有這個類的對象共有的,例如:
a.setB(10); AA b =new A(); System.out.println(b.getB());
發現結果是10;
也就證實了,static申明的關鍵字是所有對象共有。
這也解釋了,為什么靜態函數只可以使用靜態變量的原因了,因為靜態函數也是所有類共有的,在編譯器編譯的時候不會將該類的引用傳遞到這個方法中,
所以靜態函數不知道是哪個對象調用了我這個方法。
那么普通的函數存在哪里呢,為什么對象調用這個方法的時候,函數知道是哪個對象調用我的呢?
因為普通的成員變量和方法在編譯器編譯的時候,會幫我們做了轉化。
還是上面的類,在編譯的時候,編譯器會將類變成:
class AA { int a; public void setA(AA *ac,int a) { ac->a=a; } }
會將當前類的地址傳遞過來,修改該對象a的值。(上面代碼是c++實現的,我認為java底層也是這樣實現的)
調用靜態static函數的方式在java中包括(java)
1類名.static方法();
2對象.static方法();
普通java類獲取spring容器的類的方法:
public class SpringConfigTool implements ApplicationContextAware{ private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext=applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } }
<bean id="SpringConfigTool" class="com.nfcm.spring.SpringConfigTool"/>
這會在spring容器運行的時候,將spring上下文對象設置到我們自定義的SpringConfigTool的全局變量中,而上面我們得知:全局變量是所有類公用的,
所以我們可以直接使用SpringConfigTool.getBean("beanName");或者new一個對象調用getBean都可以獲取到spring對應的bean