本筆記是聽尚硅谷宋紅康老師講解Java基礎(chǔ)所整理
4.1學(xué)習(xí)面向?qū)ο笾骶€:
Java類及類的成員:屬性、方法、構(gòu)造器;代碼塊,內(nèi)部類
面向?qū)ο蟮娜筇卣鳎悍庋b性、繼承性、多態(tài)性
其他關(guān)鍵字
面向過程(POP):Procedure Oriented Programming
面向?qū)ο螅∣OP)? :? Object Oriented Programming
二者都是一種思想,面向?qū)ο笫窍鄬τ诿嫦蜻^程而言的。面向過程,強調(diào)的是功能行為,以函數(shù)為最小單位,考慮怎么做。面向?qū)ο?,將功能封裝進對象,強調(diào)具備了功能的對象,以類/對象為最小單位,考慮誰來做。
4.2基本元素:類、對象
類:對一類事物的描述,是抽象的、概念的定義
對象:是實際存在的該類事物的每個個體,也稱為實例(面向?qū)ο蟪绦蛟O(shè)計的重點是類的設(shè)計)
面試中,若問及什么是類與對象,應(yīng)該舉開發(fā)中的情形,例如Scanner類以及scan對象。
4.2.1常見類的成員:
屬性(filed):成員變量
方法、行為:成員方法、函數(shù)
4.2.2Java類的實例化
//創(chuàng)建Person類的對象
Person p1 = new Person();
//調(diào)用對象的結(jié)構(gòu):屬性、方法
//調(diào)用屬性
p1.name;
//調(diào)用方法
p1.say();
4.2.3類和對象的使用(面向?qū)ο笏枷肼涞氐膶崿F(xiàn))
創(chuàng)建類,設(shè)計類的成員
創(chuàng)建類的對象
通過“對象.屬性”或“對象.方法”調(diào)用對象的結(jié)構(gòu)
如果創(chuàng)建了一個類的多個對象,則每個對象都獨立擁有一套類的屬性(非static類)
4.2.4 屬性(成員變量)vs 局部變量
1)相同點:
定義變量的格式:數(shù)據(jù)類型 變量名 = 變量值;
先聲明,后使用;
變量都有其對應(yīng)的作用域。
2)不同點:
在類中聲明的位置不同
屬性:直接定義在類的一對{}內(nèi);
局部變量:聲明在方法內(nèi),方法形參,代碼塊內(nèi)、構(gòu)造器形參,構(gòu)造器內(nèi)部的變量
關(guān)于權(quán)限修飾符的不同
屬性:可以在聲明屬性時,指明其權(quán)限,使用權(quán)限修飾符;
局部變量:不可使用權(quán)限修飾符
默認(rèn)初始化值不同
屬性:類的屬性,根據(jù)其類型,都有默認(rèn)初始化值。
整形:0? ? 字符型:0(或'\u0000')? ? 引用數(shù)據(jù)類型:null? ? ? 浮點型:0.0? ? ? 布爾型:false
局部變量:沒有默認(rèn)初始化值。意味著,在調(diào)用局部變量之前,一定要顯示賦值
在內(nèi)存中加載位置不同
屬性:加載在堆空間中(非static)
局部變量:加載到??臻g中
4.3方法的聲明
權(quán)限修飾符? 返回值類型? 方法名(形參列表){
方法體;
}
4.3.1關(guān)于權(quán)限修飾符
private、public、缺省、protected
4.3.2關(guān)于返回值類型
有返回值 vs 無返回值
如果方法有返回值,則必須在方法聲明時指明返回值類型,用return關(guān)鍵字返回
如果方法沒有返回值,方法聲明時,用void 表示
4.3.3關(guān)于形參列表
方法可以聲明0個、1個或多個形參。
格式: 數(shù)據(jù)類型1 形參1,數(shù)據(jù)類型2 形參2,...
方法的使用中,可以使用當(dāng)前類的屬性或方法
方法中不可以定義方法
4.4理解“萬事萬物”皆對象
如何理解“萬事萬物”皆對象
4.5對象數(shù)組的內(nèi)存解析
內(nèi)存解析的說明:
引用類型的變量,只可能存儲兩類值:null或地址值(含變量的類型)
匿名對象:
//語法格式:
new Phone().sendEmail();//Phone是已經(jīng)定義好的類
理解:創(chuàng)建的對象沒有顯示的賦給一個變量名;
特征:匿名對象只能調(diào)用一次;
4.6再談方法
4.6.1方法的重載
重載(overload)的概念:
定義:在同一個類中,允許存在一個以上的同名方法,只要它們的參數(shù)個數(shù)或參數(shù)類型不同即可——“兩同一不同”(同一個類、相同方法名;參數(shù)列表不同:參數(shù)個數(shù)不同、參數(shù)類型不同)
例子:
判斷是否重載:嚴(yán)格按照定義來判斷,跟方法的權(quán)限修飾符、返回值類型、形參變量名、方法體都沒有關(guān)系!
在通過對象調(diào)用方法時,確定某一個指定的方法:
方法名 ——> 參數(shù)列表
4.6.2可變形參的方法
jdk5.0新增的內(nèi)容
具體使用:
可變個數(shù)形參的格式:數(shù)據(jù)類型 ... 變量名
當(dāng)調(diào)用可變個數(shù)形參的方法時,傳入的參數(shù)個數(shù)可以是:0個,1個,2個....
可變個數(shù)形參的方法與本類方法名相同,形參不同的方法之間構(gòu)成重載
可變個數(shù)形參的方法與本類方法名相同,形參類型也相同的數(shù)組之間不構(gòu)成重載
可變個數(shù)形參在方法的形參中,必須聲明在末尾
在一個方法的形參位置,最多只能聲明一個可變形參
4.6.3方法參數(shù)的值傳遞機制
關(guān)于變量的賦值:
如果變量是基本數(shù)據(jù)類型,此時賦值的是變量所保存的數(shù)據(jù)值;
如果變量是應(yīng)用數(shù)據(jù)類型,此時賦值的是變量所保存的數(shù)據(jù)的地址值。
方法形參的轉(zhuǎn)遞機制:值傳遞
形參:方法定義時,聲明的小括號內(nèi)的參數(shù)
實參:方法調(diào)用時,實際傳遞給形參的值
值傳遞機制:
如果參數(shù)是基本類型,此時實參賦給形參的是實參真實存儲的數(shù)據(jù)值;
如果參數(shù)是引用數(shù)據(jù)類型,此時實參賦給形參的是實參存儲數(shù)據(jù)的地址值。
4.6.4遞歸方法(了解)
遞歸方法:一個方法體內(nèi)調(diào)用它自身
方法遞歸包含了一種隱式的循環(huán),它會重復(fù)執(zhí)行某段代碼,但這種重復(fù)執(zhí)行無須循環(huán)控制;遞歸一定要向已知方向遞歸,否則這種遞歸就變成了無窮遞歸,類似于死循環(huán)。
4.7面向?qū)ο筇卣髦唬悍庋b與隱藏
程序設(shè)計追求“高內(nèi)聚,低耦合”。
高內(nèi)聚:類的內(nèi)部數(shù)據(jù)操作細(xì)節(jié)自己完成,不允許外部干涉;
低耦合:僅對外暴露少量的方法用于使用。
隱藏對象內(nèi)部的復(fù)雜性,只對外公開簡單的接口,便于外界調(diào)用,從而提高系統(tǒng)的可擴展性、可維護性。通俗的說,把該隱藏的隱藏起來,該暴露的暴露出來,這就是封裝性的設(shè)計思想。
4.7.1問題的引入
當(dāng)創(chuàng)建一個類的對象以后,可以通過“對象.屬性”的方式,對對象的屬性進行賦值,此時賦值只收到屬性的數(shù)據(jù)類型和存儲范圍的制約。但在實際問題中,往往需要給屬性賦值加入額外的限制條件。這個條件就不能在屬性聲明時體現(xiàn),只能通過方法進行限制條件的添加,同時需要避免用戶再使用“對象.屬性”的方法對屬性進行賦值,則需要將屬性聲明為私有的(private),此時,針對于屬性就體現(xiàn)了封裝性。
4.7.2封裝性的體現(xiàn):
將類的屬性xxx私有化(private),同時提供公共的(public)方法來獲?。╣etXxx)和設(shè)置(setXxx)此屬性的值。
不對外暴露的私有的方法
單例模式(將構(gòu)造器私有化)
如果不希望類在包外調(diào)用,可以將類設(shè)置為缺省的
4.7.3權(quán)限修飾符(封裝性體現(xiàn))
Java規(guī)定的四種權(quán)限(從小到大排列):private、缺省、protected、public
四種權(quán)限可以用來修飾類及類的內(nèi)部結(jié)構(gòu):屬性、方法、構(gòu)造器、內(nèi)部類
具體的,四種權(quán)限都可以用來修飾類的內(nèi)部結(jié)構(gòu):屬性、方法、構(gòu)造器、內(nèi)部類
修飾類的話只能使用:缺省、public
總結(jié)封裝性:Java提供了四種權(quán)限修飾符來修飾類及類的內(nèi)部結(jié)構(gòu),體現(xiàn)類及類的內(nèi)部結(jié)構(gòu)在被調(diào)用時的可見性的大小。
4.8類的成員之三:構(gòu)造器(或構(gòu)造方法constructor)
4.8.1構(gòu)造器的作用
創(chuàng)建對象、初始化對象
如果沒有顯式的定義一個構(gòu)造器的話,則系統(tǒng)默認(rèn)提供一個空參的構(gòu)造器
定義構(gòu)造器的格式:權(quán)限修飾符 類名(形參列表){}
一個類中定義的多個構(gòu)造器,彼此構(gòu)成重載
一旦我們顯式的定義了類的構(gòu)造器之后,系統(tǒng)就不再提供默認(rèn)的空參構(gòu)造器
一個類中,至少會有一個構(gòu)造器
4.8.2屬性賦值的先后順序
默認(rèn)初始化
顯式初始化
構(gòu)造器中初始化
通過“對象.方法”或“對象.屬性”的方式,賦值
4.8.3擴展:JavaBean
JavaBean是一種Java語言寫成的可重用組件
所謂JavaBean,指符合如下標(biāo)準(zhǔn)的Java類:
類是公共的
有一個無參的公共構(gòu)造器
有屬性,且有對應(yīng)的get、set方法
4.9關(guān)鍵字:this的使用
this關(guān)鍵字的使用:
????this可以用來修飾:屬性、方法、構(gòu)造器
this修飾屬性和方法:
????this理解為:當(dāng)前對象 或 當(dāng)前正在創(chuàng)建的對象
????在類的方法中,可以使用“this.屬性”或“this.方法”的方式,調(diào)用當(dāng)前對象屬性或方法。
????但通常情況下,省略“this."。特殊情況下,如果方法的形參和類的屬性同名時,必須顯式使用“this.變量”的方式,表明此變量是屬性,而非形參。
????在類的構(gòu)造器中,同上。
this用來調(diào)用構(gòu)造器
????在類的構(gòu)造器中,可以顯式的使用“this(形參列表)”方式,調(diào)用本類中指定的其他構(gòu)造器
????構(gòu)造器不能通過“this(形參列表)”方式調(diào)用自己
????如果一個類中有n個構(gòu)造器,則最多有n-1個構(gòu)造器使用了“this(形參列表)”
規(guī)定:“this(形參列表)”必須聲明在當(dāng)前構(gòu)造器的首行
構(gòu)造器內(nèi)部,最多只能聲明一個“this(形參列表)”,用來調(diào)用其他的構(gòu)造器
4.10 關(guān)鍵字:package、import的使用
package關(guān)鍵字的使用
????為了更好的實現(xiàn)項目中類的管理,提出包的概念;
????使用package聲明類或接口所屬的包,聲明在源文件的首行
????包,屬于標(biāo)識符,遵循標(biāo)識符的命名規(guī)則、規(guī)范(xxxyyyzzz),“見名知意”
????每“.”一次,就代表一層文件目錄
補充:同一個包下,不能命名同名的接口、類
MVC設(shè)計模式
import關(guān)鍵字的使用
? ? 在源文件中顯式的使用import結(jié)構(gòu)導(dǎo)入指定包下的類、接口
????聲明在包的聲明和類的聲明之間
????如果需要導(dǎo)入多個結(jié)構(gòu),則并列寫出即可
????可以使用"xxx.*"的方式,表示可以導(dǎo)入xxx包下的所有結(jié)構(gòu)
????如果使用的類或接口是java.lang包下定義的,則可以省略import結(jié)構(gòu)
????如果使用的類或接口是本包下定義的,則可以省略import結(jié)構(gòu)
????如果在源文件中,使用了不同包下的同名的類,則必須至少有一個類需要以全類名的方式顯示