Final 和static
1. final類不能被繼承,沒有子類,final類中的方法默認是final的
2. final方法不能被子類的方法覆蓋,但可以被繼承
3. final成員變量表示常量,只能被賦值一次,複製後值不再改變
4. final不能用於修飾構造方法
注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型方法默認是final類型的
Final類
不能被繼承,final類中的方法沒有機會被覆蓋,默認是final的
final方法
如果一個類不允許子類覆蓋某些方法,則可以把這個方法聲明爲final方法
使用final方法的原因:
1. 把方法鎖定,防止任何繼承類修改它的意義和實現
2. 高效,編譯器在遇到調用final方法時會轉入內嵌機制,大大提高執行效率
Final變量
Final修飾的變量有三種,靜態變量、實例變量和局部變量,分別表示三種類型的常量
Final參數
當函數參數爲final類型時。可以讀取該參數,但無法改變該參數的值
Public void test( final int i){
//i++; i是final類型的,值不允許改變的
}
Static
Static表示“全局”或靜態的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊,但是java語言中沒有全局變量的概念
被static修飾的成員變量和成員方法獨立於該類的任何對象。也就是說它不依賴於特定的實例,被類的所有實例共享。只要這個類被加載,java虛擬機就能根據類名在運行時數據區的方法區內定找到,因此static對象可以在它的任何對象創建之前訪問,無需引用任何對象
用public 修飾的static成員變量和成員方法本質是全局變量和全局方法,
當聲明它類的對象時,不生成static變量的副本,而是所有的實例共享同一final變量
Static變量前可以有private修飾,表示這個變量不能再其他類直接訪問
1. static 變量
類成員變量分爲被static修身的變量,稱爲靜態變量或類變量,沒有被static修飾變量,叫實例變量區別:
對於靜態變量在內存中只有一個拷貝(節省內存),JVM只爲靜態變量分配一次內存,在加載類的過程中王城靜態變量的內存分配,可用類名直接訪問,當然也可以通過對象來訪問
對於實例變量,每創建一個實例都會爲實例變量分配一次內存,實例變量可以在內存中有多個拷貝,互不影響
2. 靜態方法
可以直接通過類名調用,任何的實例也都可以調用,靜態方法不能用this和super關鍵字,不能直接訪問不帶static的成員變量和成員方法
因爲static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract
3. Static代碼塊
也叫靜態代碼塊,是類中獨立於類成員的static語句塊,JVm加載類時會執行這些代碼
數組
1. 數組中元素類型必須相同
2. 數組的長度一旦指定即不能改變
3. 數組中的值通過數組名和下表組合起來進行訪問
數組類型變量的聲明
int[] a = null,a1;//引用類型變量一定要指向一個對象
int b[]=null,b1;//b1是int類型的變量,b是int類型數組
//a = {1,2,3} 數組常量只能使用在初始化中
a = new int[]{1,2,3};//直接給數組元素初始化,a存儲的是數組的首元素的內存地址
int[] c = {1,2,3};
a1 = new int[3];//創建元素並沒有初始化
靜態初始化和動態初始化
靜態初始化也稱數組的整體賦值
語法格式:
數據類型[] 數據名稱 = {值1,值2,…….值n}
靜態初始化必須和數組的聲明位於同一行,即只能在聲明數組的同時進行靜態初始化
動態初始化。
只爲數組指定長度,並在內存中申請空間
數據類型[] 數組名稱 = new 數據類型[長度
方法(method)
在面向過程的語言中稱作函數。在彙編語言中稱作子程序,是一個代碼功能塊,實現某些特定功能
方法聲明的語法格式:
訪問控制符 [修飾符] 返回值類型方法名稱(參數列表){
方法體
}
1. 訪問控制符
範圍從大到小:public ,protected,無訪問控制符,private
2. 修飾符可選。是爲方法增加特定的語法功能
1) Static 靜態的
2) Final 最終的
3) Abstract 抽象的
4) Synchronized 同步的
5) Native 本地的
方法相同指方法名稱和參數列表都相同
參數傳遞:
在參數傳遞時分爲按值傳遞,按址傳遞
1. 按值傳遞(by value)
按值傳遞指每次傳遞參數時,把參數的原始數據拷貝一份新的,把新拷貝的數值傳遞到方法內部,在方法內部修改時,則修改拷貝出來的值而原始的值不發生改變
說明:使用該方式傳遞的參數,參數原始的值不發生改變
八種基本數據類型和String
2. 按址傳遞(by address)
每次傳遞參數時,把參數在內存中的存儲地址傳遞到方法內部,在方法內部通過存儲地址對應存儲區域的內容。當方法內部改變了參數值後,參數原始的值發生改變
除String之外的所有複合數據類型,包括數組、類和接口
java 只有值傳遞
可變長參數:
1. 定義:例如
Print(String… args){
}
2 調用
調用時可以給任意多個參數也可不給參數
3. 使用規則
(1) 調用方法時,如果能夠和固定參數的方法匹配,也能與可變長參數的方法匹配,則選擇固定參數的方法
(2) 如果要調用的方法可以和兩個可變參數匹配,則出現錯誤
(3) 一個方法只能有一個可變參數,並且這個可變參數必須是該方法的最後一個參數
4,使用規範:
1) 避免帶有變長參數的方法的重載
2) 避免使用null值和空值
覆寫必須滿足的條件:
1) 重寫方法不能縮小訪問權限
2) 參數列表必須與被重寫方法相同(包括顯示形式)
3) 返回類型必須與被重寫方法相同或是其子類
4) 重寫方法不能拋出新的異常或者超過了父類範圍的異常,但可以拋出更少更有限的異常
迭代和遞歸區別:
遞歸是重複調用函數自身實現循環,迭代是函數內某段代碼實現循環,而迭代與普通循環區別是:其循環代碼中參與運算的變量同時是保存結果的變量,當前保存的結果作爲下一次循環計算的初始值
public
//public static void main(String...a){ 正確
//public static void main(String.* a){ 錯誤
//public static void main(String... a){ 正確
//public static void main(String[]... a){ 編譯通過
//public static void main(String... a[]){ 錯誤
public static void main(){
System.out.println("cc");
}