類的方法使用和記憶體分配

2021-06-25 16:02:14 字數 4026 閱讀 8536

方法

5要素:修飾詞、返回值型別、方法名、引數列表、方法體。

例如:public static void main(string  args)

其中,public static

是修飾詞;

void

是返回值型別,

main

是方法名;

string args是引數型別和引數;被大括號包裹的是方法體。

注意事項:

(1)方法的引數可有可無,但有引數時更靈活

(2)當方法不需要返回結果時,返回值型別用void

。(3)當方法需要返回值型別時,設定返回值型別,返回值型別可以是基本型別也可以是引用型別,通過return

返回結果,返回的結果必須與返回值型別匹配。無論

return

有無返回結果,使用了

return

都將結束方法體。

構造方法:常常用於給成員變數(非靜態變數)初始化,初始化的是類的例項。

注意事項:

(1)方法名必須和類名相同,無返回值型別(

也不用void)

(2)不能被static

、final

、synchornized

、abstract

、native

修飾(3)在建立物件的同時被自動呼叫

(4)若自己未寫構造方法,則編譯器會預設給出乙個無方法體的無參構造方法。

(5)若自己寫了構造方法,則編譯器不會給出缺省的無參構造,只能使用我們自己定義的構造方法。

靜態方法:被static

修飾的方法。

注意事項:

(1)這類方法沒有隱式的this

和super

,不能使用這兩關鍵字

(2)只能訪問靜態的變數和方法(用類名直接訪問 ),不能直接訪問例項變數和例項方法,若需訪問可用間接用例項物件訪問。

(3)不能和abstract

連用,靜態方法必須要實現。

(4)位於記憶體中的方法區。

(5)構造方法可以有多個過載,但不能被重寫。

非靜態方法:未被static

修飾的方法。

和靜態方法的區別:

(1)這類方法有隱式的this

和super

,可以使用

this

訪問當前物件,用

super

訪問父類物件。

(2)可以直接訪問靜態的變數和方法, 也可以訪問非靜態的變數和方法。

靜態**塊:static{ **塊 },用於對類的靜態變數賦值,初始化類。

注意事項:

(1)靜態**塊是屬於類的**塊,主要用於對類的靜態變數初始化。

(2)位於方法區中,在類載入期間執行,且只執行一次。

(3)類中不同的靜態**塊會根據它們在類中出現的順序被依次執行。

(4)靜態**塊通常用於軟體載入靜態資源。

抽象方法:被abstract

修飾的方法。用於描述系統具有什麼功能,而不提供具體的實現。

注意事項:

(1)抽象方法是乙個不完整的方法,沒有方法體,也沒有{},以分號結尾。

格式為:訪問修飾詞 abstract 

返回值型別  方法名(引數列表);

eg:public abstract int getnumber

(int  a

);(2)抽象方法必須被子類實現,所以不能用private

修飾。(3)抽象方法必須包含在抽象類中。

抽象類:被abstract

修飾的類

注意事項:

(1)抽象類不能被例項化。

(2)抽象類不能被private

、final

、static

修飾(3)如果乙個類繼承了抽象類,那麼子類必須重寫其繼承的抽象方法。(不一定必須實現,仍可重新為抽象方法)

(4)乙個抽象類可能不包含抽象方法,但包含抽象方法的類必定是抽象類

抽象類的意義:

(1)封裝子類中的重複內容(成員變數和方法)

(2)為子類提供乙個公共的型別

(3)定義有抽象方法,可以讓子類重寫該方法實現不同的功能

介面(interfence:一種標準或規範,是一種特殊的抽象類。

注意事項:

(1)在介面中只包含抽象方法和常量。常量的(public static final

)可以省略。

(2)介面的實現是使用implements

關鍵字。

(3)乙個類實現某個介面後必須要實現該介面中的所有方法,且重寫方法時,方法的修飾詞應為public

。(4)乙個介面可以繼承另乙個介面,乙個類可以實現多個介面,中間用逗號分隔。

(5)當乙個類既有繼承,又有介面,那麼先繼承再實現介面

方法的過載和重寫

方法的過載(overload

):在同乙個類中,方法名相同,引數列表不相同的方法就是方法的過載。無論返回值型別和訪問修飾詞如何,只要符合上述條件就是方法的過載。在編譯期繫結,看型別。可以被多次過載。

方法的重寫(override

):在父子類中,滿足「兩同兩小一大」條件要求的方法才算方法的重寫。只能重寫一次。條件如下:

兩同:方法名和引數列表相同

兩小:子類的返回值型別小於等於父類;子類丟擲的異常小於等於父類。

一大:子類的訪問許可權大於或等於父類。

變數:分為靜態變數和例項變數

在類中變數分為成員變數和區域性變數,成員變數又分為例項成員變數和靜態成員變數。

成員變數:定義在類中,由系統設定預設值,可以不顯式化初始化。成員變數儲存在堆中,生命週期為:例項化物件時出生,物件被**時死亡。

區域性變數:定義在方法中,不能被顯式的訪問修飾詞(public

,private

,protected

)和static

修飾,不能通過類名或引用名訪問,沒有預設值,使用前必須自行設定初始化。區域性變數儲存在棧中。生命週期為:方法呼叫時出生,方法結束時從棧中清除。

靜態變數:被static

修飾的變數,儲存在方法區中,在記憶體中只有乙份,被所有例項共享,屬於類。可以直接通過類名訪問。生命週期取決於類的生命週期。

例項變數:未被static

修飾,沒建立乙個例項,都會為例項變數分配一次記憶體,儲存於堆中,屬於物件,乙個物件乙份例項變數。生命週期取決於生命週期。

記憶體分配:堆、棧、方法區

堆:儲存new

出來的物件例項(包括成員變數)

棧:儲存區域性變數,引用。呼叫方法時,棧中分配該方法的棧幀,棧幀中包括引數和區域性變數。當方法執行結束時,棧幀被清除,區域性變數失效。

方法區:儲存類的資訊(.class

及方法)和靜態變數,方法只有乙份,通過

this

區分物件。

package com.blogs.yuan;

public class a

/*** 過載構造方法

* @param a

*/public a(int a)

/*** 靜態**塊,用於載入靜態資源,初始化類

*/static

/*** 靜態方法,測試靜態方法的使用

*/public static void teststatic()

public void testnotstatic()

//public abstract int getnumber(int a); //若存在抽象方法,那麼類必須是抽象類,不能被例項化。

public static void main(string args)

}class b extends a

//重寫父類方法,並覆蓋它

public void testnotstatic()

}

類和動態記憶體分配

part 1 靜態類成員特點 無論建立了多少物件,程式都只建立乙個靜態類變數副本。也就是說,類的所有物件共享乙個靜態成員。靜態資料成員在類宣告中宣告,在包含類方法的檔案中初始化。初始化時使用作用域運算子來指出靜態成員所屬的類。但如果靜態成員是const整數型別或列舉型,則可以在類宣告中初始化。par...

類和動態記憶體分配

整理自 c primer plus vector force1 50,60 vector force2 10,70 vector max max max force1,force2 version1 vector max const vector v1,const vector v2 version...

類物件的記憶體分配

類的大小一般是指經過例項化後類物件的大小。1真空類 長度 1 class a 2空類 長度1,同真空類。class a public a a void fun 成員函式不會影響類的大小。3簡單類,長度4 class a 4有虛函式的類 長度 4 class a 注1 虛函式表 如果基類派生類定義了虛...