Java基礎(chǔ)之面向?qū)ο螅ǘ?/h1>

一、深入變量

前面已經(jīng)說到變量分為成員變量、局部變量。這里將深入探究變量

1、變量的初始化:

局部變量都沒有初始值,所以使用前我們自己要顯示的初始化。因?yàn)橄到y(tǒng)不會對它進(jìn)行初始化操作,也就是說一定要給局部變量賦值才可以使用變量。

定義局部變量后,系統(tǒng)并未為這個(gè)變量分配內(nèi)存空間,直到程序?yàn)檫@個(gè)變量賦值時(shí),系統(tǒng)才會為局部變量分配內(nèi)存,并將初始值保存到該內(nèi)存中。

局部變量不屬于任何類或?qū)嵗虼怂偸潜4嬖谄渌诜椒ǖ臈?nèi)存中。

基本數(shù)據(jù)局部變量:直接把這個(gè)變量的值保存到該變量所對應(yīng)的內(nèi)存中。

引用數(shù)據(jù)局部變量:這個(gè)變量內(nèi)存中存的是地址,通過該地址引用到該變量實(shí)際引用堆里的的對象。

棧內(nèi)存中的變量無需系統(tǒng)垃圾回收,其往往隨方法或代碼塊的運(yùn)行結(jié)束而結(jié)束。

而成員變量可以不用賦值,原因是如果你不給成員變量賦值系統(tǒng)會自動對它進(jìn)行初始化賦于默認(rèn)值,定義成員變量之后系統(tǒng)會分配空間給它,將這個(gè)變量保存在堆中,不同類型的初始值如下:


2、變量的作用域

變量的作用域指的是變量的存在范圍,只有在這個(gè)范圍內(nèi),程序代碼才能訪問它。當(dāng)一個(gè)變量被定義時(shí),它的作用域就確定了:

A、成員變量:在類中聲明,作用域是整個(gè)類。

B、局部變量:作用域是定義開始到定義所在的花括號結(jié)束。

例如:

{

int x = 12;

/*只有x有效*/

{

int q = 96;

/* x與q都有效*/

}

/*只有x有效*/

/*q已經(jīng)無效了*/

}

/*x已經(jīng)無效了*/

作為在作用域里定義的一個(gè)變量,它只有在那個(gè)作用域結(jié)束之前才可使用。 ?注意盡管在C和C++里是合法的,但在Java里不能象下面這樣書寫代碼:

{

int x = 12;

{

int x = 96;

/* illegal */

}

}

編譯器會認(rèn)為變量x已被定義。這樣做使程序產(chǎn)生了混淆。也就是說在同一個(gè)方法中不可以重復(fù)定義同一個(gè)局部變量。

C、引用類型變量:

對象的作用域Java對象不具備與主類型一樣的存在時(shí)間。用new關(guān)鍵字創(chuàng)建一個(gè)Java對象的時(shí)候,它會超出作用域的范 圍之外。所以假若使用下面這段代碼:

{

String s = new String("a string");

} /*作用域的終點(diǎn)*/

那么變量s會在作用域的終點(diǎn)處消失。然而,s指向的String對象依然占據(jù)著內(nèi)存空間。在上面這段代碼 里,我們沒有辦法訪問對象,因?yàn)橹赶蛩奈ㄒ灰粋€(gè)變量s已超出了作用域的邊界。Java有一個(gè)特別 的“垃圾收集器”,它會查找用new創(chuàng)建的所有對象,并辨別其中哪些不再被引用。隨后,它會自動釋放由 那些閑置對象占據(jù)的內(nèi)存,以便能由新對象使用。這意味著我們根本不必操心內(nèi)存的回收問題。只需簡單地 創(chuàng)建對象,一旦不再需要它們,它們就會自動離去。

3、變量的生命周期

指的是一個(gè)變量被創(chuàng)建并分配內(nèi)存空間開始,到該變量被銷毀并清除其所占內(nèi)存空間的過程。不同類型的變量生命周期如下:


二、Package(創(chuàng)建包)、import(導(dǎo)入包)語句

在實(shí)際開發(fā)中,一個(gè)項(xiàng)目可能存在上百個(gè)甚至上千個(gè)Java文件,如果這么多Java文件全部都在一個(gè)包中,很難管理,并且也不允許存在同名的文件.

解決方案:使用package對Java的類實(shí)施分包管理.分包之后,如何去找到包中的某一個(gè)類呢?就需要使用到import去尋找包中的某一個(gè)類。

package語句必須作為文件的第一個(gè)非注釋語句出現(xiàn)。該語句的作用是指出這個(gè)編譯單元屬于名為mypackage包中的一部分。或者換句話說,它表明這個(gè)編譯單元內(nèi)的public類名位于mypackage這個(gè)名 字的下面。如果其他人想使用這個(gè)名字,要么指出完整的名字,要么與mypackage聯(lián)合使用import關(guān)鍵字。注意根據(jù)Java包(封裝)的約定,名字內(nèi)的所有字母都應(yīng)小寫,甚至那些中間單 詞亦要如此。

現(xiàn)在,如果有人想使用mypackage內(nèi)的任何public類,他們必須用import關(guān)鍵 字激活mypackage內(nèi)的名字,使它們能夠使用。

import mypackage.*; // . . . MyClass m = new MyClass();

