咱們從關鍵字static能夠修飾哪些東西入手,逐一的剖析static的使用和要注意的地方。java
又稱爲類變量dom
a)全部類實例共享
b)使用靜態變量
類名.變量名
c)靜態變量是屬於這個類,非靜態變量是屬於對象
d)代碼加載到內存靜態變量就已經存在了
e)static變量和實例變量的區別:
i)static變量對於每一個類而言在內存中只有一個,能被類的全部實例所共享;
實例變量對於每一個類的每一個實例都有一份,它們之間互不影響;
ii)Java虛擬機在加載類的過程當中爲static變量分配內存,
實例變量在加載完類後建立對象時分配內存;
iii)static變量存在方法區,實例變量存在堆區;
v)static變量能夠直接經過類名訪問,
實例變量經過引用類型變量訪問;ui
稱爲類方法this
a)調用時使用
類名.方法名();
b)靜態方法不能使用非靜態的變量
靜態方法在類加載的時候就存在了
非靜態變量在對象建立的時候才存在的
非靜態方法能夠訪問靜態變量
c)靜態方法不能被非靜態方法重寫,靜態方法不能被靜態方法重寫(總之就是不能被 重寫)
d)靜態方法用來表示某個類所特有的功能,這種功能的實現不依賴於類的具體實例,也不依賴於它的子類。既然如此,當前類必須爲靜態方法提供實現。靜態方法屬於類。
e)不能使用this關鍵字和super關鍵字;(考慮它的生命週期來理解)code
this表示的當前對象,而被static修飾的是屬於類的,不須要建立對象就可使用;super是表明父類對象,調用父類的靜態方法直接使用類名.方法名就能夠。對象
對靜態變量進行初始化,當Java虛似機加載類時,就會執行該代碼塊;被static 所修飾的成員變量和成員方法代表歸某個類全部,它不依賴於類的特定實例,被 類的全部實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據 區的方法區內定位到它們。並且只會被加載一次。繼承
static{ System.out.print("hello static"); }
對非靜態變量進行初始化:生命週期
{ System.out.print("hello static"); }
這個用法通常不太出現,不多使用。內存
import java.lang.Math;
使用:Math.random()字符串
import static java.lang.Math.*;
使用:random()
建立一個對象時的類加載步驟或者說順序: Student student =new Student();猜猜它的執行順序會是什麼?咱們來理一理邏輯,子類繼承父類,建立一個子類對象首先要有一個父類被建立,Student()構造器裏默認有一個super()方法,全部會先初始化父類,而後是初始化子類的部分。下面來看具體的步驟:
public class Student extends Person{ private static String name; private int age; public Student() { System.out.println("this student constructor"); } static { System.out.println("this is student static block"); } { System.out.println("hello student"); } public static void main(String[] args) { Student stu = new Student(); } } class Person{ private static int count; private String title; public Person() { System.out.println("this person constructor"); } static { System.out.println("this is person static block"); } { System.out.println("hello person"); } }
//運行結果 this is person static block this is student static block hello person this person constructor hello student this student constructor
變量必須初始化,變量的值不容許修改。
final變量都必須顯示初始化,
a) 修飾靜態變量,只能在定義變量時進行初始化;
b) 修飾實例變量,能夠在定義變量時進行初始化,或者在構造方法中進行初始 化;
該方法不可以被重寫
該類不可以被繼承,即不能與abstract同時使用。
String類就是final修飾的類,全部字符串是不能改變的,只能經過拼接建立新的 String對象,這樣很浪費內存,因此又有了StringBuilder和StringBuffer;這兩 個類後面再解釋,能夠去思考和看他們的實現源碼。
後面出一篇關於這個的文章,敬請關注。