static
在《Java編程思想》P86頁(yè)有這樣一段話:
“static方法就是沒(méi)有this的方法。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過(guò)來(lái)是可以的。而且可以在沒(méi)有創(chuàng)建任何對(duì)象的前提下,僅僅通過(guò)類本身來(lái)調(diào)用static方法。這實(shí)際上正是static方法的主要用途?!?/p>
這段話雖然只是說(shuō)明了static方法的特殊之處,但是可以看出static關(guān)鍵字的基本作用,簡(jiǎn)而言之,一句話來(lái)描述就是:
方便在沒(méi)有創(chuàng)建對(duì)象的情況下來(lái)進(jìn)行調(diào)用(方法/變量)。
很顯然,被static關(guān)鍵字修飾的方法或者變量不需要依賴于對(duì)象來(lái)進(jìn)行訪問(wèn),只要類被加載了,就可以通過(guò)類名去進(jìn)行訪問(wèn)。
static可以用來(lái)修飾類的成員方法、類的成員變量,另外可以編寫static代碼塊來(lái)優(yōu)化程序性能。
static class
一般情況下是不可以用static修飾類的。如果一定要用static修飾類的話,通常static修飾的是匿名內(nèi)部類。
在一個(gè)類中創(chuàng)建另外一個(gè)類,叫做成員內(nèi)部類。這個(gè)成員內(nèi)部類可以靜態(tài)的(利用static關(guān)鍵字修飾),也可以是非靜態(tài)的
public class MainInStaticClass {
static class Main{
static void main() {
//將主方法寫到靜態(tài)內(nèi)部類中,從而不必為每個(gè)源文件都這種一個(gè)類似的主方法
new MainInStaticClass().print();
}
}
static方法
- static方法一般稱作靜態(tài)方法,由于靜態(tài)方法不依賴于任何對(duì)象就可以進(jìn)行訪問(wèn),因此對(duì)于靜態(tài)方法來(lái)說(shuō),是沒(méi)有this的,因?yàn)樗灰栏接谌魏螌?duì)象,既然都沒(méi)有對(duì)象,就談不上this了。并且由于這個(gè)特性,在靜態(tài)方法中不能訪問(wèn)類的非靜態(tài)成員變量和非靜態(tài)成員方法,因?yàn)榉庆o態(tài)成員方法/變量都是必須依賴具體的對(duì)象才能夠被調(diào)用。
- 但是要注意的是,雖然在靜態(tài)方法中不能訪問(wèn)非靜態(tài)成員方法和非靜態(tài)成員變量,但是在非靜態(tài)成員方法中是可以訪問(wèn)靜態(tài)成員方法/變量的
- 調(diào)用時(shí)直接類名.方法 不用在實(shí)例化 MyObject.print2();
package testP.test;
class Person {
private static boolean name;
protected String age;
protected String sex;
String how;
public Person() {
name = false;
}
static String getName() { //靜態(tài)方法
String age1 = age; // 報(bào)錯(cuò)了,不是static變量
boolean name1 = name;
}
}
static變量
- static變量也稱作靜態(tài)變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對(duì)象所共享,在內(nèi)存中只有一個(gè)副本,它當(dāng)且僅當(dāng)在類初次加載時(shí)會(huì)被初始化。而非靜態(tài)變量是對(duì)象所擁有的,在創(chuàng)建對(duì)象的時(shí)候被初始化,存在多個(gè)副本,各個(gè)對(duì)象擁有的副本互不影響。
- static成員變量的初始化順序按照定義的順序進(jìn)行初始化。
static代碼塊
- static關(guān)鍵字還有一個(gè)比較關(guān)鍵的作用就是 用來(lái)形成靜態(tài)代碼塊以優(yōu)化程序性能。static塊可以置于類中的任何地方,類中可以有多個(gè)static塊。在類初次被加載的時(shí)候,會(huì)按照static塊的順序來(lái)執(zhí)行每個(gè)static塊,并且只會(huì)執(zhí)行一次。
- 注意如果有構(gòu)造函數(shù)和static同時(shí)使用時(shí),先調(diào)用static,然后調(diào)用構(gòu)造函數(shù)
實(shí)例
package testP.test;
class Person {
private static boolean name;
protected String age;
protected String sex;
String how;
Person() {
System.out.println("Person默認(rèn)構(gòu)造函數(shù)");
}
static {
System.out.println("Person靜態(tài)代碼顯示框");
}
static String getName() {
return name?"真數(shù)據(jù)":"假數(shù)據(jù)";
}
}
package testP.test;
public class son2 {
public son2() {
System.out.println("son2默認(rèn)構(gòu)造函數(shù)");
}
static {
System.out.println("son2的靜態(tài)代碼");
}
public static void main(String[] args) {
son2 s = new son2();
System.out.println(Person.getName());
}
}
結(jié)果為:
son2的靜態(tài)代碼
son2默認(rèn)構(gòu)造函數(shù)
Person靜態(tài)代碼顯示框
假數(shù)據(jù)
- 結(jié)果沒(méi)有調(diào)用Person類里面的構(gòu)造函數(shù),因?yàn)闃?gòu)造函數(shù)是要在類被實(shí)例化后才會(huì)被執(zhí)行
final
如果一個(gè)類不允許其子類覆蓋某個(gè)方法,則可以把這個(gè)方法聲明為final方法。
final方法
使用final方法的原因有二:
- 第一、把方法鎖定,防止任何繼承類修改它的意義和實(shí)現(xiàn)。
- 第二、高效。編譯器在遇到調(diào)用final方法時(shí)候會(huì)轉(zhuǎn)入內(nèi)嵌機(jī)制,大大提高執(zhí)行效率。
final 類
- final類不能被繼承,因此final類的成員方法沒(méi)有機(jī)會(huì)被覆蓋,默認(rèn)都是final的。在設(shè)計(jì)類時(shí)候,如果這個(gè)類不需要有子類,類的實(shí)現(xiàn)細(xì)節(jié)不允許改變,并且確信這個(gè)類不會(huì)載被擴(kuò)展,那么就設(shè)計(jì)為final類。
static和final一起
static final用來(lái)修飾成員變量和成員方法,可簡(jiǎn)單理解為“全局常量”! 對(duì)于變量,表示一旦給值就不可修改,并且通過(guò)類名可以訪問(wèn)。 對(duì)于方法,表示不可覆蓋,并且可以通過(guò)類名直接訪問(wèn)。
http://www.cnblogs.com/dolphin0520/p/3799052.html
http://blog.163.com/fanning_7213/blog/static/24965052010731270601/