課程(cheng)咨詢: 400-996-5531 / 投訴建議: 400-111-8989
認真做教育 專心促就業(ye)
參(can)賽(sai)學員:李云(yun)龍(long)
獲獎(jiang)獎(jiang)項(xiang):三(san)等獎(jiang)
寫代碼:
1,明(ming)確(que)需求。我要做什么?
2,分(fen)析思路(lu)。我要(yao)怎么做?1,2,3。
3,確定步驟(zou)。每一個(ge)思路(lu)部分用到哪些語句,方(fang)法(fa),和對象。
4,代碼實現。用具體的java語(yu)言(yan)代碼把思路體現出來。
學習新技(ji)術的四點(dian):
1,該技術是什么(me)?
2,該技術有什么特點(使(shi)用注意):
3,該技術怎么使用(yong)。demo
4,該技術什么(me)時候用?test。
-----------------------------------------------------------------------------------------------
一(yi):java概述:
1991 年Sun公(gong)司的(de)(de)James Gosling等人開(kai)始(shi)開(kai)發(fa)名稱為 Oak 的(de)(de)語言,希(xi)望用于控(kong)制嵌入在有線(xian)電(dian)視交換盒、PDA等的(de)(de)微處理(li)器;
1994年將Oak語言更(geng)名為;
Java的三種技(ji)術架構:
JAVAEE:Java Platform Enterprise Edition,開(kai)發企業(ye)環境下的(de)應用程(cheng)序,主要針(zhen)對web程(cheng)序開(kai)發;
JAVASE:Java Platform Standard Edition,完成(cheng)桌面應(ying)用程(cheng)序(xu)的開發,是其它(ta)兩者的基礎;
JAVAME:Java Platform Micro Edition,開發電子消費產品和嵌(qian)入式(shi)設備,如(ru)手(shou)機(ji)中的程(cheng)序;
1,JDK:Java Development Kit,java的(de)(de)開(kai)發和運行環境,java的(de)(de)開(kai)發工具和jre。
2,JRE:Java Runtime Environment,的(de)運行環境,java運行的(de)所需的(de)類庫(ku)+JVM(java虛(xu)擬機(ji))。
3,配置環境(jing)變量:讓java jdk\bin目錄(lu)下的工(gong)具,可以在任意目錄(lu)下運行,原因是,將該工(gong)具所在目錄(lu)告訴了系統,當(dang)使用(yong)該工(gong)具時,由系統幫我們去找(zhao)指定的目錄(lu)。
環(huan)境變量的配置:
1):永久配置方式:JAVA_HOME=%安裝路徑%\Java\jdk
path=%JAVA_HOME%\bin
2):臨(lin)時配置(zhi)方式:set path=%path%;C:\Program Files\Java\jdk\bin
特點(dian):系(xi)統默認先(xian)去當前路(lu)(lu)徑下(xia)找要執行的(de)(de)程序(xu),如果沒有(you),再去path中(zhong)設置的(de)(de)路(lu)(lu)徑下(xia)找。
classpath的配(pei)置:
1):永(yong)久配(pei)置(zhi)方(fang)式(shi):classpath=.;c:\;e:\
2):臨時(shi)配置方(fang)式(shi):set classpath=.;c:\;e:\
注意:在定義classpath環境(jing)變量時,需(xu)要注意的(de)情況
如(ru)果(guo)沒有(you)定義環(huan)境變量classpath,java啟動jvm后(hou),會在當(dang)前目錄下查找要(yao)運(yun)行的類文件;
如果指定了(le)classpath,那么會在指定的目錄下查找要運行的類文件。
還會在當前目錄找嗎(ma)?兩種情(qing)況(kuang):
1):如果classpath的(de)值結(jie)尾處有(you)分號(hao),在具體路徑中(zhong)沒有(you)找到運(yun)行的(de)類,會默認在當前目錄再找一次。
2):如果(guo)classpath的(de)(de)值結果(guo)出沒(mei)有分號,在具體的(de)(de)路徑中沒(mei)有找(zhao)到運行(xing)的(de)(de)類(lei),不(bu)會(hui)再當前目錄(lu)找(zhao)。
一般不(bu)指定分號,如果(guo)沒(mei)有(you)在指定目錄(lu)下(xia)找(zhao)到要運行的類(lei)文件,就報錯,這樣可以調(diao)試程序。
4,javac命令和java命令做什(shen)么事情(qing)呢(ni)?
要知道java是分兩部分的:一個是編譯,一個是運(yun)行。
javac:負(fu)責的(de)(de)是(shi)編(bian)(bian)譯的(de)(de)部(bu)分,當執(zhi)行javac時,會啟動java的(de)(de)編(bian)(bian)譯器程(cheng)序。對指定擴展名的(de)(de).java文件(jian)(jian)進行編(bian)(bian)譯。 生成了jvm可以(yi)識別(bie)的(de)(de)字節碼文件(jian)(jian)。也就是(shi)class文件(jian)(jian),也就是(shi)java的(de)(de)運行程(cheng)序。
java:負責運行的(de)部分(fen).會啟動jvm.加載運行時所需的(de)類庫,并對class文(wen)件進行執行.
一(yi)個(ge)文件要(yao)被執行,必須要(yao)有一(yi)個(ge)執行的起(qi)(qi)始點(dian),這個(ge)起(qi)(qi)始點(dian)就是main函數.
----------------------------------------------------------------------------------------------
二:java語(yu)法基礎:
1,關鍵字:其實(shi)就(jiu)是某種(zhong)語言(yan)賦予了(le)特殊(shu)含義的單(dan)詞。
保(bao)留字:其實就是還沒有賦予特殊含義,但(dan)是準備日(ri)后(hou)要使用過的單詞(ci)。
2,標示(shi)符(fu):其實就(jiu)是在程(cheng)序中自定(ding)義的名(ming)詞。比(bi)如類名(ming),變量名(ming),函(han)數名(ming)。包含 0-9、a-z、$、_ ;
注意:
1),數(shu)字不可(ke)以開頭。
2),不可以(yi)使用關鍵字(zi)。
3,常量:是在程(cheng)序中的不會變化的數據。
4,變量:其(qi)實(shi)就是內(nei)存中的(de)一個存儲空間,用于(yu)存儲常量數(shu)據。
作(zuo)用(yong):方便(bian)于運算。因為有些數(shu)據(ju)不(bu)確定。所以(yi)確定該數(shu)據(ju)的名詞和存儲(chu)空間。
特點:變量空間可以(yi)重復使用。
什么(me)時候定(ding)義(yi)變量(liang)?只要是(shi)數據不確定(ding)的時候,就定(ding)義(yi)變量(liang)。
變(bian)量空(kong)間(jian)的開辟需要什(shen)么要素呢?
1,這(zhe)個空間(jian)要存儲(chu)什么數據?數據類型。
2,這個空間叫什么名(ming)(ming)字啊(a)?變量(liang)名(ming)(ming)稱。
3,這個空間的第一次的數據是什么(me)? 變(bian)量的初始化(hua)值(zhi)。
變(bian)量的(de)作用域和生存(cun)期:
變量的作用域:
作用域從變(bian)量定義的(de)位置開始,到該變(bian)量所在的(de)那對(dui)大括號結束;
生命周期:
變量(liang)從定義的(de)位置開始就在內存中(zhong)活了;
變量到達(da)它所在的(de)(de)作(zuo)用域的(de)(de)時候就在內存(cun)中消失了;
數據類型:
1):基本數據類型(xing):byte、short、int、long、float、double、char、boolean
2):引用數據(ju)類(lei)型: 數組、類(lei)、接口。
級(ji)別(bie)從低到(dao)高為(wei):byte,char,short(這三個平級(ji))-->int-->float-->long-->double
自(zi)動類型轉換:從低級(ji)別到高(gao)級(ji)別,系統自(zi)動轉的;
強制類(lei)型轉換:什么(me)情況下使用?把一(yi)(yi)個高級別(bie)的(de)數賦給一(yi)(yi)個別(bie)該數的(de)級別(bie)低的(de)變量;
運算符號:
1)、算術運算符。
+ - * / % %:任何整數(shu)(shu)模(mo)2不是0就是1,所以只要改變被(bei)模(mo)數(shu)(shu)就可以實現開關運算。
+:連接符。
++,--
2)、賦值運算符。
= += -= *= /= %=
3)、比較運算符。
特(te)點(dian):該運算符的特(te)點(dian)是:運算完(wan)的結(jie)果,要么是true,要么是false。
4)、邏輯(ji)運(yun)算符。
& | ^ ! && ||
邏(luo)輯運算(suan)符除了(le) ! 外都是(shi)用于(yu)連接兩個boolean類型表(biao)達式(shi)。
&: 只有(you)兩邊(bian)都為true結果是true。否則就是false。
|:只(zhi)要兩邊都為false結果是false,否則就是true
^:異或:和或有點(dian)不(bu)一樣。
兩邊結果一樣(yang),就為false。
兩邊(bian)結果(guo)不(bu)一(yi)樣(yang),就為true.
& 和 &&區別: & :無論左(zuo)邊(bian)結果是什(shen)么,右邊(bian)都參與運(yun)算。
&&:短路與,如果左邊為false,那么(me)右邊不參(can)數(shu)與運(yun)算。
| 和|| 區別:|:兩邊(bian)都運算(suan)。
||:短路或,如(ru)果左邊(bian)為true,那么右邊(bian)不參(can)與運算。
5)、位運算符:用(yong)于操作二(er)進制位的(de)運算符。
& | ^
<< >> >>>(無(wu)符(fu)號右移)
練習:對兩(liang)個變(bian)(bian)量(liang)的(de)數(shu)據進(jin)行互換。不需(xu)要第三(san)方變(bian)(bian)量(liang)。
int a = 3,b = 5;-->b = 3,a = 5;
a = a + b; a = 8;
b = a - b; b = 3;
a = a - b; a = 5;
a = a ^ b;//
b = a ^ b;//b = a ^ b ^ b = a
a = a ^ b;//a = a ^ b ^ a = b;
練習:高效的算出(chu) 2*8 = 2<<3;
5,語句。
If switch do while while for
這(zhe)些(xie)語句什(shen)么時候用?
1)、當判斷固定個數的(de)值的(de)時候,可(ke)以使用if,也可(ke)以使用switch。
但是(shi)建議使用switch,效率相對較高。
switch(變(bian)量(liang)){
case 值:要執行(xing)的語句;break;
…
default:要執行的語句;
}
工作(zuo)原理:用小括號中的(de)(de)變量的(de)(de)值依次和(he)case后面的(de)(de)值進(jin)行對比(bi),和(he)哪個case后面的(de)(de)值相同了
就執行哪(na)個case后面(mian)的語(yu)句,如果沒有(you)相(xiang)同(tong)的則(ze)執行default后面(mian)的語(yu)句;
細(xi)節(jie):1):break是可以省略的,如果省略了(le)就一直執行到(dao)遇到(dao)break為止;
2):switch 后(hou)面的(de)小括(kuo)號中的(de)變量應(ying)該是byte,char,short,int四種(zhong)(zhong)類(lei)型(xing)中的(de)一種(zhong)(zhong);
3):default可(ke)以寫在switch結構中的(de)任(ren)意位置(zhi);如果將default語句(ju)放在了第(di)一行,則不(bu)管expression與case中的(de)value是否匹配,程(cheng)序(xu)會從default開始執行直到第(di)一個break出現(xian)。
2)、當(dang)判(pan)斷數(shu)據范圍,獲取判(pan)斷運算結果boolean類型時,需要(yao)使用if。
3)、當某些語(yu)句(ju)需要執行很多次時,就(jiu)用循環結構。
while和for可以進行互換。
區(qu)別在于:如(ru)果需(xu)要(yao)定義(yi)變量(liang)控制循環次數。建議使用for。因為(wei)for循環完畢(bi),變量(liang)在內存中釋放。
break:作用于switch ,和(he)循環(huan)語句,用于跳出(chu),或(huo)者稱為結束(shu)。
break語(yu)句(ju)單獨存(cun)在時(shi),下面(mian)不要定義其他語(yu)句(ju),因(yin)為執行(xing)不到,編(bian)譯會(hui)失敗。當循環嵌套時(shi),break只(zhi)跳出當前所在循環。要跳出嵌套中的外部循環,只(zhi)要給循環起名字即可,這個名字稱(cheng)之為標號(hao)。
continue:只作用于循環結構,繼續循環用的。
作(zuo)用(yong):結束(shu)本次循環,繼續下次循環。該(gai)語句單獨(du)存在時(shi),下面不可以(yi)定義語句,執行不到。
6,函(han) 數:為(wei)了提高代碼的復用(yong)性(xing),可以將其定(ding)義成一個單獨(du)的功能,該功能的體現就是(shi)java中(zhong)的函(han)數。函(han)數就是(shi)體現之一。
java中的(de)函數的(de)定義(yi)格式:
修(xiu)飾符 返(fan)回值類(lei)(lei)型(xing) 函(han)數(shu)名(ming)(參(can)數(shu)類(lei)(lei)型(xing) 形(xing)式參(can)數(shu)1,參(can)數(shu)類(lei)(lei)型(xing) 形(xing)式參(can)數(shu)1,…){
執行語句;
return 返回值;
}
當函(han)數沒有具體的返(fan)回值時,返(fan)回的返(fan)回值類型用void關鍵字表示。
如果函數(shu)的返回值(zhi)類型是void時,return語句可以(yi)省略不寫(xie)的,系統會幫你自動加上。
return的作用(yong):結(jie)束(shu)函數。結(jie)束(shu)功能(neng)。
如(ru)何定義(yi)一個(ge)函數?
函(han)數(shu)其(qi)實(shi)就是(shi)一個(ge)功能(neng),定義函(han)數(shu)就是(shi)實(shi)現功能(neng),通過兩個(ge)明確來(lai)完成:
1)、明確該功能的(de)運算完的(de)結果,其實是(shi)在明確這個函數的(de)返回(hui)值類(lei)型。
2)、在(zai)實(shi)現該(gai)功能的(de)過程中是否(fou)有(you)未(wei)知內(nei)容參與了運算,其實(shi)就是在(zai)明確這個(ge)函數(shu)的(de)參數(shu)列表(參數(shu)類型&參數(shu)個(ge)數(shu))。
函數的作用:
1)、用于(yu)定義功(gong)能。
2)、用于封(feng)裝(zhuang)代碼提(ti)高(gao)代碼的復用性。
注意:函數中只能調(diao)用(yong)函數,不能定義(yi)函數。
主函數:
1)、保證該類的獨立運行。
2)、因為它是程序的入口。
3)、因(yin)為它在被jvm調(diao)用。
函數定義名稱是為什么呢?
答(da):1)、為了(le)對(dui)該(gai)功(gong)能進(jin)行標示,方便(bian)于(yu)調用(yong)。
2)、為了(le)通過名稱就(jiu)可以(yi)明(ming)確函(han)數的功能,為了(le)增加代碼(ma)的閱讀性。
重載(zai)的(de)定義是:在一個類(lei)中,如果出現了兩(liang)個或者兩(liang)個以上的(de)同名函(han)數(shu),只(zhi)要它們的(de)參數(shu)的(de)個數(shu),或者參數(shu)的(de)類(lei)型不同,即(ji)可稱之為該函(han)數(shu)重載(zai)了。
如(ru)何區分重載:當函(han)數(shu)同名時,只看參數(shu)列表(biao)。和返回值(zhi)類(lei)型沒關系。
7,數 組(zu):用于存(cun)儲同(tong)一類型數據(ju)的(de)一個容器。好(hao)處(chu):可以對該容器中的(de)數據(ju)進(jin)行編號,從(cong)0開(kai)始。數組(zu)用于封裝數據(ju),就(jiu)是一個具體(ti)的(de)實體(ti)。
如(ru)何在(zai)java中表(biao)現一個數(shu)組(zu)呢?兩種表(biao)現形式。
1)、元(yuan)素(su)類型[] 變量(liang)名 = new 元(yuan)素(su)類型[元(yuan)素(su)的個數];
2)、元(yuan)素類(lei)型[] 變量(liang)名 = {元(yuan)素1,元(yuan)素2...};
元(yuan)素(su)類型[] 變量名 = new 元(yuan)素(su)類型[]{元(yuan)素(su)1,元(yuan)素(su)2...};
---------------------------------------------------------
//二分查找法。必須有(you)前提:數組中的元素要有(you)序。
public static int halfSeach_2(int[] arr,int key){
int min,max,mid;
min = 0;
max = arr.length-1;
mid = (max+min)>>1; //(max+min)/2;
while(arr[mid]!=key){
if(key>arr[mid]){
min = mid + 1;
}
else if(key<arr[mid])
max = mid - 1;
if(max<min)
return -1;
mid = (max+min)>>1;
}
return mid;
}
---------------------------------------------------------
java分了5片內存。
1:寄(ji)存器。2:本(ben)地(di)方(fang)法區。3:方(fang)法區。4:棧。5:堆。
棧:存儲的(de)(de)都是局部變(bian)量 ( 函數中(zhong)定義的(de)(de)變(bian)量,函數上的(de)(de)參數,語句中(zhong)的(de)(de)變(bian)量 );
只要數(shu)據運算完成所(suo)在(zai)的區域結束,該數(shu)據就會(hui)被釋放。
堆:用于存(cun)儲(chu)數組和對象,也就(jiu)(jiu)是實體(ti)。啥(sha)是實體(ti)啊?就(jiu)(jiu)是用于封裝多個數據的。
1:每一個實體都有(you)內存首地址值。
2:堆內(nei)存中的變(bian)量都有(you)默認初始化值(zhi)。因為數據類型不(bu)同,值(zhi)也不(bu)一(yi)樣。
3:垃圾回收機制。
----------------------------------------------------------------------------------------------
三:面向對象(xiang):★★★★★
特點:1:將復(fu)雜的(de)事情簡單化。
2:面向對象(xiang)將(jiang)以前的過程中(zhong)的執行者,變(bian)成了指(zhi)揮者。
3:面向(xiang)對象這(zhe)種(zhong)思想是(shi)符(fu)合現在(zai)人(ren)們思考(kao)習慣(guan)的(de)一種(zhong)思想。
過程(cheng)(cheng)和(he)對象(xiang)在我們的程(cheng)(cheng)序中是(shi)(shi)如何(he)體現(xian)的呢?過程(cheng)(cheng)其實(shi)就是(shi)(shi)函數;對象(xiang)是(shi)(shi)將函數等一些內(nei)容進(jin)行了(le)封裝。
匿名對象使用場景:
1:當(dang)對方法只進行一(yi)次調(diao)用的時候,可以(yi)使用匿名對象。
2:當對(dui)象對(dui)成員進行多(duo)次(ci)調(diao)用時,不能使用匿名對(dui)象。必須給(gei)對(dui)象起(qi)名字。
在類中定義(yi)其實(shi)都(dou)稱(cheng)之為(wei)成(cheng)員(yuan)。成(cheng)員(yuan)有兩種:
1:成員變(bian)量(liang):其(qi)實對應的就(jiu)是事物的屬性。
2:成(cheng)員函數(shu):其實對應的就是事物的行為。
所以(yi),其實定義類,就是(shi)(shi)在(zai)(zai)定義成員(yuan)變量和成員(yuan)函數。但是(shi)(shi)在(zai)(zai)定義前,必須先要(yao)對(dui)事物進行(xing)屬性(xing)和行(xing)為的分析,才可以(yi)用(yong)代碼來體(ti)現。
private int age;//私(si)有的(de)訪(fang)問(wen)權(quan)限最低,只有在本(ben)類(lei)中的(de)訪(fang)問(wen)有效。
注(zhu)意:私有(you)僅(jin)僅(jin)是封(feng)裝的一種體(ti)現形式而已。
私有(you)(you)的(de)成員:其(qi)他類不(bu)能直(zhi)接(jie)創建對(dui)(dui)(dui)(dui)象(xiang)訪(fang)問(wen),所以只有(you)(you)通過(guo)本(ben)類對(dui)(dui)(dui)(dui)外提供(gong)具體的(de)訪(fang)問(wen)方式來完成對(dui)(dui)(dui)(dui)私有(you)(you)的(de)訪(fang)問(wen),可以通過(guo)對(dui)(dui)(dui)(dui)外提供(gong)函數的(de)形式對(dui)(dui)(dui)(dui)其(qi)進(jin)行訪(fang)問(wen)。
好(hao)處(chu):可以在函數中加入邏(luo)輯判斷(duan)(duan)等操作(zuo),對數據進行(xing)判斷(duan)(duan)等操作(zuo)。
總結(jie):開發時,記住,屬性是用于存儲數據(ju)的(de),直接被(bei)訪問,容(rong)易出現安全(quan)隱(yin)患,所以,類中的(de)屬性通常被(bei)私有化,并對外提供(gong)公共的(de)訪問方法。
這個方(fang)法一般有兩(liang)個,規范寫法:對于屬性(xing) xxx,可以使(shi)用(yong)setXXX(),getXXX()對其進行操作。
類中怎么(me)沒(mei)有定義(yi)主函(han)數呢?
注(zhu)意:主(zhu)函(han)數的存(cun)在,僅為該類是否需(xu)要(yao)獨(du)立運行(xing),如果不(bu)需(xu)要(yao),主(zhu)函(han)數是不(bu)用定義(yi)的。
主函數(shu)的解釋(shi):保(bao)證所在類的獨(du)立(li)運行,是程序的入口(kou),被jvm調用。
成員變量和(he)局(ju)部變量的(de)區(qu)別:
1:成(cheng)員變量直接定義在類(lei)中。
局部(bu)變(bian)量定義(yi)在方法(fa)中,參數上,語句中。
2:成員變量(liang)在這個(ge)類(lei)中(zhong)有效。
局部變量只在自(zi)己所屬的(de)大括(kuo)號內有效,大括(kuo)號結束,局部變量失去作用(yong)域。
3:成員變量存(cun)在于(yu)堆內存(cun)中,隨著對象(xiang)的產生而存(cun)在,消失而消失。
局部變量(liang)存(cun)在(zai)于棧(zhan)內存(cun)中,隨著所屬(shu)區域的(de)運(yun)行而存(cun)在(zai),結束而釋放。
構造函數:用于給對(dui)象(xiang)進行初始化,是給與之對(dui)應的對(dui)象(xiang)進行初始化,它具有針對(dui)性(xing),函數中的一種。
特點:
1:該函數(shu)的名(ming)(ming)稱和所(suo)在類的名(ming)(ming)稱相同(tong)。
2:不需要定義返回(hui)值(zhi)類型(xing)。
3:該函數(shu)沒(mei)有具體的返回值。
記住:所有對象創(chuang)建時,都需要初始化才可以使用。
注意事項(xiang):一(yi)個類(lei)(lei)在定(ding)(ding)義(yi)(yi)時,如果沒(mei)(mei)有定(ding)(ding)義(yi)(yi)過構造(zao)函數(shu),那么該類(lei)(lei)中會(hui)自動生(sheng)成一(yi)個空參數(shu)的構造(zao)函數(shu),為了(le)方便該類(lei)(lei)創(chuang)建(jian)對象,完成初始化(hua)。如果在類(lei)(lei)中自定(ding)(ding)義(yi)(yi)了(le)構造(zao)函數(shu),那么默(mo)認的構造(zao)函數(shu)就沒(mei)(mei)有了(le)。
一(yi)個(ge)類(lei)中(zhong),可以(yi)(yi)有多個(ge)構(gou)(gou)造函數(shu),因為它們的(de)函數(shu)名稱(cheng)都相(xiang)同(tong),所以(yi)(yi)只能(neng)通過參數(shu)列表(biao)來區分(fen)。所以(yi)(yi),一(yi)個(ge)類(lei)中(zhong)如果出現(xian)多個(ge)構(gou)(gou)造函數(shu)。它們的(de)存在是(shi)以(yi)(yi)重載體現(xian)的(de)。
構造函數(shu)和(he)一般函數(shu)有什(shen)么區別呢(ni)?
1:兩個函(han)數定義(yi)格(ge)式(shi)不同。
2:構造(zao)函數是在對象創(chuang)建時,就被調用,用于初(chu)始化,而且初(chu)始化動作(zuo)只執(zhi)行一(yi)次。
一般函數,是對象創建后(hou),需要調用才(cai)執行,可以被調用多次。
什(shen)么時候(hou)使用構造函數呢?
分析事(shi)物時,發現(xian)具(ju)體事(shi)物一出現(xian),就具(ju)備了一些特(te)征(zheng),那就將這些特(te)征(zheng)定義到構造函數內。
構(gou)造(zao)代碼塊和構(gou)造(zao)函數有什么區別(bie)?
構造代(dai)(dai)碼(ma)塊(kuai):是(shi)給所有(you)的(de)對(dui)象(xiang)進行初始化(hua),也就是(shi)說(shuo),所有(you)的(de)對(dui)象(xiang)都會(hui)調(diao)用一個(ge)代(dai)(dai)碼(ma)塊(kuai)。只(zhi)要對(dui)象(xiang)一建(jian)立。就會(hui)調(diao)用這(zhe)個(ge)代(dai)(dai)碼(ma)塊(kuai)。
構造函(han)數:是(shi)給與(yu)之(zhi)對(dui)應的對(dui)象進(jin)行(xing)初始(shi)化。它具有針對(dui)性。
Person p = new Person();
創建(jian)一個對(dui)象都在內存(cun)中做(zuo)了什么事(shi)情?
1:先將(jiang)硬盤上指定位(wei)置的Person.class文(wen)件加載進內存(cun)。
2:執(zhi)行main方(fang)法(fa)時,在(zai)棧(zhan)內(nei)存中開(kai)辟(pi)了main方(fang)法(fa)的空間(壓棧(zhan)-進棧(zhan)),然后在(zai)main方(fang)法(fa)的棧(zhan)區分配了一(yi)個(ge)變量(liang)p。
3:在堆內存中(zhong)開辟一個(ge)(ge)實體空間,分配了一個(ge)(ge)內存首地址值。new
4:在該(gai)實體空間(jian)中進行(xing)屬性的空間(jian)分配(pei),并進行(xing)了默認初始化。
5:對空(kong)間中的屬性進行顯示初始化。
6:進(jin)行實體(ti)的構(gou)造(zao)代碼塊(kuai)初始化。
7:調用該實(shi)體對應的構造函數,進(jin)行構造函數初始化。()
8:將首地址賦值給p ,p變量就(jiu)引用了(le)該實體。(指向(xiang)了(le)該對(dui)象)
--------------------------------------------------------------------------------------------
封 裝(面向對(dui)象(xiang)特征之(zhi)一(yi)):是指隱藏對(dui)象(xiang)的屬性(xing)和實(shi)現細節(jie),僅對(dui)外提供公共訪問方(fang)式。
好處:將變化隔離(li);便于使用(yong)(yong);提(ti)高(gao)重用(yong)(yong)性;安全(quan)性。
封裝原(yuan)則:將不需(xu)要對外提(ti)供的內容都隱(yin)藏起來,把(ba)屬性(xing)都隱(yin)藏,提(ti)供公共方法對其訪(fang)問。
this:代表對象。就(jiu)是所(suo)在函數所(suo)屬對象的引(yin)用。
this到底代表什么呢?哪(na)個對象調用了this所在的函數,this就(jiu)代表哪(na)個對象,就(jiu)是哪(na)個對象的引(yin)用。
開發時(shi),什么時(shi)候使用this呢(ni)?
在定義(yi)功能(neng)(neng)時,如果該(gai)功能(neng)(neng)內(nei)部使用(yong)(yong)到(dao)了調(diao)用(yong)(yong)該(gai)功能(neng)(neng)的對象,這時就用(yong)(yong)this來表示這個對象。
this 還可(ke)以用(yong)于(yu)構造函數間的調(diao)用(yong)。
調(diao)用格式:this(實際參數);
this對象后面跟上 . 調用的是成(cheng)員屬性和成(cheng)員方法(fa)(一般方法(fa));
this對象(xiang)后面跟上 () 調用的(de)是本類中的(de)對應參數的(de)構造函數。
注(zhu)意(yi):用(yong)(yong)this調用(yong)(yong)構(gou)造函(han)數(shu),必須定(ding)義在構(gou)造函(han)數(shu)的第一行(xing)。因(yin)為構(gou)造函(han)數(shu)是(shi)用(yong)(yong)于(yu)初始化(hua)的,所以(yi)初始化(hua)動作一定(ding)要執行(xing)。否則(ze)編譯失(shi)敗(bai)。
static:★★★ 關鍵字,是一個(ge)修飾符(fu),用于(yu)修飾成(cheng)員(成(cheng)員變量和成(cheng)員函數)。
特點:
1,想要(yao)實現對象中(zhong)的(de)共性數據(ju)的(de)對象共享。可以將這個數據(ju)進行靜(jing)態修飾。
2,被(bei)(bei)靜(jing)(jing)態(tai)修飾(shi)的(de)成員,可以直接被(bei)(bei)類名(ming)(ming)所調用(yong)(yong)。也(ye)就是說,靜(jing)(jing)態(tai)的(de)成員多了一種調用(yong)(yong)方(fang)式。類名(ming)(ming).靜(jing)(jing)態(tai)方(fang)式。
3,靜態(tai)隨(sui)著(zhu)類的加載而加載。而且優先于對象(xiang)存(cun)在。
弊端:
1,有(you)些數(shu)據是對(dui)象特(te)有(you)的(de)(de)數(shu)據,是不可以被(bei)靜態修(xiu)飾的(de)(de)。因為那樣的(de)(de)話(hua),特(te)有(you)數(shu)據會變成對(dui)象的(de)(de)共享(xiang)數(shu)據。這樣對(dui)事物的(de)(de)描(miao)述就出了問題。所以,在定義靜態時,必(bi)須要(yao)明確,這個數(shu)據是否(fou)是被(bei)對(dui)象所共享(xiang)的(de)(de)。
2,靜(jing)態(tai)方法(fa)只能訪問靜(jing)態(tai)成員(yuan),不可以訪問非靜(jing)態(tai)成員(yuan)。
因為靜(jing)態方法加(jia)載時,優先于(yu)對象存在,所以(yi)沒有(you)辦(ban)法訪問對象中(zhong)的成員。
3,靜態方法中不能(neng)使用this,super關鍵字。
因為this代表對象(xiang),而(er)靜態在時,有可(ke)能(neng)沒(mei)有對象(xiang),所以(yi)this無(wu)法(fa)使用。
4,主函數是靜態的。
什(shen)么時候定義(yi)靜(jing)態成員(yuan)呢?或者說:定義(yi)成員(yuan)時,到(dao)底需不需要(yao)被靜(jing)態修飾呢?
成員分兩種:
1,成員變量(liang)。(數據共享時靜(jing)態化)
該成(cheng)員變(bian)量的數據是否是所有對象(xiang)都一(yi)樣:
如(ru)果(guo)是,那么該變(bian)量需要被靜態修飾(shi),因為是共享(xiang)的數(shu)據。
如(ru)果不(bu)是,那(nei)么(me)就說這是對象的特有數(shu)據,要存(cun)儲到對象中。
2,成員函數。(方法中沒有(you)調用特有(you)數據時(shi)就定(ding)義成靜態)
如果判斷成員函(han)數(shu)是否需要被靜態修飾呢?
只要(yao)參考,該(gai)函(han)數內是(shi)否(fou)訪問了(le)對象中的特有數據:
如果有訪問特有數據,那方法不能被(bei)靜態修飾。
如果沒(mei)有訪(fang)問(wen)過(guo)特(te)有數據,那么這個方法需要被(bei)靜態修飾。
成員變量(liang)和靜態(tai)變量(liang)的區(qu)別:
1,成員(yuan)變量(liang)所屬于對象。所以也(ye)稱為實例變量(liang)。
靜態變(bian)量(liang)所(suo)屬(shu)于類。所(suo)以也稱為類變(bian)量(liang)。
2,成員變量存(cun)在于堆內存(cun)中。
靜態(tai)變量存(cun)在于(yu)方法區中。
3,成員變量(liang)隨著對(dui)象(xiang)創建而存(cun)在。隨著對(dui)象(xiang)被回(hui)收而消失。
靜態變(bian)量(liang)隨(sui)(sui)著(zhu)(zhu)類(lei)的加載而存在。隨(sui)(sui)著(zhu)(zhu)類(lei)的消失而消失。
4,成員(yuan)變量只能被對象所調用 。
靜態變量可以(yi)被(bei)對(dui)象調(diao)用,也(ye)可以(yi)被(bei)類(lei)名(ming)調(diao)用。
所以,成員(yuan)變(bian)量可(ke)以稱為對象的特有數據,靜態變(bian)量稱為對象的共享數據。
靜態的注意:靜態的生(sheng)命(ming)周(zhou)期很長。
靜態代(dai)碼塊(kuai)(kuai):就是一個(ge)有靜態關鍵(jian)字標示的一個(ge)代(dai)碼塊(kuai)(kuai)區(qu)域。定義在類中。
作用:可(ke)以完成類的初始化。靜(jing)態代碼塊隨著(zhu)類的加載而執行,而且只執行一次(ci)(new 多個對(dui)象就(jiu)只執行一次(ci))。如果(guo)和(he)主函(han)數在同一類中,優先于主函(han)數執行。
Public:訪問權限最大。
static:不(bu)需要對象,直接(jie)類名即可。
void:主函數沒有返回(hui)值。
Main:主函數特定的名(ming)稱。
(String[] args):主函(han)數(shu)的(de)參(can)數(shu),是一個字符串數(shu)組類(lei)型的(de)參(can)數(shu),jvm調用main方(fang)法時,傳遞(di)的(de)實(shi)際參(can)數(shu)是 new String[0]。
jvm默認傳(chuan)(chuan)遞的(de)是長度為(wei)0的(de)字符(fu)串數(shu)組(zu),我們在(zai)(zai)運行(xing)該類(lei)時,也可以(yi)(yi)指定具體的(de)參(can)(can)數(shu)進(jin)行(xing)傳(chuan)(chuan)遞。可以(yi)(yi)在(zai)(zai)控制臺,運行(xing)該類(lei)時,在(zai)(zai)后面加入(ru)參(can)(can)數(shu)。參(can)(can)數(shu)之間(jian)通過空格隔(ge)開。jvm會自動將(jiang)這些字符(fu)串參(can)(can)數(shu)作(zuo)為(wei)args數(shu)組(zu)中的(de)元(yuan)素(su),進(jin)行(xing)存儲。
靜態代(dai)碼塊(kuai)(kuai)、構造(zao)代(dai)碼塊(kuai)(kuai)、構造(zao)函數同時存在(zai)時的執行順序:靜態代(dai)碼塊(kuai)(kuai) à 構造(zao)代(dai)碼塊(kuai)(kuai) à 構造(zao)函數;
生成Java幫助文(wen)檔:命(ming)令格式:javadoc –d 文(wen)件(jian)夾名 –auther –version *.java
/** //格式
*類描述
*@author 作者名
*@version 版本號(hao)
*/
/**
*方法描述
*@param 參(can)數(shu)描述
*@return 返回值(zhi)描述
*/
---------------------------------------------------------------------------------------------
設(she)計(ji)模式:解決問題最(zui)行之有(you)效的思想。是一套被反復(fu)使用、多(duo)數人(ren)知曉的、經過分類(lei)編目的、代(dai)(dai)碼(ma)設(she)計(ji)經驗的總結。使用設(she)計(ji)模式是為了可重(zhong)用代(dai)(dai)碼(ma)、讓代(dai)(dai)碼(ma)更容易被他人(ren)理(li)解、保(bao)證代(dai)(dai)碼(ma)可靠性(xing)。
java中有23種設計模式:
單例(li)設計(ji)模式:★★★★★
解決的問(wen)題:保證一(yi)個類(lei)在內存中的對象唯(wei)一(yi)性。
比如:多程(cheng)序讀(du)(du)取一(yi)個配(pei)置(zhi)文(wen)件時(shi),建議配(pei)置(zhi)文(wen)件封裝成對象(xiang)。會方便操作其中(zhong)(zhong)數據,又(you)要(yao)保(bao)證多個程(cheng)序讀(du)(du)到(dao)的是同一(yi)個配(pei)置(zhi)文(wen)件對象(xiang),就(jiu)需要(yao)該配(pei)置(zhi)文(wen)件對象(xiang)在內存中(zhong)(zhong)是唯(wei)一(yi)的。
Runtime()方法就是單例設(she)計模式進行設(she)計的。
如何保證(zheng)對象唯一性(xing)呢?
思想:
1,不(bu)讓其他程序(xu)創建該類對象。
2,在本類(lei)中創建(jian)一個本類(lei)對象。
3,對外(wai)提供方法,讓其他(ta)程(cheng)序獲取(qu)這個對象(xiang)。
步驟:
1,因為創(chuang)建對(dui)象(xiang)都需要構(gou)造函數(shu)初始化(hua),只要將本(ben)類中(zhong)的構(gou)造函數(shu)私有化(hua),其他(ta)程序就無法再(zai)創(chuang)建該類對(dui)象(xiang);
2,就在類中(zhong)創建一個本類的對象;
3,定(ding)義一個方法,返回該對象(xiang),讓(rang)其(qi)他程序可以通(tong)過方法就得到本類對象(xiang)。(作用:可控)
代碼體現:
1,私(si)有(you)化構造函(han)數;
2,創建私有并靜(jing)態的本(ben)類對象;
3,定義公有并靜態的方法,返回該(gai)對象(xiang)。
---------------------------------------------
//餓漢式
class Single{
private Single(){} //私有化構造函數。
private static Single s = new Single(); //創建私有并(bing)靜態(tai)的本類對象。
public static Single getInstance(){ //定義公有(you)并靜態的方(fang)法,返回該對象。
return s;
}
}
---------------------------------------------
//懶(lan)漢(han)式:延(yan)遲(chi)加載方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}
-------------------------------------------------------------------------------------------------
繼 承(面向(xiang)對象特征之(zhi)一)
好處:
1:提高了代碼的復用性。
2:讓類與類之(zhi)間產生了關系(xi),提供了另一個特征(zheng)多態的前(qian)提。
父類的由來:其實是由多個(ge)類不斷向上抽(chou)取共性內容而來的。
java中對于繼(ji)承,java只(zhi)支持(chi)單(dan)繼(ji)承。java雖然不(bu)直接(jie)支持(chi)多(duo)繼(ji)承,但是(shi)保留了這種多(duo)繼(ji)承機制,進行改良。
單繼承:一(yi)個類只能有一(yi)個父(fu)類。
多繼承:一個類(lei)可以(yi)有(you)多個父(fu)類(lei)。
為什么(me)不支(zhi)持多繼承呢?
因為當一個類(lei)同時(shi)繼(ji)承兩個父類(lei)時(shi),兩個父類(lei)中有相同的(de)功(gong)能,那么子類(lei)對象調用該(gai)功(gong)能時(shi),運行哪一個呢?因為父類(lei)中的(de)方法中存在方法體。
但(dan)是java支(zhi)持(chi)多重繼(ji)承。A繼(ji)承B B繼(ji)承C C繼(ji)承D。
多重繼承的出現,就(jiu)有了繼承體(ti)系。體(ti)系中的頂層父類是通過不斷向上(shang)抽取而來(lai)的。它里(li)面定(ding)義的該(gai)體(ti)系最基本(ben)最共性內容的功(gong)能。
所以(yi),一(yi)個體系要想(xiang)被使用(yong),直接查閱該系統(tong)中的(de)(de)(de)父類(lei)的(de)(de)(de)功能(neng)即(ji)可(ke)知(zhi)道該體系的(de)(de)(de)基本用(yong)法。那么想(xiang)要使用(yong)一(yi)個體系時,需要建(jian)立對象。建(jian)議建(jian)立最子(zi)(zi)類(lei)對象,因(yin)為最子(zi)(zi)類(lei)不僅可(ke)以(yi)使用(yong)父類(lei)中的(de)(de)(de)功能(neng)。還可(ke)以(yi)使用(yong)子(zi)(zi)類(lei)特有(you)的(de)(de)(de)一(yi)些(xie)功能(neng)。
簡單說:對(dui)于(yu)一(yi)個繼承體系的(de)使用,查閱頂層(ceng)(ceng)父類中的(de)內容(rong),創建最底層(ceng)(ceng)子類的(de)對(dui)象(xiang)。
子父類出現(xian)后,類中的(de)成員都有了哪些(xie)特點:
1:成員變量。
當子(zi)(zi)父類中出現一樣的(de)(de)屬性(xing)時,子(zi)(zi)類類型(xing)的(de)(de)對象(xiang),調(diao)用該屬性(xing),值(zhi)是子(zi)(zi)類的(de)(de)屬性(xing)值(zhi)。
如果想要調用父(fu)類中(zhong)的(de)屬性值,需要使用一(yi)個關鍵字:super
This:代表(biao)是本(ben)類類型(xing)的對(dui)象引用。
Super:代表是子類(lei)(lei)所屬的(de)(de)父類(lei)(lei)中的(de)(de)內存空間引(yin)用。
注意(yi):子父類中(zhong)通常是不(bu)(bu)會出現(xian)同名成員變量(liang)的,因為父類中(zhong)只要(yao)定義(yi)了,子類就不(bu)(bu)用在定義(yi)了,直接繼承過來用就可(ke)以了。
2:成員函數。
當子父類中出現了(le)一模一樣的方(fang)法(fa)時(shi),建(jian)立子類對象會運行子類中的方(fang)法(fa)。好像父類中的方(fang)法(fa)被覆蓋掉一樣。所以(yi)這種情況(kuang),是函數的另一個特性:覆蓋(復寫(xie),重寫(xie))
什么(me)時(shi)候使(shi)用覆蓋(gai)呢?當一(yi)個類(lei)的功能內容需要修改時(shi),可以通過覆蓋(gai)來實(shi)現。
3:構造函數。
發現子類構(gou)造(zao)函數運(yun)行(xing)時,先運(yun)行(xing)了父類的構(gou)造(zao)函數。為什么呢?
原因:子類的(de)所有(you)(you)構造函數(shu)中的(de)第一行,其實都有(you)(you)一條隱身的(de)語(yu)句super();
super(): 表示父類的(de)(de)構造函數(shu),并會調用于參數(shu)相(xiang)對應的(de)(de)父類中(zhong)(zhong)的(de)(de)構造函數(shu)。而super():是在調用父類中(zhong)(zhong)空參數(shu)的(de)(de)構造函數(shu)。
為什(shen)么(me)子(zi)類對象初始化時,都需要調用父類中的函(han)數(shu)?(為什(shen)么(me)要在子(zi)類構(gou)造函(han)數(shu)的第一行加(jia)入(ru)這個super()?)
因(yin)為(wei)子類(lei)繼承父(fu)類(lei),會繼承到父(fu)類(lei)中的數據(ju),所以(yi)必須要看父(fu)類(lei)是(shi)如何對(dui)(dui)自己(ji)的數據(ju)進行(xing)初始(shi)(shi)化的。所以(yi)子類(lei)在進行(xing)對(dui)(dui)象(xiang)初始(shi)(shi)化時,先(xian)調用父(fu)類(lei)的構造(zao)函數,這就是(shi)子類(lei)的實例化過程。
注意:子類(lei)中所(suo)有的(de)(de)構(gou)造函(han)數都會默認訪問父類(lei)中的(de)(de)空參數的(de)(de)構(gou)造函(han)數,因(yin)為每一個子類(lei)構(gou)造內第一行都有默認的(de)(de)語句(ju)super();
如果(guo)父(fu)類(lei)中沒有空(kong)參(can)數的(de)構造(zao)函數,那么子類(lei)的(de)構造(zao)函數內,必(bi)須通(tong)過super語句(ju)指定要(yao)訪問(wen)的(de)父(fu)類(lei)中的(de)構造(zao)函數。
如果子類構造(zao)(zao)函數(shu)中用this來指定調(diao)用子類自己的構造(zao)(zao)函數(shu),那(nei)么被調(diao)用的構造(zao)(zao)函數(shu)也一樣(yang)會訪問父類中的構造(zao)(zao)函數(shu)。
問題:super()和this()是否可以同時出現的構(gou)造(zao)函數中(zhong)。
兩個(ge)語(yu)句(ju)只能有一(yi)(yi)個(ge)定義在第一(yi)(yi)行,所以只能出現其中(zhong)一(yi)(yi)個(ge)。
super()或者this():為什么一定(ding)要定(ding)義在第一行(xing)?
因為super()或(huo)者this()都是調(diao)用(yong)構造函數(shu),構造函數(shu)用(yong)于初始化(hua),所(suo)以初始化(hua)的動作要先完成。
繼承的細節:
什么時(shi)候(hou)使用繼承呢(ni)?
當(dang)類(lei)與類(lei)之間(jian)存在著所屬(shu)關系時,才(cai)具備了繼(ji)承的前提。a是b中的一(yi)種。a繼(ji)承b。狼是犬科(ke)中的一(yi)種。
英文書中,所屬關(guan)系:" is a "
注意:不要僅僅為了獲取其他類中(zhong)的已有(you)成員進(jin)行繼承。
所(suo)以判斷所(suo)屬(shu)關(guan)系(xi),可(ke)以簡(jian)單看,如果繼承后,被(bei)繼承的(de)類(lei)中的(de)功能,都可(ke)以被(bei)該子類(lei)所(suo)具備,那么(me)繼承成立。如果不是,不可(ke)以繼承。
細節二:
在方(fang)法覆蓋時(shi),注意兩點:
1:子類(lei)(lei)覆蓋父類(lei)(lei)時,必須要保證,子類(lei)(lei)方(fang)法(fa)的權限(xian)必須大于等于父類(lei)(lei)方(fang)法(fa)權限(xian)可以實現(xian)繼承。否則(ze),編譯失(shi)敗。
2:覆(fu)蓋時,要(yao)么都靜(jing)態(tai),要(yao)么都不(bu)靜(jing)態(tai)。 (靜(jing)態(tai)只能(neng)覆(fu)蓋靜(jing)態(tai),或(huo)者被靜(jing)態(tai)覆(fu)蓋)
繼承的(de)一個(ge)弊端:打(da)破了封裝性。對于一些類,或(huo)者類中(zhong)功能(neng),是(shi)需要被繼承,或(huo)者復(fu)寫的(de)。
這時如何解(jie)決問題呢?介紹一個關鍵字,final:最終。
final特點:
1:這個關鍵字是(shi)一個修飾符,可以修飾類,方法,變量。
2:被final修飾的類是一(yi)個最終類,不可以(yi)被繼承。
3:被(bei)final修飾(shi)的方法(fa)是一(yi)個最終方法(fa),不(bu)可以被(bei)覆蓋。
4:被final修(xiu)飾的變量是一個常量,只能賦值一次。
其實這(zhe)樣的(de)原(yuan)因的(de)就(jiu)是給一些固定的(de)數據起個閱讀性(xing)較強的(de)名稱。
不加(jia)final修(xiu)飾(shi)不是(shi)(shi)也可以使用嗎?那么這個值是(shi)(shi)一個變(bian)量,是(shi)(shi)可以更(geng)改的(de)。加(jia)了final,程序更(geng)為嚴謹。常量名稱定義(yi)時,有(you)規范,所有(you)字母(mu)都大寫,如果(guo)由多(duo)個單詞組成,中間(jian)用 _ 連接。
抽(chou)象(xiang)類: abstract
抽象(xiang):不(bu)具體,看(kan)不(bu)明白(bai)。抽象(xiang)類表(biao)象(xiang)體現。
在不(bu)斷抽取(qu)過(guo)程中,將共性內容中的(de)方法聲明抽取(qu),但是(shi)方法不(bu)一樣,沒有抽取(qu),這時抽取(qu)到的(de)方法,并不(bu)具體,需要被指定關(guan)鍵字abstract所標示,聲明為抽象方法。
抽象方法所在類(lei)(lei)一定要標示為抽象類(lei)(lei),也就是說該類(lei)(lei)需要被abstract關(guan)鍵字所修飾。
抽象類的特點:
1:抽象(xiang)(xiang)方法只能定義在抽象(xiang)(xiang)類(lei)中,抽象(xiang)(xiang)類(lei)和抽象(xiang)(xiang)方法必(bi)須(xu)由abstract關(guan)鍵字(zi)修飾(可以描(miao)述類(lei)和方法,不可以描(miao)述變量(liang))。
2:抽象方法(fa)只定義方法(fa)聲明,并(bing)不(bu)定義方法(fa)實現。
3:抽(chou)象(xiang)(xiang)類(lei)不可以被創(chuang)建對象(xiang)(xiang)(實例化(hua))。
4:只有(you)通過子類(lei)(lei)(lei)繼承抽(chou)(chou)(chou)象(xiang)(xiang)類(lei)(lei)(lei)并覆蓋(gai)了抽(chou)(chou)(chou)象(xiang)(xiang)類(lei)(lei)(lei)中(zhong)的所有(you)抽(chou)(chou)(chou)象(xiang)(xiang)方法后,該子類(lei)(lei)(lei)才可以實(shi)例化。否則,該子類(lei)(lei)(lei)還是(shi)一個(ge)抽(chou)(chou)(chou)象(xiang)(xiang)類(lei)(lei)(lei)。
抽象類的細節:
1:抽象類(lei)中是否有(you)構造(zao)函數?有(you),用于給(gei)子類(lei)對象進行初(chu)始化。
2:抽象(xiang)(xiang)類中是否(fou)可以定義非抽象(xiang)(xiang)方(fang)法?
可以(yi)。其實,抽象類(lei)(lei)(lei)和一(yi)(yi)般類(lei)(lei)(lei)沒有太大的(de)區(qu)別(bie),都是在(zai)描述事物(wu),只(zhi)不(bu)過抽象類(lei)(lei)(lei)在(zai)描述事物(wu)時,有些功能不(bu)具體(ti)。所(suo)以(yi)抽象類(lei)(lei)(lei)和一(yi)(yi)般類(lei)(lei)(lei)在(zai)定義上,都是需(xu)要定義屬性和行為的(de)。只(zhi)不(bu)過,比一(yi)(yi)般類(lei)(lei)(lei)多了一(yi)(yi)個抽象函數。而且比一(yi)(yi)般類(lei)(lei)(lei)少了一(yi)(yi)個創(chuang)建對(dui)象的(de)部分。
3:抽象關鍵字abstract和(he)哪(na)些不(bu)可以(yi)共存?final , private , static
4:抽象類(lei)中可(ke)不(bu)可(ke)以不(bu)定義抽象方法(fa)(fa)?可(ke)以。抽象方法(fa)(fa)目的僅僅為了不(bu)讓該類(lei)創建對象。
-----------------------------------------------------------------------------------------------
模(mo)(mo)板方(fang)法(fa)設計模(mo)(mo)式:
解(jie)決的問題:當功能內部(bu)一(yi)部(bu)分(fen)實(shi)現時(shi)確定(ding)(ding),一(yi)部(bu)分(fen)實(shi)現是不(bu)確定(ding)(ding)的。這時(shi)可以把不(bu)確定(ding)(ding)的部(bu)分(fen)暴(bao)露(lu)出去(qu),讓(rang)子類去(qu)實(shi)現。
abstract class GetTime{
public final void getTime(){ //此(ci)功(gong)能如果不需要復(fu)寫,可加final限定
long start = System.currentTimeMillis();
code(); //不確(que)定的功能(neng)部分,提取出來(lai),通(tong)過抽(chou)象方法實現
long end = System.currentTimeMillis();
System.out.println("毫秒是:"+(end-start));
}
public abstract void code(); //抽(chou)象不(bu)確定的功能(neng),讓(rang)子類復寫(xie)實現
}
class SubDemo extends GetTime{
public void code(){ //子類復寫(xie)功能方法
for(int y=0; y<1000; y++){
System.out.println("y");
}
}
}
---------------------------------------------------------------------------------------------
接 口:★★★★★
1:是用關鍵(jian)字interface定義的(de)。
2:接口中包含的(de)成員,最(zui)常見的(de)有全局常量、抽象方法(fa)。
注(zhu)意:接口中(zhong)的成員都(dou)有固定的修飾(shi)符。
成員變量:public static final
成(cheng)員方法:public abstract
interface Inter{
public static final int x = 3;
public abstract void show();
}
3:接口中有抽象方(fang)法,說明接口不(bu)可以(yi)實(shi)例化。接口的子類必須(xu)實(shi)現了接口中所有的抽象方(fang)法后,該子類才可以(yi)實(shi)例化。否則,該子類還(huan)是一個抽象類。
4:類(lei)與類(lei)之間存在著繼承關(guan)系,類(lei)與接口(kou)中間存在的是實現關(guan)系。
繼承用extends ;實現用implements ;
5:接口(kou)(kou)和(he)類不一樣的地方,就(jiu)(jiu)是,接口(kou)(kou)可以被多(duo)實現(xian)(xian),這就(jiu)(jiu)是多(duo)繼承改(gai)良后的結果。java將多(duo)繼承機制(zhi)通過多(duo)現(xian)(xian)實來(lai)體現(xian)(xian)。
6:一個類在繼承(cheng)(cheng)另一個類的同時,還(huan)可以(yi)實現多個接口(kou)。所(suo)以(yi)接口(kou)的出現避免了(le)單繼承(cheng)(cheng)的局限性。還(huan)可以(yi)將(jiang)類進行功能的擴展。
7:其實java中是(shi)有(you)多(duo)繼(ji)承(cheng)的。接口(kou)與接口(kou)之間存在著繼(ji)承(cheng)關(guan)系,接口(kou)可以多(duo)繼(ji)承(cheng)接口(kou)。
接(jie)口都用于設計上,設計上的特點:(可(ke)以理解主板上提供的接(jie)口)
1:接口是對外(wai)提供的規(gui)則。
2:接口是功(gong)能的擴展。
3:接口的出現降低了耦合性。
抽象類與接口:
抽(chou)象類:一般用于描(miao)述(shu)一個體系(xi)單元,將(jiang)一組共性內(nei)容(rong)進行抽(chou)取,特點:可(ke)以在(zai)類中定(ding)義抽(chou)象內(nei)容(rong)讓子類實現,可(ke)以定(ding)義非抽(chou)象內(nei)容(rong)讓子類直接使(shi)用。它里(li)面定(ding)義的(de)都是一些體系(xi)中的(de)基本內(nei)容(rong)。
接口:一(yi)般用于(yu)定義對象(xiang)的擴展功(gong)能,是在繼承(cheng)之外還需(xu)這個對象(xiang)具備的一(yi)些功(gong)能。
抽象類和(he)接(jie)口(kou)的(de)共性:都是不斷(duan)向上抽取的(de)結果。
抽象類和接口的區別:
1:抽象類只能(neng)被繼(ji)承,而且只能(neng)單繼(ji)承。
接口(kou)需要被實現,而(er)且可以多實現。
2:抽象類中可以定(ding)義非抽象方法,子類可以直接繼(ji)承使用。
接口中都有抽象方法(fa),需要子類(lei)去實現。
3:抽象類使用的是 is a 關系(xi)。
接口使(shi)用的(de) like a 關(guan)系。
4:抽象類的成員(yuan)修飾符可(ke)以自定義(yi)。
接口中的(de)(de)成員(yuan)修飾符是固定的(de)(de)。全都是public的(de)(de)。7
在開發之前,先(xian)定義規(gui)則,A和B分別(bie)開發,A負責(ze)實現(xian)(xian)這(zhe)(zhe)個規(gui)則,B負責(ze)使用(yong)這(zhe)(zhe)個規(gui)則。至于A是如何對規(gui)則具體(ti)實現(xian)(xian)的,B是不需要知道的。這(zhe)(zhe)樣這(zhe)(zhe)個接(jie)口的出現(xian)(xian)就降(jiang)低了A和B直(zhi)接(jie)耦合性(xing)。
【免(mian)責聲明】本(ben)文部(bu)分系(xi)轉載(zai)(zai),轉載(zai)(zai)目的(de)在于傳遞(di)更多信(xin)息,并不(bu)代表本(ben)網(wang)贊同其觀點和(he)對其真實性負責。如涉及作品內(nei)容(rong)、版(ban)權和(he)其它問題,請在30日內(nei)與聯系(xi)我們,我們會予以(yi)更改或刪除(chu)相關(guan)文章(zhang),以(yi)保證您(nin)的(de)權益!