靜態語句塊和語句塊的區別
靜態方法和靜態(static)語句塊的區別 用一下程序為例: public class Test { static{ *n("------static------"); } public static void main(String[] args) { Cat cat = new Cat(); } } class Animo{ static{ *n("------father-- static----"); } public Animo(){ *n("------father------"); } public void f(){ *n("------f------"); } } class Cat extends Animo{ static{ *n("------child-- static----"); } public Cat(){ *n("------child------"); } public void c(){ *n("------c------"); } } 靜態代碼快和靜態方法的區別: 一班情況下,項目啟動的時候就需要要執行的時候,需要使用靜態代碼塊,這中代碼是 主動執行的;需要在項目啟動的時候就初始化,在丌創建對象的情況下,其他程序來調用的 時候,需要使用靜態方法,這種代碼是被動執行的。
靜態方法在類加載的時候就已經加載, 可以用類名直接調用。兩者的區別就是:靜態代碼塊是主動執行的,靜態方法是被調用的時 候才執行的。
靜態方法:在 Java 里,可以定義一個丌需要創建對象的方法,在定義方法時,在方法前加 上 static 關鍵字。 使用靜態方法需要注意的點: (1)靜態方法只能調用同類中靜態變量(包括方法和變量),丌能直接訪問類中的 非靜態變量。
因為,對于非靜態的變量, 需要先創建實例化對象后才可使用, 而靜態方法使用前可以丌用創建對象。 使用靜態方法可 以使用類名加方法名; (2) 靜態方法丌能以任何形式引用 this 和 super 關鍵字, 因為靜態方法在使用前 丌用創建任何實例化對象,當靜態方法調用時,this 所引用的對象沒有產生; 對以上程序解析: 首先加載 Test 類(整個程序的入口) ,注重執行 Test 類中的 static 語句塊,在創建 Cat 類的對象時,首先執行父類的 static 語句塊,然后執行子類的 static 語句塊,同時加載父 類和子類的靜態方法和靜態成員變量(靜態方法和靜態變量如果存在) ,未調用時丌執行。
乊后執行父類的構造方法,父類的構造方法執行乊后,再執行子類的構造方法。此程序都是 找無參的構造方法。
注意: 子類的構造方法, 丌管這個構造方法帶丌帶參數, 默認的它都會先去尋找父類的丌帶參 數的構造方法。如果父類沒有丌帶參數的構造方法,那么子類必須用 supper 關鍵子來調用 父類帶參數的構造方法,否則編譯丌能通過。
靜態語句塊有什么用
public class Test {
private Test(){}
private static int num;
static {
//可能你的這個類是單例的,外界沒辦法調用構造方法,而你需要給num賦值,而又不是簡單的賦值,需要從數據庫中查詢再賦值,就可以在這里做了
String sql = "select count(*) from table";
。.
num = *(1);
}
}
java中,什么時候要用到靜態語句塊,它有何作用呢
一 般情況下,如果有些代碼必須在項目啟動的時候就執行的時候,需要使用靜態代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,在不創建對象的情 況下,其他程序來調用的時候,需要使用靜態方法,這種代碼是被動執行的. 靜態方法在類加載的時候 就已經加載 可以用類名直接調用
比如main方法就必須是靜態的 這是程序入口
兩者的區別就是:靜態代碼塊是自動執行的;
靜態方法是被調用的時候才執行的.
靜態方法
(1)在Java里,可以定義一個不需要創建對象的方法,這種方法就是靜態方法。要實現這樣的效果,只需要在類中定義的方法前加上static關鍵字。例如:
public static int maximum(int n1,int n2)
使用類的靜態方法時,注意:
a在靜態方法里只能直接調用同類中其他的靜態成員(包括變量和方法),而不能直接訪問類中的非靜態成員。這是因為,對于非靜態的方法和變量,需要先創建類的實例對象后才可使用,而靜態方法在使用前不用創建任何對象。
b 靜態方法不能以任何方式引用this和super關鍵字,因為靜態方法在使用前不用創建任何實例對象,當靜態方法調用時,this所引用的對象根本沒有產生。
(2)靜態變量是屬于整個類的變量而不是屬于某個對象的。注意不能把任何方法體內的變量聲明為靜態,例如:
fun()
{
static int i=0;//非法。
}
(3)一個類可以使用不包含在任何方法體中的靜態代碼塊,當類被載入時,靜態代碼塊被執行,且只被執行一次,靜態塊常用來執行類屬性的初始化。例如:
static
{
}
一個類里的靜態語句塊什么時候執行
建議LZ 可以這樣測試一下:
calss A {
static int a;
public A{
*n("constructor of A");
}
static {
*n("static block");
}
public static void main(String[] args){
A aclass = new A();
}
}
測試之后會發現,靜態代碼塊是在構造之前執行的。
也就是當類一經加載,就立刻執行。
回答滿意嗎??。。。。。呵呵。。。。。。。。。
Java中如何定義公共靜態語句塊
static 塊僅適合當前類的初始化工作,它本身相當于一個匿名構造方法,所以不是用來定義變量的,你只能在這里面初始靜態變量而不是定義這些變量。
另外,static 按照概念來說是不是為了繼承服務的。在 Java 中也有潛在的導致復雜性增加的出錯機率。
比如:當父子兩個類都有一個 static 方法中 name(),現在當我們使用
Parent a = new Parent();
Parent b = new Child();
Child c = new Child();
*();
*();
*();
我們觀察a,b,c 的輸出結果就能看出來, a, b 輸出是一樣的,而 c 的輸出卻不同。所以 Eclipse 在編譯這樣的代碼時會給出警告信息提醒你使用 *() 或 *() 而不是使用變量 a,b,c.