### 面向?qū)ο缶幊?/p>
面向?qū)ο缶幊趟枷?/p>
隨著互聯(lián)網(wǎng)項(xiàng)目需求越來(lái)越復(fù)雜嫂沉,面向過(guò)程不能滿足国旷,使用面向?qū)ο蟆?/p>
將功能(方法/函數(shù))封裝進(jìn)對(duì)象、強(qiáng)調(diào)了具備了功能的對(duì)象蛔屹,以類/對(duì)象為最小單位矢沿,考慮誰(shuí)來(lái)做滥搭。
兩個(gè)要素:類和對(duì)象
面向?qū)ο蟪绦蛟O(shè)計(jì)的重點(diǎn)是類的設(shè)計(jì)
類的設(shè)計(jì)就是類的成員的設(shè)計(jì)
類和對(duì)象的使用(面向?qū)ο笏枷肼涞氐膶?shí)現(xiàn)):
1酸纲、創(chuàng)建類捣鲸,設(shè)計(jì)類的成員
2、創(chuàng)建類的對(duì)象
3闽坡、通過(guò)“對(duì)象栽惶,屬性”和“對(duì)象愁溜,方法”調(diào)用對(duì)象的結(jié)構(gòu)next
-類
? 類是一組相關(guān)屬性和行為的組合
? 類是對(duì)一類事物的描述,是抽象的外厂,概念上的定義冕象。
? 實(shí)際存在的該類事物的每個(gè)個(gè)體,因?yàn)橐卜Q為實(shí)例(instance)
? 面向?qū)ο蟪绦蛟O(shè)計(jì)的重點(diǎn)是類的設(shè)計(jì)
? 類的設(shè)計(jì)就是類的成員的設(shè)計(jì)汁蝶。
? Java代碼世界是由諸多個(gè)不同的功能的類構(gòu)成的渐扮。再大的項(xiàng)目都是由類實(shí)現(xiàn)的。
? 例外情況是接口掖棉,就不是類構(gòu)成的墓律。
? Java有豐富的類庫(kù)和第三方庫(kù)
-類和對(duì)象的創(chuàng)建
-類的結(jié)構(gòu)
? 事物描述類
? 創(chuàng)建Person類的屬性和方法:
? public class Person{
? String name;
? int age = 1幔亥;
? boolean isMale耻讽;
? public void eat(){
? System.out.println("eat")
? }
? public void talk(String language){
? System.out.println("talk"+language)
? }
? }
-成員一:屬性Field
? 屬性:對(duì)應(yīng)類中的成員變量
? field=屬性=成員變量=域、字段
? String name帕棉;
? int age = 1针肥;
? boolean isMale;
-=成員變量Member
? 類中香伴,方法外慰枕,儲(chǔ)存在堆內(nèi)存
? 不需要給初始化值
? 1.就是屬性,直接定義在類的一對(duì){}內(nèi)的屬性
? ....
? 都指非static
? 2.可以使用權(quán)限修飾符:(結(jié)構(gòu)被調(diào)用可見(jiàn)性的大新髦稀)捺僻,跟封裝性有關(guān)系
? private
? public
? static
? 缺省=不寫(xiě)的情況下
? protected
? 3.有默認(rèn)初始化值,根據(jù)其類型
? 整型(byte short int long=0)
? 浮點(diǎn)型(float double=0.0)
? 字符型(char=0或崇裁、=\u0000)
? 布爾型(false)
? 引用數(shù)據(jù)類型(類匕坯、數(shù)組、接口=null)
? string=null
? 4.屬性在內(nèi)存中加載到堆空間
? public class Student{
? string name;-聲明一個(gè)姓名string變量
? int age;聲明一個(gè)年齡int變量
? }
? 5.隨著對(duì)象的創(chuàng)建而存在拔稳,隨著對(duì)象的消失而消失
-private
? 可以修飾成員變量和成員方法
? 被private修飾的成員只能在本類中才能訪問(wèn)葛峻。
? 控制數(shù)據(jù)安全性。
? 在Demo創(chuàng)建對(duì)象的時(shí)候就無(wú)法調(diào)用巴比。
? 針對(duì)private修飾的成員變量术奖,我們會(huì)相應(yīng)的提供getXxx()和setXxx()方法,用于獲取和設(shè)置成員變量的值和方法轻绞。
? private int age
? public void setAge(int a){
if(a<0||a>200){
System.out.println("wrong age");
}else{
age=a;
? }
}
? public int getAge(){
return age;
? }
? 在Demo中就可以調(diào)用private的成員變量采记。
? public static void main..
s.setAge(00);
-成員二:方法/函數(shù)
? 描述類應(yīng)該具有的功能
? 行為=方法=功能:對(duì)應(yīng)類中的成員方法
? method=成員方法=函數(shù)
? 函數(shù)式一塊代碼塊,接收零個(gè)或多個(gè)參數(shù)政勃,做一個(gè)特殊的事情唧龄,并返回零個(gè)或一個(gè)值。
? 任何函數(shù)都必須是類的成員奸远,寫(xiě)在class里既棺。
? public void eat(){
? System.out.println("eat")
? }
? public void talk(String language){
? System.out.println("talk"+language)
? }
? 調(diào)用函數(shù)invoke a method
? int z= max(x,y)
? 方法是功能的封裝讽挟,通過(guò)對(duì)象來(lái)調(diào)用功能。
-定義方法/函數(shù)的結(jié)構(gòu)
? 類中方法的聲明和使用:
? 格式:
? 權(quán)限修飾符 返回值類型 方法名(形參列表)
? 刻畫(huà)類應(yīng)該具有的功能
? math類:sqrt()\random()丸冕。耽梅。
? scanner類:nextXxx。胖烛。
? Array類:sort()\binarySearch()\toString()\equals()
? 方法聲明:
? 1.public void eat(){}沒(méi)參沒(méi)返回
? 2.public void sleep(int hour){}有參沒(méi)返
? 3.public String getName(){} 沒(méi)參有返
return name調(diào)用屬性
? ? ? public void setAge(int i) { //聲明方法setAge
? ? ? age = i; //將參數(shù)i的值賦給類的成員變量age
? 4.public String getNation(String nation){}有參有返
return nation
? 方法的格式:
? 修飾符 返回值類型 方法名(參數(shù)類型 參數(shù)名1眼姐,參數(shù)類型 參數(shù)名2.。佩番。妥凳。){
? 方法體;
? return返回值
? }
? public static void main(){
for(int i=0; i<20; i++){
System.out.println("Hello World!")
? }
? }
? 方法中只能調(diào)用方法或?qū)傩源鸩叮豢梢栽诜椒▋?nèi)部定義方法逝钥。
-修飾符modifier
? 可以有,可以沒(méi)有
? 都是有意義的
? public誰(shuí)都可以訪問(wèn)
? static這個(gè)函數(shù)是靜態(tài)的拱镐,整個(gè)類的
? 沒(méi)有static說(shuō)明是屬于這個(gè)類的某一個(gè)對(duì)象艘款,而不是屬于整個(gè)類的
-訪問(wèn)權(quán)限修飾符Access Modifier(關(guān)鍵字)
? 封裝性
-四種權(quán)限關(guān)鍵字
-private
-屬性/方法
-封裝性
-缺省/default
? 什么也不寫(xiě)
-protected
-public
? public誰(shuí)都可以訪問(wèn)的類
? 在一個(gè)java源文件中可以聲明多個(gè)class。但是沃琅,只能最多有一個(gè)類聲明為public哗咆,并且和類源文件同名。
-其他關(guān)鍵字
-package關(guān)鍵字
-import
-static屬于整個(gè)類的
? static這個(gè)函數(shù)是靜態(tài)的益眉,整個(gè)類的
? 比如main方法(JDK直接調(diào)用的方法)
? 不能用this晌柬,不依附于對(duì)象。
? 沒(méi)有static說(shuō)明是屬于某個(gè)類的某一個(gè)對(duì)象郭脂,而不是屬于整個(gè)類的年碘。
? public static void main....
? 靜態(tài)方法不能訪問(wèn)非靜態(tài)成員方法和非靜態(tài)成員變量(因?yàn)椴灰蕾囉趯?duì)象),但在非靜態(tài)成員方法中可以不用對(duì)象訪問(wèn)靜態(tài)方法和變量展鸡。
? 帶有static的方法屿衅,可以通過(guò)類的名稱去直接調(diào)用。其他的需要?jiǎng)?chuàng)建對(duì)象莹弊。
? 所以方便在沒(méi)有創(chuàng)建對(duì)象的情況下來(lái)進(jìn)行調(diào)用(靜態(tài)方法/變量/)涤久。
? 不依賴對(duì)象進(jìn)行訪問(wèn),只要類被加載了忍弛,就可以通過(guò)類名去進(jìn)行訪問(wèn)响迂,
-this
? this:代表所在類的對(duì)象引用。當(dāng)前調(diào)用對(duì)象的引用细疚。用在屬性和參數(shù)同名時(shí)蔗彤。
? ? 它在方法內(nèi)部使用,即這個(gè)方法所屬對(duì)象的引用;
? ? 它在構(gòu)造器內(nèi)部使用,表示該構(gòu)造器正在初始化的對(duì)象幕与。
? ? this 可以調(diào)用類的屬性、方法和構(gòu)造器
? ? 什么時(shí)候使用this關(guān)鍵字呢?
? ? 當(dāng)在方法內(nèi)需要用到調(diào)用該方法的對(duì)象時(shí)镇防,就用this啦鸣。
? 具體的:我們可以用this來(lái)區(qū)分屬性和局部變量。 比如:this.name = name;
? 成員變量=屬性
? 局部變量=參數(shù)
-super關(guān)鍵字
-final
-變量
-類
-方法
-abstract
-類
-方法
-返回值類型return value type
? 有返回值&沒(méi)有返回值
? 1.如果有返回值来氧,必須在方法聲明時(shí)指定返回值的類型诫给,同時(shí),方法中需要使用return關(guān)鍵字來(lái)返回指定類型的變量或常量啦扬。
? 2.沒(méi)有返回值中狂,則聲明方法是,使用void來(lái)表示扑毡。使用return表示結(jié)束方法胃榕。
? 3.定義方法該不該有返回值。根據(jù)要求瞄摊,憑經(jīng)驗(yàn)勋又。
-void空類型
? 沒(méi)有返回值return的方法
? 調(diào)用時(shí)直接調(diào)用,不用傳遞參數(shù)
? void修飾的方法的調(diào)用:
? public class MethodTest(){
public static void main(String[] args)
? }
public static void helloWorld(){
for (int i=1;i<10,i++){
System.out.println("HelloWorld")
}
? }
? 練習(xí)
-int换帜、float楔壤、double、string
? 有return值惯驼,調(diào)用時(shí)需傳遞參數(shù)
-方法名method name
? 屬于標(biāo)識(shí)符蹲嚣,遵循標(biāo)識(shí)符的規(guī)則和規(guī)范,符合見(jiàn)名知意祟牲。
-main入口函數(shù)
? 程序的入口是main方法隙畜,格式是固定的
-形參列表parameter list
? 相當(dāng)于數(shù)學(xué)里的自變量,可以沒(méi)有说贝,也可以有多個(gè)禾蚕,用逗號(hào)隔開(kāi),用括號(hào)括起來(lái)狂丝。
? 每個(gè)參數(shù)都要有參數(shù)類型和參數(shù)名换淆。
? 形參:方法聲明時(shí)的參數(shù)
? 方法可以聲明0個(gè)1個(gè)或多個(gè)形參。
? 格式:(數(shù)據(jù)類型1 形參1几颜,數(shù)據(jù)類型2 形參2倍试,。蛋哭。县习。)
-參數(shù)結(jié)構(gòu)
-參數(shù)類型
? String類型的數(shù)組參數(shù)列表
? String[]
-基本類型
-引用類型
-數(shù)組
-類
-接口
-參數(shù)名args
-參數(shù)類型
-無(wú)形參
-有形式參數(shù)formal parameter
-方法參數(shù)的使用
-方法的重載
? 即同名方法,參數(shù)不同
? 使用重載方法,可以為編程帶來(lái)方便躁愿。
? 在調(diào)用方法的時(shí)候叛本,Java虛擬機(jī)會(huì)通過(guò)傳入的參數(shù)列表的個(gè)數(shù)和類型的不同來(lái)區(qū)別。
? ? 重載的概念?
? 在同一個(gè)類中彤钟,允許存在一個(gè)以上的同名方法来候,只要它們的參數(shù)個(gè)數(shù)或者參數(shù) 類型不同即可。?
? 重載的特點(diǎn):?
? ? 與返回值類型無(wú)關(guān)逸雹,只看參數(shù)列表营搅,且參數(shù)列表必須不同。(參數(shù)個(gè)數(shù)或參數(shù)類 型)梆砸。調(diào)用時(shí)转质,根據(jù)方法參數(shù)列表的不同來(lái)區(qū)別。?
? 重載示例:?
? //返回兩個(gè)整數(shù)的和
? int add(int x,int y){return x+y;}?
? //返回三個(gè)整數(shù)的和
? int add(int x,int y,int z){return x+y+z;}?
? //返回兩個(gè)小數(shù)的和
? double add(double x,double y){return x+y;}?
? public class PrintStream {
? public static void print(int i) {......} public static void print(float f) {......} public static void print(String s) {......}?
? public static void main(String[] args) { print(3);?
? print(1.2f);?
? print("hello!");
-可變個(gè)數(shù)形參
? 定義可變長(zhǎng)度參數(shù)的方法
? 說(shuō)明:?
? 1.聲明格式:方法名(參數(shù)的類型名 ...參數(shù)名)
? public void test1(String ... books){?
? System.out.println("****形參長(zhǎng)度可變的test1方法****");?
? }
? 2.可變參數(shù):方法參數(shù)部分指定類型的參數(shù)個(gè)數(shù)是可變多個(gè):0個(gè)帖世,1個(gè)或多個(gè) 3. 可變個(gè)數(shù)形參的方法與同名的方法之間休蟹,彼此構(gòu)成重載
? 4.可變參數(shù)方法的使用與方法參數(shù)部分使用數(shù)組是一致的
? 5.方法的參數(shù)部分有可變形參,需要放在形參聲明的最后
? 6.在一個(gè)方法的形參位置日矫,最多只能聲明一個(gè)可變個(gè)數(shù)形參
-值傳遞機(jī)制
? Java里方法的參數(shù)傳遞方式只有一種:值傳遞鸡挠。 即將實(shí)際參數(shù)值的副本 (復(fù)制品)傳入方法內(nèi),而參數(shù)本身不受影響搬男。?
? 形參是基本數(shù)據(jù)類型:將實(shí)參基本數(shù)據(jù)類型變量的“數(shù)據(jù)值”傳遞給形參?
? 形參是引用數(shù)據(jù)類型:將實(shí)參引用數(shù)據(jù)類型變量的“地址值”傳遞給形參
? 引用類型:類(對(duì)象)(string類)拣展,數(shù)組
-方法體statements method header
? 代碼功能語(yǔ)句
? 包含局部變量
? 調(diào)用一個(gè)功能時(shí),主要是對(duì)方法體的體現(xiàn)缔逛。
? 之后大部分時(shí)間都是在寫(xiě)方法體备埃。
? 方法的使用:
? 1.在方法內(nèi)可以調(diào)用當(dāng)前類的屬性和方法。遞歸方法褐奴。
? 2.方法里不能定義另一個(gè)方法按脚。
-方法的使用
-成員方法
? 和定義方法一樣,但是去掉static
? public void study(){
Sys...
? }
? public void eat(){
Sys...
? }
-遞歸方法/函數(shù)
? resursion
? 方法的使用中敦冬,可以調(diào)用當(dāng)前類的屬性和方法辅搬。
? 特殊的,方法A中又調(diào)用了方法A--遞歸方法脖旱。
? 遞歸方法:一個(gè)方法體內(nèi)調(diào)用它自身堪遂。?
? 方法遞歸包含了一種隱式的循環(huán),它會(huì)重復(fù)執(zhí)行某段代碼萌庆,但這種重復(fù)執(zhí) 行無(wú)須循環(huán)控制溶褪。?
? 遞歸一定要向已知方向遞歸,否則這種遞歸就變成了無(wú)窮遞歸践险,類似于死 循環(huán)猿妈。
? 死循環(huán)會(huì)出現(xiàn)棧溢出:Stack Overflow
? public int getSum(int n){
if(n==1){
return 1;
}else{
return n + getSum(n-1);
? }
? }
-數(shù)組快排
-斐波那契數(shù)列
? 規(guī)律:一個(gè)數(shù)等于前兩個(gè)數(shù)之和
? 1 1 2 3 4? 5 8 13 21 34 55?
? f(n)=f(n-1)+f(n-2)
-漢諾塔問(wèn)題
-局部變量=本地變量
? 1.聲明在方法內(nèi)吹菱、方法形參、代碼塊內(nèi)彭则、構(gòu)造器形參鳍刷、構(gòu)造器內(nèi)部的變量,
? 儲(chǔ)存在棧內(nèi)存俯抖。
? 方法形參:
? public void talk(String language-形參)
? 方法內(nèi):
? public void eat(){
? String food = "pizza";
? System.out.println("I like eat "+food)
? }
? 2.不可以使用權(quán)限修飾符输瓜,只有final
? 3.沒(méi)有初始化值,在調(diào)用局部變量前一定要賦值初始化蚌成,形參在到用時(shí)賦值即可。
? 4.局部空間在內(nèi)存中加載在椓菽螅空間
? 5.隨著方法的調(diào)用而存在担忧,隨著方法的調(diào)用完畢而消失
-方法與數(shù)組
-遍歷數(shù)組
-獲取最值
-元素的和
-返回值return
? 表明結(jié)果是什么,以及結(jié)束程序坯癣。
? 一個(gè)函數(shù)里面可以有多個(gè)return瓶盛。
? 找到了,返回相對(duì)應(yīng)數(shù)據(jù)類型的值示罗,沒(méi)找到返回-1(Java默認(rèn))
? 使用:
? 1.使用范圍:方法體內(nèi)
? 2.作用:1)void結(jié)束方法
2)有返回值的惩猫,返回所數(shù)據(jù)。
? 3.注意點(diǎn):return關(guān)鍵字后面不可以聲明執(zhí)行類型蚜点。
-成員三:構(gòu)造器constructor
? 不是方法轧房,跟方法不一樣
? 構(gòu)造器作用:
? 沒(méi)有定義,系統(tǒng)會(huì)默認(rèn)提供一個(gè)空參構(gòu)造器
? 創(chuàng)建對(duì)象绍绘;給對(duì)象進(jìn)行初始化
? 一個(gè)類中可以定義多個(gè)構(gòu)造器(重載)
? 一旦顯示的定義了類的構(gòu)造器之后奶镶,系統(tǒng)就不再提供默認(rèn)的空參構(gòu)造器
? 一個(gè)類中,至少一個(gè)構(gòu)造器
? 定義構(gòu)造器的格式:
? 權(quán)限修飾符 類名(形參列表)
? 給對(duì)象的類型進(jìn)行初始化
? 和類同名的方法
? 沒(méi)有寫(xiě)構(gòu)造方法的時(shí)候陪拘,系統(tǒng)會(huì)默認(rèn)創(chuàng)建一個(gè)無(wú)參無(wú)返回值的構(gòu)造器厂镇。
? 定義構(gòu)造器格式:
? 1.權(quán)限修飾符
? 2.方法名和類名相同
? 3.沒(méi)有返回值的方法,連void都沒(méi)
? 4.(形參列表)p1.name
? Person p1 = new Person("Tom")
? public person(String n){
name=n;
? }
Sys左刽。捺信。。欠痴。
? *沒(méi)有的時(shí)候顯示默認(rèn)的迄靠,寫(xiě)了就會(huì)顯示寫(xiě)的。
? 調(diào)用:
? 通過(guò)new這個(gè)關(guān)鍵字調(diào)用
? 創(chuàng)建類對(duì)象:new+構(gòu)造器()
? person p1 = new person();
? 構(gòu)造器是創(chuàng)建對(duì)象
? 注 意:
? ?Java語(yǔ)言中喇辽,每個(gè)類都至少有一個(gè)構(gòu)造器?
? ?默認(rèn)構(gòu)造器的修飾符與所屬類的修飾符一致?
? ?一旦顯式定義了構(gòu)造器梨水,則系統(tǒng)不再提供默認(rèn)構(gòu)造器?
? ?一個(gè)類可以創(chuàng)建多個(gè)重載的構(gòu)造器?
? ?父類的構(gòu)造器不可被子類繼承
-成員四:代碼塊
-static
-非static
-final關(guān)鍵字
-成員五:內(nèi)部類
-抽象類與抽象方法
-接口interface
? ? 一方面,有時(shí)必須從幾個(gè)類中派生出一個(gè)子類茵臭,繼承它們所有的屬性和方?
? 法疫诽。但是,Java不支持多重繼承。有了接口奇徒,就可以得到多重繼承的效果雏亚。?
? ?另一方面,有時(shí)必須從幾個(gè)類中抽取出一些共同的行為特征摩钙,而它們之間又 沒(méi)有is-a的關(guān)系罢低,僅僅是具有相同的行為特征而已。例如:鼠標(biāo)胖笛、鍵盤(pán)网持、打 印機(jī)、掃描儀长踊、攝像頭功舀、充電器、MP3機(jī)身弊、手機(jī)辟汰、數(shù)碼相機(jī)、移動(dòng)硬盤(pán)等都 支持USB連接阱佛。?
? ?接口就是規(guī)范帖汞,定義的是一組規(guī)則,體現(xiàn)了現(xiàn)實(shí)世界中“如果你是/要...則 必須能...”的思想凑术。繼承是一個(gè)"是不是"的關(guān)系翩蘸,而接口實(shí)現(xiàn)則是 "能不能" 的關(guān)系。?
? ? 接口的本質(zhì)是契約淮逊,標(biāo)準(zhǔn)鹿鳖,規(guī)范,就像我們的法律一樣壮莹。制定好后大家都 要遵守翅帜。
-API
? API:application programming interface,應(yīng)用程序編程接口。是jave提供的基本編程接口
? 定義好了各種動(dòng)作的方法命满,直接調(diào)用接口即可涝滴。
? java API指的就是JDK中提供的各種功能的java類。
? 在下載的JDK里面含有的
? API文檔:java語(yǔ)言提供了大量的基礎(chǔ)類胶台,因此Oracle也為這些基礎(chǔ)類提供了相應(yīng)的API文檔歼疮,用于告訴開(kāi)發(fā)者如何使用這些類,以及這些類里包含的方法诈唬。
? 如何使用:
-常用類庫(kù)(外部類)
? 在JDK里面的java常用開(kāi)發(fā)工具包內(nèi)提供
? 不需要關(guān)心這些類如何實(shí)現(xiàn)
? 是需要學(xué)會(huì)使用即可
-Scanner()
-random()
-object()
-wrapper()
-常用類
-math類:sqrt()\random()...
-scanner類:nextXXX()...
-array類:sort()\binarySearch()\toString()\equals()...
-常用內(nèi)部類的使用
-JavaBean
? 所謂javaBean韩脏,是指符合如下標(biāo)準(zhǔn)的Java類:?
? ?類是公共的?
? ?有一個(gè)無(wú)參的公共的構(gòu)造器?
? ?有屬性,且有對(duì)應(yīng)的get铸磅、set方法
-抽象類
-內(nèi)部類
-匿名內(nèi)部類
-枚舉類
-object類
-包裝(Wrapper)類
-字符串string類
-Subtopic 1
-Subtopic 2
-Subtopic 3
-面向?qū)ο笕筇匦?/p>
-封裝
? 封裝性的體現(xiàn):
? 1.私有屬性
? 2.私有方法
? 3.單例模式赡矢。杭朱。
? 將類的屬性私有化private,同時(shí)提供公共的public方法來(lái)獲取getXxx和設(shè)置setXxx
? 對(duì)屬性的設(shè)置(setXxx)
? legs屬性聲明成private以后不可見(jiàn)吹散,不能調(diào)用弧械,調(diào)用使用接口setLegs方法來(lái)調(diào)用
? public int setLegs(int a)-有形參
? legs=a
? 對(duì)屬性的獲取(getXxx)
? public int getLegs()-沒(méi)有形參
-權(quán)限修飾符
? 封裝性的體現(xiàn),需要權(quán)限修飾符來(lái)配合空民。
? 1.Java規(guī)定的有4種權(quán)限:(從小到大排)
? private
? 2.四種權(quán)限可以用來(lái)修飾類及類的內(nèi)部結(jié)構(gòu):屬性刃唐,方法,構(gòu)造器界轩,內(nèi)部類
? 3.具體的画饥,4種權(quán)限都可以用來(lái)修飾類的內(nèi)部結(jié)構(gòu),修飾類的話浊猾,只能使用缺省抖甘,public
-getXxx/setXxx
? public class Person{
? private int age;
? public int getAge() { //聲明方法getAge()?
? return age; }?
? public void setAge(int i) { //聲明方法setAge
? age = i; //將參數(shù)i的值賦給類的成員變量age?
? }
-包裝(Wrapper)類
-繼承
? 為什么要有繼承??
? 多個(gè)類中存在相同屬性和行為時(shí),將這些內(nèi)容抽取到單獨(dú)一個(gè)類中与殃, 那么多個(gè)類無(wú)需再定義這些屬性和行為单山,只要繼承那個(gè)類即可碍现。?
? 此處的多個(gè)類稱為子類(派生類)幅疼,單獨(dú)的這個(gè)類稱為父類(基類 或超類)≈缃樱可以理解為:“子類 is a 父類”?
? 類繼承語(yǔ)法規(guī)則:
? class Subclass extends SuperClass{ }
? public student extends person{
? }
? 作用:
? ? 繼承的出現(xiàn)減少了代碼冗余爽篷,提高了代碼的復(fù)用性。
? ? 繼承的出現(xiàn)慢睡,更有利于功能的擴(kuò)展逐工。
? ? 繼承的出現(xiàn)讓類與類之間產(chǎn)生了關(guān)系,提供了多態(tài)的前提漂辐。
? ? 子類繼承了父類泪喊,就繼承了父類的方法和屬性。
? ? 在子類中髓涯,可以使用父類中定義的方法和屬性袒啼,也可以創(chuàng)建新的數(shù)據(jù)和?
? 方法。
? ? 在Java 中纬纪,繼承的關(guān)鍵字用的是“extends”蚓再,即子類不是父類的子集,?
? 而是對(duì)父類的“擴(kuò)展”包各。?
? 關(guān)于繼承的規(guī)則:?
? ?子類不能直接訪問(wèn)父類中私有的(private)的成員變量和方法摘仅。
-父類/子類
? ? Java只支持單繼承和多層繼承,不允許多重繼承?
? ? 一個(gè)子類只能有一個(gè)父類?
? ? 一個(gè)父類可以派生出多個(gè)子類
? ? class SubDemo extends Demo{ } //ok
? ? class SubDemo extends Demo1,Demo2...//error
-object類
? 在java中问畅,java.lang.Object 類是所有java類的最高層父類娃属,是唯一一個(gè)沒(méi)有父類的類:
? 如果在類的聲明中未使用extends 關(guān)鍵字指明其父類六荒,則默認(rèn)父類為Object 類。
-子類對(duì)象實(shí)例化
? 子類繼承所以父類的屬性和方法
-單繼承/多層繼承
? 在java中膳犹,只允許單繼承恬吕,也就是說(shuō) 一個(gè)類最多只能顯示地繼承于一個(gè)父類。但是一個(gè)類卻可以被多個(gè)類繼承须床,也就是說(shuō)一個(gè)類可以擁有多個(gè)子類铐料。
-static關(guān)鍵字
-方法的重寫(xiě)override/overwrite
? 定義:在子類中可以根據(jù)需要對(duì)從父類中繼承來(lái)的方法進(jìn)行改造,也稱?
? 為方法的重置豺旬、覆蓋钠惩。在程序執(zhí)行時(shí),子類的方法將覆蓋父類的方法族阅。
? 修改的是方法體篓跛。
? ?要求:
? 1.子類重寫(xiě)的方法必須和父類被重寫(xiě)的方法具有相同的方法名稱、參數(shù)列表 2. 子類重寫(xiě)的方法的返回值類型不能大于父類被重寫(xiě)的方法的返回值類型?
? 3.子類重寫(xiě)的方法使用的訪問(wèn)權(quán)限不能小于父類被重寫(xiě)的方法的訪問(wèn)權(quán)限?
? ?子類不能重寫(xiě)父類中聲明為private權(quán)限的方法
? 4.子類方法拋出的異常不能大于父類被重寫(xiě)方法的異常?
? ? 注意:?
? 子類與父類中同名同參數(shù)的方法必須同時(shí)聲明為非static的(即為重寫(xiě))坦刀,或者同時(shí)聲明為 static的(不是重寫(xiě))愧沟。因?yàn)閟tatic方法是屬于類的,子類無(wú)法覆蓋父類的方法鲤遥。
-this關(guān)鍵字
-super關(guān)鍵字
? ?在Java類中使用super來(lái)調(diào)用父類中的指定操作:?
? ?super可用于訪問(wèn)父類中定義的屬性 ?super可用于調(diào)用父類中定義的成員方法 ?super可用于在子類構(gòu)造器中調(diào)用父類的構(gòu)造器?
? ?注意: ?尤其當(dāng)子父類出現(xiàn)同名成員時(shí)沐寺,可以用super表明調(diào)用的是父類中的成員?
? ?super的追溯不僅限于直接父類?
? ?super和this的用法相像,this代表本類對(duì)象的引用盖奈,super代表父類的內(nèi)存 空間的標(biāo)識(shí)
-調(diào)用屬性和方法
? 調(diào)用屬性:
? 子類重寫(xiě)屬性不會(huì)覆蓋父類的屬性混坞,用super.可以調(diào)用父類屬性,this訪問(wèn)本類中的屬性(super钢坦,this常省略)
? 調(diào)用方法:
? 子類重寫(xiě)方法會(huì)覆蓋父類的方法(帶有this.)究孕,一定要加super,沒(méi)重寫(xiě)的可以不加
-調(diào)用構(gòu)造器
? ?子類中所有的構(gòu)造器默認(rèn)都會(huì)訪問(wèn)父類中空參數(shù)的構(gòu)造器?
? ? 當(dāng)父類中沒(méi)有空參數(shù)的構(gòu)造器時(shí)爹凹,子類的構(gòu)造器必須通過(guò)this(參 數(shù)列表)或者super(參數(shù)列表)語(yǔ)句指定調(diào)用本類或者父類中相應(yīng)的 構(gòu)造器厨诸。同時(shí),只能”二選一”禾酱,且必須放在構(gòu)造器的首行?
? ?如果子類構(gòu)造器中既未顯式調(diào)用父類或本類的構(gòu)造器微酬,且父類中又 沒(méi)有無(wú)參的構(gòu)造器,則編譯出錯(cuò)
-多態(tài)
? 1.理解多態(tài)性:可以理解為一個(gè)事物的多態(tài)性宇植。
? 2.何為多態(tài)性
? 子類對(duì)象的多態(tài)性:父類的引用p2指向子類的對(duì)象Man
? person p2 = new Man()
? person p3 = new Woman
? 3.多態(tài)的使用:當(dāng)調(diào)用子父類同名同參數(shù)的方法時(shí)得封,實(shí)際執(zhí)行的是子類重寫(xiě)父類的方法-虛擬方法調(diào)用
? 注意:子類自己的方法是不能調(diào)用的,方法必須是父類有的指郁,子類重寫(xiě)的忙上,實(shí)際運(yùn)行的是子類重寫(xiě)父類的方法
? Java引用變量有兩個(gè)類型:編譯時(shí)類型和運(yùn)行時(shí)類型。編譯時(shí)類型由聲明 該變量時(shí)使用的類型決定闲坎,運(yùn)行時(shí)類型由實(shí)際賦給該變量的對(duì)象決定疫粥。簡(jiǎn) 稱:編譯時(shí)茬斧,看左邊;運(yùn)行時(shí),看右邊梗逮。
? ?若編譯時(shí)類型和運(yùn)行時(shí)類型不一致项秉,就出現(xiàn)了對(duì)象的多態(tài)性(Polymorphism) ?多態(tài)情況下,“看左邊”:看的是父類的引用(父類中不具備子類特有的方法)?
? “看右邊”:看的是子類的對(duì)象(實(shí)際運(yùn)行的是子類重寫(xiě)父類的方法)
? 4.多態(tài)性的使用前提:
? 類的繼承關(guān)系和方法的重寫(xiě)
? 多態(tài)性不適用于屬性(看左父類)
-虛擬方法調(diào)用
? 虛擬方法調(diào)用(Virtual Method Invocation)?
? ? 正常的方法調(diào)用
? Person e = new Person();?
? e.getInfo();
? Student e = new Student(); e.getInfo();?
? ? 虛擬方法調(diào)用(多態(tài)情況下) 子類中定義了與父類同名同參數(shù)的方法慷彤,在多態(tài)情況下娄蔼,將此時(shí)父類的方法稱為虛擬方法,父?
? 類根據(jù)賦給它的不同子類對(duì)象底哗,動(dòng)態(tài)調(diào)用屬于子類的該方法岁诉。這樣的方法調(diào)用在編譯期是無(wú)法 確定的。?
? Person e = new Student();?
? e.getInfo(); //調(diào)用Student類的getInfo()方法 ? 編譯時(shí)類型和運(yùn)行時(shí)類型?
? 編譯時(shí)e為Person類型跋选,而方法的調(diào)用是在運(yùn)行時(shí)確定的涕癣,所以調(diào)用的是Student類 的getInfo()方法∏氨辏——?jiǎng)討B(tài)綁定
-向下轉(zhuǎn)型(向上轉(zhuǎn)型=多態(tài))
? 有了對(duì)象的多態(tài)以后坠韩,內(nèi)存中實(shí)際上是加載了子類特有的屬性和方法,但是由于變量聲明為父類類型炼列,導(dǎo)致編譯時(shí)只搁,只能調(diào)用父類中聲明的屬性和方法,子類特有的屬性和方法不能調(diào)用唯鸭。
? 如何才能調(diào)用子類特有的屬性和方法须蜗?
? 使用強(qiáng)制類型轉(zhuǎn)換符(自動(dòng)類型提升)
? 較高級(jí)的基本數(shù)據(jù)類型-》較低級(jí)的基本數(shù)據(jù)類型
? Man m1 = (Man)p2;
? m1.earnMoney();
? ...
? 向上轉(zhuǎn)型:多態(tài)
? 向下轉(zhuǎn)型:使用instanceof進(jìn)行判斷
-instanceof操作符(關(guān)鍵字)
? a instanceof A:
? 判斷對(duì)象a是否是類A的實(shí)例硅确。如果是返回true目溉,如果不是返回false。
? 即為了在向下強(qiáng)轉(zhuǎn)之前不出現(xiàn)異常菱农,先做一個(gè)判斷缭付。
? if(p2 instanceof Woman)
? if(p2 instanceof Man)
? 如果a instanceof A返回true,則a instanceof B也返回true循未。其中陷猫,類B是類A的父類。
-單例設(shè)計(jì)模式
-抽象
-抽象類
-抽象方法
-接口
-容器
-設(shè)計(jì)模式
-Java新特性
-泛型
-元注解
-裝箱/拆箱
-枚舉
-可變參數(shù)
-Lambda表達(dá)式
-Stream API
-Data/Time API
### 應(yīng)用程序開(kāi)發(fā)(類庫(kù))
-異常處理
-斷點(diǎn)調(diào)試debug
? 可以通關(guān)斷點(diǎn)調(diào)試插卡程序的執(zhí)行流程
-JDBC
-Oracle/MySQL
-反射
? 通過(guò)對(duì)象倒推類
-網(wǎng)絡(luò)編程Java Web
-多線程編程
-Java常用類庫(kù)
-枚舉類/注解
-Java集合Map
-泛型
-I/O輸入/輸出流編程N(yùn)IO
-網(wǎng)絡(luò)
-集合