修飾符static: 把對象相關的變成類相關的,它可以修飾屬性、方法、代碼塊和內部類
static修飾屬性(類變量):
那麼這個屬性就可以用" 類名.屬性名 "來訪問,也就是使這個屬性成爲本類的類變量,爲本類對象所共享。
類加載的過程,類本身也是保存在文件中(字節碼文件保存着類的信息)的,java會通過I/O流把類的文件讀入JVM(java虛擬機),這個過程稱爲類的加載。JVM會通過類路徑(CLASSPATH)來找字節碼文件。需要的時候纔會進行類加載,生成對象時是先加載後構造
類變量,會在加載時自動初始化,初始化規則和實例變量相同。
注意:
類中的實例變量是在創建對象時被初始化的
static修飾的屬性,是在類加載時被創建並進行初始化,類加載的過程只進行一次,也就是類變量只會被創建一次。
static修飾方法(靜態方法):
會使這個方法成爲整個類所公有的方法,可以用" 類名.方法名 "訪問。
static修飾的方法,不能直接訪問本類中的非靜態成員,但本類的非靜態方法可以訪問本類的靜態成員。
在靜態方法中不能出現this關鍵字。
父類中是靜態方法,子類中不能覆蓋爲非靜態方法,在符合覆蓋規則的前提下,在父子類中,父類中的靜態方法可以被子類中的靜態方法覆蓋,但是沒有多態。(在使用對象調用靜態方法時其實是調用編譯時類型的靜態方法)
java中的main方法必須寫成static的原因:在類加載時無法創建對象,而靜態方法可以不通過對象調用,所以在類加載時就可以通過main方法入口來運行程序。
static修飾初始代碼塊:
這時這個初始代碼塊就叫做靜態初始代碼塊,這個代碼塊只在類加載時被執行一次。
可以用靜態初始代碼塊初始化一個類。
動態初始代碼塊,寫在類體中的“{}”,這個代碼塊是在生成對象時運行,這種代碼塊叫動態初始代碼塊。
單例設計模式:
一個類只允許有一個對象,保證所有引用的對象都是同一個對象。
因爲只允許存在一個對象,則不允許在外面直接new出新的對象,所以應該把構造器設爲private,。
在類內定義一個公開的靜態方法,讓使用者進行調用,通過該方法去獲得一個實例。
例:
public calss Singleton{
private static Singleton s;
private Singleton(){}
public static Singleton newInstance(){
if ( s == null)
s = new Singleton();
return s;
}
}
修飾符final:不允許改變,可以修飾變量、方法、類
final修飾變量:
被fianl修飾的變量就會變成常量,一旦賦值不能改變
常量可以在初始化時直接賦值,也可以在構造方法裏賦值,只能在這兩種方法裏二選一,不能不爲常量賦值
常量不會有默認初始值
鎖定棧,使棧中的數據不可以改變
靜態常量只能在初始化時直接賦值
final修飾方法:
被final修飾的方法將不能被其子類覆蓋,保持方法的穩定不能被覆蓋
final修飾類:
被final修飾的類將不能被繼承
final類中的方法也都是final的
注意:
final不能用來修飾構造方法
訪問權限控制:
private:
本類內部可以訪問
不能繼承到子類
default:
本類內部可以訪問,同包其他類也可以訪問。
同包可繼承
protected:
本類內部可以訪問,不同包的子類也可以訪問,同包其他類也可以訪問。
能繼承到子類
public:
任何地方都可以訪問
能繼承到子類