另一個(gè)辦法則是指定完整的名稱:

mypackage.MyClass m = new mypackage.MyClass();

包名應(yīng)該如何編寫:

1:按照標(biāo)識符的規(guī)范來書寫,

2:全部使用小寫字母,

3:不要使用JDK中的包名,如:java.lang/java.util.

4.如果包中第一個(gè)字母是數(shù)字_520it,我們可以使用_連接或者使用a520it.

5.但是在Android中如果包名使用_打頭,則不能部署到模擬器中去,此時(shí)a520it.

6.要求獨(dú)一無二

三、訪問權(quán)限修飾符

訪問修飾符可以修飾,成員變量,方法.

訪問權(quán)限控制:

①private(類私有):本類內(nèi)部可以訪問,不能被之類繼承,類訪問權(quán)限。

② 無(包私有):本類內(nèi)部可以訪問,同包其他類也可以訪問,能被同包的子類繼承,(包訪問權(quán)限)。

③protected(包和子類私有):本類內(nèi)部可以訪問,不同包的子類也可以訪問,同包其他類也可以訪問,能被子類所繼承。

④public(公共):任何地方都可以訪問,能繼承到子類。

以后,我們把沒有修飾符這種情況都統(tǒng)稱為包私有權(quán)限。


四、this關(guān)鍵字

什么是this(關(guān)鍵字):

表示當(dāng)前對象,哪個(gè)對象調(diào)用this所在的成員(方法/字段),那么this就表示哪個(gè)對象.

一般的,我們使用this主要是使用在方法中,說人話:

哪一個(gè)對象調(diào)用了this所在的方法,那么this就表示哪一個(gè)對象.

構(gòu)造器中的this關(guān)鍵字,表示當(dāng)前所創(chuàng)建的對象.

使用this可以解決哪些問題:

① 解決成員變量和參數(shù)之間的二義性,必須使用;

② 同類中非static方法間互調(diào)。

③ 將當(dāng)前對象作為參數(shù)傳遞給另一個(gè)方法;

④ 當(dāng)前對象作為方法的返回值(鏈?zhǔn)椒椒ň幊?;

⑤ 構(gòu)造器重載的互調(diào),this([參數(shù)])必須寫在構(gòu)造方法第一行;

⑥static不能和this一起使用;

static成員隨著字節(jié)碼加載進(jìn)JVM,就已經(jīng)分配內(nèi)存空間了,而此時(shí)并沒有使用new去創(chuàng)建對象.

static存在的時(shí)候,對象級別數(shù)據(jù)還不存在.記住:在調(diào)用靜態(tài)方法的時(shí)候,是使用類名調(diào)用的,沒有對象.

五、繼承

繼承關(guān)系:

可以基于某個(gè)父類對對象的定義加以拓展,而產(chǎn)生新的子類定義,子類可以繼承父類原來的某些定義,也可以增加原來父類所沒有的定義,或者覆寫父類中的某些特性。

在Java中子類定義時(shí),使用“extends”關(guān)鍵字,并同時(shí)指定父類。

語法格式:class SubClass extends SuperClass{}

在繼承(拓展)關(guān)系中,被繼承的類(SuperClass)稱為父類(超類、基類)。而拓展父類的類(SubClass)稱為子類(派生類、拓展類),子類會自動繼承父類部分的方法和字段,這里的部分和訪問權(quán)限有關(guān)系。

-----------------------------------------------------------------------------------------------------------------

子類到底繼承了父類的哪些成員:

1):SubClass類能繼承SuperClass類中的public和protected成員(字段、方法、內(nèi)部類)。

2):當(dāng)SubClass和SuperClass類是位于同一包中,SubClass類會繼承SuperClass類中的默認(rèn)訪問權(quán)限成員。

3):私有成員和構(gòu)造器,絕對繼承不到。

----------------------------------------------------------------------------------------------------------------

一個(gè)Java類(除了Object外)都有且只有一個(gè)直接的父類,即使一個(gè)類沒有顯示的繼承另外一個(gè)類,那該類的直接父類默認(rèn)是Object。

class Demo{}等價(jià)于class Demo extends Object{}

Java中類的繼承只支持單繼承,不支持多繼承,但是允許多重繼承,java.lang.Object是所有類(除了Object)的根類,Object要么是直接父類要么是間接父類。

方法覆蓋:

方法覆寫的原則(一同兩小一大):復(fù)寫/覆寫/重寫/覆蓋:Override.

一同:

① 實(shí)例方法簽名必須相同。(方法簽名=方法名+方法的參數(shù)列表)

兩小:

② 子類方法的返回值類型是父類方法的返回值類型的子類或相同類,子類方法可以返回一個(gè)更加具體的類型。

③ 子類方法聲明拋出的異常應(yīng)比父類方法聲明拋出的異常更小或相等。

子類方法中聲明拋出的異常小于或等于父類方法聲明拋出異常類型;

子類方法可以同時(shí)聲明拋出多個(gè)屬于父類方法聲明拋出異常類的子類(RuntimeException類型除外);

一大:

④ 子類方法的訪問權(quán)限比父類方法訪問權(quán)限更大或相等。

判斷是否是覆寫方法的必殺技:@Override注解:若方法是覆寫方法,在方法前或上貼上該注解, 編譯通過,否則,編譯出錯(cuò)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容