他是靜態還是動態?

2021-07-22 14:42:50 字數 3283 閱讀 2523

接著上篇,雖然如是說 but這兩篇耦合度還是蠻低的;ok、看了標題大家應該知道我要寫什麼了吧?不知道也沒關係,因為接下來你就know了,靜態與非靜態,下面讓我們一起走向靜態的world。

在執行前編譯時檢查型別,寫**時沒有宣告變數、必須指定型別;在非靜態內部類中不可以宣告靜態成員。

執行期間檢查資料的型別語言。在賦值時得到資料型別,執行過程中可以改變資料型別的結構,物件的函式,變數可以被修改刪除;

function add(a,b)

add(1,2);

add('1',2);

//靜態語言,指定型別

public int add(int a,int b)

動態語言不需要寫很多態別安全**,**量少、設計巧妙;

靜態語言結構清晰規範,方便除錯,適用於新手開發,但是**量大,不便於閱讀、維護;

動態編譯的可執行檔案要附帶動態鏈結庫,在執行時需要呼叫對應動態鏈結庫中的命令,這樣一方面縮小了可執行檔案本身的體積、加快了編譯速度、節省系統資源,另一方面很簡單的程式,即使只用到了鏈結庫中一兩條命令也要附帶乙個相對龐大的鏈結庫,如果沒有安裝對應的執行庫,則該檔案不能執行。

編譯器在編譯可執行檔案的時候就將可執行檔案需要呼叫的部分(動態鏈結庫(.so或.lib)中的部分)提取出來 鏈結到可執行檔案中去,這樣可執行檔案在執行時就不依賴於動態鏈結庫了,優缺點和動態編譯的可執行檔案互補。

ps:編譯器把源**翻譯成機器能識別的**,就想老師檢查學生作業有沒有錯別字和病句一樣,如果發現錯誤則提示(編譯時錯誤)

**跑起來被裝載到記憶體中去,執行時檢查則是在記憶體只能做些操作、判斷

在定義時有static修飾,靜態變數原理是共享資料段,只要沒有進行「寫入」操作一般是不會產生問題的,但是資料通常是用於「讀寫」操作,所以使用靜態變數要注意。

無顯式初始化時預設初始化值為0;

作用域當前函式,定義位置到所在{}結束位置;

生命週期從程式執行到程式退出,貫穿整個執行期間;

當下次函式呼叫時,該變數不會被再次初始化,沿用上次函式退出時的值;

無顯式初始化時預設初始化值為0;

作用域為當前檔案,從定義/宣告位置到檔案結尾; 

生命週期從程式執行到程式退出,貫穿整個執行期間;

只在定義該變數的原始檔內部有用,同一程式其他檔案不能使用;

只初始化一次,防止其他原始檔呼叫 ps全域性變數可以在其他原始檔中初始化;

沒有static修飾(是不是廢話~~)

作用域當前函式

生命週期從函式呼叫到函式退出

無顯式初始化時預設初始值為隨機值

作用域整個專案,最終編譯成可執行檔案的所有檔案中均可以使用

生命週期從程式運動到退出,貫穿整個執行時間,無顯式初始化時預設初始值為0;

類方法前加了static關鍵字,則該方法為靜態方法,屬於類本身;其與靜態變數始終使用同一塊記憶體,通常一些不經常變化而頻繁使用的資料(連線字串、配置資訊)使用該尤物,原理就是共享**段,共享**段是給cpu作為「讀取」用的,可以放心使用,除非進行惡意「修改」執行時的**段;

靜態方法其在記憶體中的**段會隨類的定義而被分配和裝載,在引用靜態方法時,可以使用物件名加字首,也可以使用類名加字首;靜態內部類不能訪問其外部類的非靜態成員變數和方法

;靜態方法中main方法,作為程式執行的入口點,在每個程式中有且只能有乙個——only one;靜態方法

不能被覆蓋

;屬於具體物件,當這個物件建立時,在物件記憶體中會擁有此方法的專用**段;

可以訪問靜態資料成員,也可以訪問非靜態資料成員,也可以訪問非靜態方法,(向無私的靜態方法致敬)

**:)

public class person 

public int birthday(int x)

public static void main(string args)

}

編譯時會出現無法從靜態上下文中引用非靜態變數age和非靜態方法birthday(int)的錯誤,解析上面紅字標註之一。

class parent 

public static void staticmethod()//靜態方法 }

class child extends parent

public static void staticmethod()

}

public class test

}

結果:

parent.static: parent's static method is called

p1.static: parent's static method is called

p2.static: parent's static method is called

p1.nonstatic: parent's non-static method is called

p2.nonstatic: child's non-static method is called

child.static: child's static method is called

c.static: child's static method is called

c.nonstatic: child's non-static method is called

從結果中發現有什麼不一樣的地方嗎?p2實際上是乙個child型別的引用parent p2 = new child();在呼叫靜態方法時執

行的是父類的靜態方法,呼叫非靜態方法時執行的是child非靜態方法,

p2.static: parent's static method is called
p2.nonstatic: child's non-static method is called

上個酸菜

感謝下面大牛們的分享:

變數

靜態編譯

什麼叫編譯時和執行時

「靜態語言」與「動態語言」

靜態方法與非靜態方法的區別

靜態還是動態?

有時候瀏覽國外 時,會看到網頁使用的是不常見的副檔名,從副檔名上看不出他們使用的是何種技術,或者是靜態網頁還是動態網頁。而有些表面是.htm或.html,實際上卻是動態程式檔案。這裡就涉及到靜態 動態的對映問題。常見的有 1,直接設定,擴充套件名為.htm或.html也可以在後台設定成程式檔案執行 ...

如何判斷陣列是靜態還是動態分配的

include include define smaller a,b a b b a define min a,b,c smaller smaller a,b c define abs x x 0 x x void test int p if s u else if s v else int a 1...

神奇的sleep呼叫 因為他是靜態方法

runnable r new runnable catch interruptedexception e catch interruptedexception e 與 thread.sleep 2000 乙個意思 是main執行緒睡了?不是t執行緒睡了?不是呼叫t執行緒的睡眠方法嗎?怎麼也是mian...