Java基礎(chǔ)教案
怎么學(xué)習(xí)Java:多想需忿,多練
思想是學(xué)出來的谍夭,我給大家一個(gè)問題紊撕,如何來解決它罢荡,現(xiàn)在來說很多人是沒有思路的
我要做的就是給大家這樣一個(gè)思路,學(xué)的多了,練得多了区赵,在遇到問題的時(shí)候惭缰,也就
逐漸的形成了這個(gè)解決問題的思維
為什么很多公司招有3-5年工作經(jīng)驗(yàn)的開發(fā)人員,工資又高笼才,是因?yàn)榧矣幸焕先缬幸粚?/p>
公司還是喜歡招年輕人的工作有動(dòng)力从媚。招有工作經(jīng)驗(yàn)多的人是因?yàn)樗谶@么多年的工作
中遇到的問題多,解決的問題患整,他的經(jīng)驗(yàn)就是他寶貴的財(cái)富拜效。
Java語言介紹
Java是一種編程語言,如C++,C,PHP等各谚。語言是溝通交流紧憾,傳遞信息的工具。
我與大家之間通過漢語交流昌渤,那么java就是人類與計(jì)算機(jī)之間溝通交流赴穗,傳遞信息的工具。
Java的三大平臺(tái)
JavaSE Java的標(biāo)準(zhǔn)平臺(tái):包含了Java的基礎(chǔ)的功能膀息,學(xué)習(xí)的語法般眉,內(nèi)置的API方法
JavaEE Java的企業(yè)級應(yīng)用平臺(tái):JavaSE的基礎(chǔ)上,擴(kuò)展了一些API潜支,用于B/S結(jié)構(gòu)的企業(yè)應(yīng)用的開發(fā)
JavaME Java的移動(dòng)應(yīng)用平臺(tái):JavaSE縮微版甸赃,給嵌入式系統(tǒng)或移動(dòng)端系統(tǒng)使用過時(shí)
Java語言特點(diǎn)
1.跨平臺(tái)? 平臺(tái)-操作系統(tǒng)任何平臺(tái)上編寫的Java程序,可以在另外的平臺(tái)上執(zhí)行JDK Java的開發(fā)環(huán)境JRE Java的運(yùn)行環(huán)境 - Java虛擬機(jī)java文件 ->(編譯)class文件 ->Java虛擬機(jī)中運(yùn)行2.面向?qū)ο?以人類正常思維開發(fā)和設(shè)計(jì)軟件冗酿,開發(fā)程序開發(fā)方法:支撐大型的關(guān)系復(fù)雜系統(tǒng)的構(gòu)建3.多線程:支持多任務(wù)場景4.分布式:支持網(wǎng)絡(luò)應(yīng)用5.簡單:比C++簡單 指針埠对,回收(內(nèi)存泄露)Java中沒有指針, 系統(tǒng)自動(dòng)回收
變量和運(yùn)算符
Java中的變量
什么是變量:指在內(nèi)存中開辟的存儲(chǔ)空間裁替,用于存放在運(yùn)算過程中用到的數(shù)據(jù)项玛。
(大家住在G2,公寓需要開通一個(gè)房間給大家弱判,提高大家居捉缶凇)
(插卡游戲機(jī)中,破解版的坦克大戰(zhàn)昌腰,魂斗羅可以無限設(shè)置多少條命开伏,我們在游戲中改變的
哪一個(gè)數(shù)據(jù)就是變量,用于表示玩家的生命數(shù))
如何聲明變量
例:Intid=123; (int是變量的類型id是變量名123是變量的賦值)Java中規(guī)定在使用一個(gè)變量前剥哑,必須對該變量進(jìn)行聲明并初始化聲明就是給變量一個(gè)數(shù)據(jù)類型硅则,初始化就是對變量賦值方式:聲明的同時(shí)初始化淹父,先聲明后初始化變量是一個(gè)代詞:指代的是內(nèi)存中的數(shù)據(jù)變量是可變化的量株婴,改變的是該變量所指代的數(shù)據(jù)。
變量的命名:
可以由字母,數(shù)字困介,”_”和“$”組成大审。不能以數(shù)字開頭,區(qū)分大小寫座哩,不能使用java的關(guān)鍵字和保留字可以使用中文命名但不建議使用徒扶。建議:見名知意? 駝峰命名法
Java中的8中基本數(shù)據(jù)類型
整數(shù)類型:byte1Byteshort2Byteint4Byte(整數(shù)的默認(rèn)類型)long8Byte浮點(diǎn)數(shù)類型float4Bytedouble8Byte(浮點(diǎn)數(shù)的默認(rèn)類型)字符類型char2Byte? 存儲(chǔ)一個(gè)字符(英文,漢字...)布爾類型boolean1Bytetrue(真)false(假)
基本數(shù)據(jù)類型之間的轉(zhuǎn)換
1.自動(dòng)類型轉(zhuǎn)換(隱式轉(zhuǎn)換):從小到大2.強(qiáng)制類型轉(zhuǎn)換 :intnum=(int)5.21;? ? Double ->int會(huì)造成精度的缺失根穷,對數(shù)據(jù)產(chǎn)生影響姜骡。? ? Byteshortchar轉(zhuǎn)為int(三種類型實(shí)際存儲(chǔ)的數(shù)據(jù)都是整數(shù))? ? 整數(shù)直接量可以直接賦值給Byteshortchar(大->小 系統(tǒng)幫忙轉(zhuǎn)了)? ? Byteshortchar三種類型參與運(yùn)算時(shí),先一律轉(zhuǎn)成int再進(jìn)行運(yùn)算
Java中的運(yùn)算符
除法(/)適用于兩個(gè)整數(shù)屿良,結(jié)果舍棄小數(shù)部分取余(%) 適用于整數(shù)圈澈,char,浮點(diǎn)數(shù):結(jié)果取決于除數(shù)的正負(fù)。自增(++):使變量的值+1尘惧;自減(--):使變量的值-1康栈;注意:參與運(yùn)算時(shí),運(yùn)算符寫在變量前喷橙,變量后的效果不同關(guān)系運(yùn)算符:用于判斷數(shù)據(jù)之間的大小關(guān)系:(>,<,>=,<=,==,!=)關(guān)系運(yùn)算的結(jié)果為boolean(true/false)邏輯運(yùn)算符: &&(與) ,||(或),!(非)&&(與):多個(gè)條件同時(shí)滿足啥么。整個(gè)表達(dá)式為true||(或):多個(gè)表達(dá)式中,只要有一個(gè)滿足贰逾,整個(gè)表達(dá)式為true悬荣。!(非):非真則假,非假則真疙剑。短路問題11&17運(yùn)算 二進(jìn)制 (1-1為1其余為0)參與邏輯運(yùn)算的表達(dá)式的結(jié)果都是布爾值隅熙。特殊的運(yùn)算符:+=,-=核芽,*=囚戚,/=三目運(yùn)算表達(dá)式:(boolean)表達(dá)式?表達(dá)式1:表達(dá)式2先計(jì)算(boolean)表達(dá)式轧简,若為true驰坊,則整個(gè)表達(dá)式返回表達(dá)式1若為false則整個(gè)表達(dá)式返回表達(dá)式2移位運(yùn)算符(了解)<< 左移>> 右移2<<3==162的 二進(jìn)制表示10%216的 二進(jìn)制表示10000%16負(fù)數(shù)N(-35)轉(zhuǎn)成二進(jìn)制先將35的二進(jìn)制數(shù)求出00100011全部位安位取反11000100再加1:11000101
流程控制語句
分支結(jié)構(gòu):if:if(邏輯表達(dá)式){ 語句塊 } 如果邏輯表達(dá)式成立,則執(zhí)行語句塊代碼If( ){? }else{? } ;if(){? }elseif(){? }switchcase:--breakIf-else-if:相對靈活 ;switchcase:結(jié)構(gòu)更清晰循環(huán)結(jié)構(gòu):for,wihle,do-whilewhile:while( 表達(dá)式){ 語句塊 } :先判斷在執(zhí)行do{ 語句塊}while(表達(dá)式):先執(zhí)行一次哮独,在判斷for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3){ 循環(huán)體 }? 一般用于固定次數(shù)的循環(huán)表達(dá)式1:循環(huán)變量的初始化表達(dá)式2:循環(huán)條件表達(dá)式3:循環(huán)變量的改變Break;跳出循環(huán)拳芙,使用continue跳過本次循環(huán)進(jìn)入下次循環(huán)
or循環(huán)輸出1 到100
while循環(huán)輸出1-100
計(jì)算2000年1月1日到2008年1月1日相距多少天
輸出1 到100的累加和
求100以內(nèi)所有偶數(shù)的和
求整數(shù)1~100的累加值,但要求跳過所有個(gè)位為3的數(shù)
循環(huán)輸入大于0的數(shù)字進(jìn)行累加皮璧,直到輸入的數(shù)字為0舟扎,就結(jié)束循環(huán),并最后輸出累加的結(jié)果
打印出?100~999之間的所有“水仙花數(shù)”悴务。所謂“水仙花數(shù)”睹限,是指一個(gè)3
位數(shù)譬猫,其各位數(shù)字立方和等于該數(shù)本身
輸入一個(gè)整數(shù)N,判斷該數(shù)是不是質(zhì)數(shù)羡疗,如果是質(zhì)數(shù)輸出"N是一個(gè)質(zhì)數(shù)"染服,否
則輸出"N不是質(zhì)數(shù)"。提
示:除了1和它本身不能被任何數(shù)整除
求9的階乘;9!=123456789?
猜數(shù)字游戲.
數(shù)組
什么是數(shù)組:
? 什么是數(shù)組:Java中用于存儲(chǔ)數(shù)據(jù)的容器叨恨。
? 數(shù)組的聲明和創(chuàng)建:引用數(shù)據(jù)類型的方式
數(shù)組的初始化:
1.int[] arr=newint[]{1,2,3,4,5};2.int[]arr=newint[5];3.int[] arr={1,2,3,4,5};
數(shù)組元素的訪問:
在JAVA中通過下標(biāo)訪問數(shù)組的元素柳刮,數(shù)組的下標(biāo)從0開始,表示第一個(gè)元素
數(shù)組的屬性:長度length,表示數(shù)組的長度
利用數(shù)組的屬性length痒钝,遍歷數(shù)組
for(inti=0; i
數(shù)組的異常:當(dāng)訪問數(shù)組下標(biāo)超過數(shù)組大小時(shí)秉颗,會(huì)報(bào)異常,數(shù)組下標(biāo)越界
方法的定義及調(diào)用
微信紅包小程序publicclassWeiCat{? ? publicstaticvoidmain(String[] args) {// TODO Auto-generated method stubStringwid="cl666";//微信號Stringpwd="cl123456";//微信密碼StringpayID="888888";//支付密碼double balance=800;//紅包零錢double money=0;Stringupay;? ? ? ? Scanner scan=newScanner(System.in);while(true){? ? ? ? ? ? System.out.println("微信號");Stringuwid=scan.next();? ? ? ? ? ? System.out.println("請輸入密碼");Stringupwd=scan.next();if(uwid.equals(wid)&&upwd.equals(pwd)){//登陸成功break;? ? ? ? ? ? }else{//登陸失敗System.out.println("請重新登陸");? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? System.out.println("1.發(fā)紅包? 2.轉(zhuǎn)賬? 3.提現(xiàn)? 4.充值");? ? ? ? int num=scan.nextInt();switch(num){case1:? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("請輸入紅包金額");? ? ? ? ? ? ? ? money=scan.nextDouble();if(money>balance){? ? ? ? ? ? ? ? ? ? System.out.println("紅包零錢不足");? ? ? ? ? ? ? ? }else{? ? ? ? ? ? ? ? ? ? System.out.println("請輸入支付密碼");? ? ? ? ? ? ? ? ? ? upay=scan.next();if(upay.equals(payID)){? ? ? ? ? ? ? ? ? ? ? ? System.out.println("紅包發(fā)生成功");? ? ? ? ? ? ? ? ? ? ? ? balance-=money;? ? ? ? ? ? ? ? ? ? }else{? ? ? ? ? ? ? ? ? ? ? ? System.out.println("支付密碼有誤");? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? }break;case2:break;case3:break;case4:break;default:? ? ? ? ? ? System.out.println("選項(xiàng)無效");? ? ? ? }? ? ? ? ? ? }}
什么是方法:完成某個(gè)特定功能的語句送矩。? ? ? 特定功能就是一段具有運(yùn)算功能的代碼隨著學(xué)習(xí)的深入站宗,代碼量會(huì)隨之增多。之前都寫在一個(gè)main方法中 益愈,如果代碼量達(dá)到幾千行 甚至一萬行的話 梢灭,對于程序的可視化效果 與分析都非常不好,所以使用方法將代碼進(jìn)行簡化生活案例:電飯煲? 自動(dòng)販賣機(jī)? 壓汁機(jī)特點(diǎn):使用者無需了解工具具體的內(nèi)部實(shí)現(xiàn)? 只需了解工具的使用規(guī)則方法的例子:System.out.print(); 方法的特點(diǎn) 都有小括號Arrays.sort()Arrays.copyOf()? 具有運(yùn)算的功能使用方法編程的優(yōu)點(diǎn):保證一個(gè)方法 只做一件事? 銀行:存錢( )? 取錢( )? 余額( )? ? ? ? 操作( 存錢? 取錢? 余額)減少代碼的復(fù)用 蒸其,便于程序的維護(hù)? 方法的特點(diǎn):方法的調(diào)用者無需知道方法的內(nèi)部實(shí)現(xiàn) 只需了解方法需要的參數(shù)即可方法的定義:[ 訪問控制符 ][ 修飾符 ]返回值類型 方法名([參數(shù)類型 參數(shù)名]){? }[ 訪問控制符 ][ 修飾符 ]:后續(xù)進(jìn)行講解返回值類型:該方法運(yùn)算結(jié)果的數(shù)據(jù)類型(Object,基本數(shù)據(jù)類型,引用類型)? ? ? ? ? ? 如果聲明的返回值類型與實(shí)際返回的類型不同敏释,會(huì)編譯報(bào)錯(cuò)? ? ? ? ? ? 方法名([參數(shù)類型 參數(shù)名]):統(tǒng)稱參數(shù)列表? ? ? 方法名:作為調(diào)用該方法的標(biāo)識? ? ? 參數(shù):作為方法中運(yùn)算時(shí)用到的數(shù)據(jù),個(gè)數(shù)沒有限制,若有參數(shù)摸袁,要聲明參數(shù)類型? ? ? 方法體:是一個(gè)語句塊钥顽,執(zhí)行特定的功能代碼return:返回值的關(guān)鍵字方法的分類:根據(jù)參數(shù)個(gè)數(shù):? ? 有參方法? ? 無參方法根據(jù)返回值類型? ? 有返回值的方法? ? 無返回值的方法
參數(shù)與返回值類型的多樣化
1. 參數(shù):3個(gè)? 類型:Stringintint返回值類型:boolean在保存了多個(gè)學(xué)生姓名的數(shù)組中,指定查找區(qū)間靠汁,查找某個(gè)學(xué)生姓名并顯示是否查找成功
publicstaticbooleanselectName(String str ,intstart,intend ){if(start<0){? ? ? ? ? ? start=0;? ? ? ? }if(end>=names.length-1){? ? ? ? ? ? start=names.length-1;? ? ? ? }for(inti=start ;start<=end;i++){if(names[i].equals(str)){returntrue;? ? ? ? ? ? }? ? ? ? }returnfalse;? ? ? ? }
2.參數(shù):1個(gè)? 類型:int[ ]? 返回值:double/int有5位學(xué)員參加了Java知識競賽的決賽蜂大,輸出決賽的平均成績和最高成績
//求平均成績publicstaticdoublegetAvg(int[] score){intsum=0;for(inti=0;i
//求最大值publicstaticdoublegetMax(int[] score){? ? ? ? Arrays.sort(score);returnscore[score.length-1];? ? }
3.參數(shù):1個(gè)? 類型:int[ ]? 返回值:int[ ]在保存多個(gè)學(xué)生成績的數(shù)組中,將學(xué)生的成績安裝升序排序
publicstaticint[] sortArray(int[] score){? ? ? ? Arrays.sort(score);returnscore;? ? }
publicstaticint[] sortArray1(int[] score){inttemp;for(inti=0;iscore[j+1]){? ? ? ? ? ? ? ? ? ? temp=score[j];? ? ? ? ? ? ? ? ? ? score[j]=score[j+1];? ? ? ? ? ? ? ? ? ? score[j+1]=temp;? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? }returnscore;? ? }
4.參數(shù):0類型:無? 返回值:int求1—100之間的整數(shù)和
publicstaticintgetSum(){intsum=0;for(inti=1;i<=100;i++){? ? ? ? ? ? sum+=i;? ? ? ? }returnsum;? ? }
5.參數(shù):2個(gè)? 類型:int返回值:int求兩個(gè)整數(shù)區(qū)間的和
publicstaticintgetSum(inta,intb){intsum=0;for(inti=a;i<=b;i++){? ? ? ? ? ? sum+=i;? ? ? ? }returnsum;? ? }
6.參數(shù):3個(gè)? 類型:int返回值:double求三個(gè)整數(shù)的和
publicstaticintgetSum(inta1,inta2 ,inta3){returna1+a2+a3;? ? }
7.參數(shù):1個(gè)? 類型:char[ ]? 返回值:boolean用戶隨機(jī)輸入5個(gè)字符蝶怔,判斷是否為“回文”(例:abcba,12321)
publicstaticbooleancheckFlag(char[] c){booleanflag=true;for(inti=0;i
8.參數(shù):3個(gè)? 類型:int返回值:int隨機(jī)輸入不相同的三個(gè)整數(shù) 比較出其中的最大值
publicstaticintgetMax(inta,intb,intc){if(a>b&&a>c){returna;? ? ? ? }elseif(b>a&&b>c){returnb;? ? ? ? }elseif(c>a&&c>b){returnc;? ? ? ? }return0;? ? }
9.參數(shù):2個(gè)? 類型:int返回值 :int求兩個(gè)整數(shù)之間存在多少個(gè)奇數(shù)
publicstaticintcountNum(inta,intb){intcount=0;for(inti=a;i<=b;i++){if(i%2!=0){? ? ? ? ? ? ? ? count++;? ? ? ? ? ? }? ? ? ? }returncount;? ? }
10.參數(shù):1個(gè)? 類型:int返回值 :boolean隨機(jī)輸入一個(gè)年份 判斷是否為閏年
publicstaticbooleancheckYear(intyear){if(year%4==0&&year%100!=0||year%400==0){returntrue;? ? ? ? }returnfalse;? ? }
11.參數(shù):1個(gè)? 類型:char[ ]返回值:無輸入一行字符奶浦,分別統(tǒng)計(jì)出其中英文字母、數(shù)字和其它字符的個(gè)數(shù)
有一個(gè)方法被調(diào)用代碼為int[] arrs = sort(newStudent(12))? 求該方法的聲明代碼答案:publicint[] sort(Student arr)有一個(gè)方法被調(diào)用代碼為String[][] strs = sort(15),該方法的聲明代碼為答案:publicString[][] sort(intn)
參數(shù)的傳遞:
參數(shù)傳遞的過程實(shí)際就是把實(shí)參的值傳遞給形參的過程
方法的調(diào)用
在同一個(gè)類中static修飾的方法可以直接通過方法名進(jìn)行調(diào)用在不同的類中static修飾的方法 通過類名.方法名進(jìn)行調(diào)用非static修飾的方法 通過對象.方法名進(jìn)行調(diào)用
方法的重載
在同一個(gè)類中 允許同時(shí)存在多個(gè)方法名相同的方法
規(guī)則:
? 方法名必須相同
? 參數(shù)列表不同
? ? ? 參數(shù)個(gè)數(shù)不同
? ? ? 參數(shù)類型不同
? 與返回值類型無關(guān)
總結(jié)和練習(xí)
總結(jié)練習(xí): 猜字符游戲
? ? 1.設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)---變量
? ? 2.設(shè)計(jì)程序結(jié)構(gòu)—方法
? ? 3.設(shè)計(jì)實(shí)現(xiàn)----方法的實(shí)現(xiàn)? ?
publicclassGuess{publicstaticvoidmain(String[] args){// TODO Auto-generated method stubScanner scan=newScanner(System.in);? ? ? ? String[] c=getChar();//? ? ? for(String c1:c){//? ? ? ? ? System.out.print(c1+" ");//? ? ? }System.out.println("開始猜吧..");? ? ? ? ? ? ? ? String[] cs;intcount=0;while(true){? ? ? ? ? ? System.out.println("請輸入第1個(gè)字母");? ? ? ? ? ? String input1=scan.next();? ? ? ? ? ? System.out.println("請輸入第2個(gè)字母");? ? ? ? ? ? String input2=scan.next();? ? ? ? ? ? System.out.println("請輸入第3個(gè)字母");? ? ? ? ? ? String input3=scan.next();? ? ? ? ? ? System.out.println("請輸入第4個(gè)字母");? ? ? ? ? ? String input4=scan.next();? ? ? ? ? ? System.out.println("請輸入第5個(gè)字母");? ? ? ? ? ? String input5=scan.next();? ? ? ? ? ? cs=newString[]{input1,input2,input3,input4,input5};int[] result=getResult(c,cs);? ? ? ? ? ? System.out.println("位置正確個(gè)數(shù):"+result[0]);? ? ? ? ? ? System.out.println("字符正確個(gè)數(shù):"+result[1]);if(result[0]==5&&result[1]==5){break;? ? ? ? ? ? }? ? ? ? ? ? count++;? ? ? }? ? ? System.out.println("您一共猜了"+count+"次");? ? }publicstaticString[] getChar(){? ? ? ? Random r=newRandom();intindex;? ? ? ? ? ? ? ? String[] ch=newString[5];? ? ? ? ? ? ? ? String[] cs={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};boolean[] flag=newboolean[cs.length];for(inti=0;i
面向?qū)ο?/p>
面向?qū)ο?是一種編程思想踢星,是對人類思維進(jìn)行歸納總結(jié)澳叉,在計(jì)算機(jī)中模擬現(xiàn)實(shí)世界的開發(fā)方法是以對象為核心,圍繞對象進(jìn)行操作
面向過程: 通常分析出解決問題需要的步驟沐悦,然后用方法把這些步驟實(shí)現(xiàn)成洗,最后一次調(diào)用這些方法。缺乏對參數(shù)的封裝藏否。
面向過程主要考慮的是程序的流程和算法而數(shù)據(jù)只是在需要時(shí)插入到算法中瓶殃。
為什么使用面向?qū)ο螅?/p>
? ? 可以解決復(fù)雜的關(guān)系和邏輯
? ? 利用人類的思維進(jìn)行編程
? ? 支持程序擴(kuò)展,維護(hù)性更換
如何實(shí)現(xiàn)面向?qū)ο螅毫私忸惡蛯ο?/p>
類:具有一類事物共同特征和行為的抽象副签。
? ? 鳥:- - - 就是抽象出來的對這類事務(wù)的描述 - - - 計(jì)算機(jī)中叫做 類(一種引用類型)
? ? ? ? 特征:翅膀 腳 眼睛? 行為:飛 吃
? ? 抽象中可能發(fā)生的問題:
? ? ? ? 認(rèn)知可能不準(zhǔn)確 - - - 強(qiáng)調(diào)”共有的”? 沒有忽略次要特征(與業(yè)務(wù)相關(guān)的特征)
對象:類在現(xiàn)實(shí)生活中的實(shí)例
Java程序完成類的創(chuàng)建
? ? 創(chuàng)建類的對象
? ? 操作累的屬性和方法
構(gòu)造方法:
? ? 在創(chuàng)建對象時(shí)遥椿,通過構(gòu)造方法完成對象的內(nèi)存開辟和初始化
構(gòu)造方法的特點(diǎn):
? ? 在開發(fā)中如果沒有編寫構(gòu)造方法基矮,系統(tǒng)會(huì)提共一個(gè)默認(rèn)的無參構(gòu)造方法,
? ? 但是若定義了任何類型的構(gòu)造方法修壕,系統(tǒng)則不會(huì)提供默認(rèn)構(gòu)造器
? ? 構(gòu)造方法可以重載
? ? 構(gòu)造方法不可以有返回值
? ? 通過有參構(gòu)造方法初始化屬性
This關(guān)鍵字:表示當(dāng)前對象的引用
? ? 使用情況:成員變量(屬性)與局部變量重名
? ? 在一個(gè)構(gòu)造器中 調(diào)用其他重載的構(gòu)造器
? ? 需要返回當(dāng)前對象的引用
publicclassCar{intnum=0;publicCargetCar(){? ? ? ? ? ? ? num++;returnthis;? ? ? ? }publicCargetCar(){? ? ? ? ? ? ? num++;returnnewCar();? ? ? ? }publicvoidsayNum(){? ? ? ? ? ? System.out.println(num);? ? ? ? }? ? }
對象的內(nèi)存模型
棧:保存基本數(shù)據(jù)類型的局部變量和引用類型的引用愈捅。? ? 特點(diǎn):存取速率塊遏考,效率高堆:new出來的對象都保存在堆中? ? 特點(diǎn):存儲(chǔ)對內(nèi)存空間要求較大的變量匿名對象 (newPerson().sayHi();) 該對象只使用一次垃圾回收器:? ? Java的垃圾回收機(jī)制是自動(dòng)的慈鸠,實(shí)際上是JVM內(nèi)部運(yùn)行的一個(gè)優(yōu)先級比較低的后臺(tái)線程? ? 垃圾回收機(jī)制僅僅作用于堆內(nèi)存中,與棧無關(guān)? ? ? ? 垃圾:堆中的內(nèi)容不存在任何引用指向它? ? 內(nèi)存泄露:不再使用的內(nèi)存沒有被及時(shí)的回收NewXd(); - -匿名對象
###? 撲克游戲 :publicclassPoke{privateString size;//牌號privateString color;//花色privateintcode;//大小publicintgetCode(){returncode;? ? }publicvoidsetCode(intcode){this.code = code;? ? }publicStringgetSize(){returnsize;? ? }publicvoidsetSize(String size){this.size = size;? ? }publicStringgetColor(){returncolor;? ? }publicvoidsetColor(String color){this.color = color;? ? }? ? ? ? @OverridepublicStringtoString(){return"size="+ size +", color="+ color +", code="+ code;? ? }}publicclassPokes{privateString[] colors={"紅桃","黑桃","方片","梅花"};privateString [] sizes={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};//生成52張撲克publicPoke[] getPoke(){intn=0;? ? ? ? Poke[] p=newPoke[52];for(inti=0;i
? ? ? ? * 隨機(jī)發(fā)牌
? ? ? ? * 莊家? 玩家
? ? ? ? * 1. 各發(fā)一張牌
? ? ? ? *? 莊家底牌顯示? 提示玩家 是否看底牌? 不看得分翻倍
? ? ? ? * 2.發(fā)第二張牌
? ? ? ? *? 第二張牌顯示? 提示是否看底牌 不看得分翻倍
? ? ? ? * 3.發(fā)第三張牌
? ? ? ? *? 直接翻牌
? ? ? ? * 發(fā)牌結(jié)束 雙方比較大小
? ? ? ? */// TODO Auto-generated method stubPokes ps=newPokes();? ? ? ? Poke[] p=ps.getPoke();intscore=1000;? ? ? ? System.out.println("歡迎來到 炸金花 PK大賽");while(score>0){? ? ? ? boolean[] flag=newboolean [p.length];intsz;intsx;? ? ? ? Scanner scan=newScanner(System.in);int[] xscore=newint[3];? ? ? ? ? ? ? ? System.out.println("第一輪發(fā)牌");? ? ? ? Poke pz1=getPoke(p,flag);? ? ? ? System.out.println("莊家: 底牌");? ? ? ? Poke px1=getPoke(p,flag);? ? ? ? System.out.println("玩家: 底牌");? ? ? ? ? ? ? ? System.out.println("玩家是否看牌:1.是? 2.不是");intnum=scan.nextInt();if(num==1){? ? ? ? System.out.println("玩家:"+px1.getColor()+px1.getSize());? ? ? ? }else{? ? ? ? ? ? System.out.println("玩家未看底牌");? ? ? ? }? ? ? ? System.out.println("請下注");? ? ? ? xscore[0]=scan.nextInt();? ? ? ? System.out.println("玩家下注:"+xscore[0]);if(num==2){? ? ? ? ? ? xscore[0]*=2;? ? ? ? }? ? ? ? System.out.println("第二輪發(fā)牌");? ? ? ? Poke pz2=getPoke(p,flag);? ? ? ? System.out.println("莊家:"+"底牌"+" "+pz2.getColor()+pz2.getSize());? ? ? ? ? ? ? ? ? ? Poke px2=getPoke(p,flag);if(num!=1){? ? ? ? ? ? System.out.println("玩家:"+"底牌"+" "+px2.getColor()+px2.getSize());? ? ? ? ? ? System.out.println("玩家家是否看牌:1.是? 2.不是");? ? ? ? ? ? num=scan.nextInt();if(num==1){? ? ? ? ? ? ? ? System.out.println("玩家:"+px1.getColor()+px1.getSize()+" "+px2.getColor()+px2.getSize());? ? ? ? ? ? }else{? ? ? ? ? ? ? ? System.out.println("玩家未看底牌");? ? ? ? ? ? }? ? ? ? }else{? ? ? ? ? ? System.out.println("玩家:"+px1.getColor()+px1.getSize()+" "+px2.getColor()+px2.getSize());? ? ? ? }? ? ? ? System.out.println("請下注");? ? ? ? xscore[1]=scan.nextInt();? ? ? ? System.out.println("玩家下注:"+xscore[1]);if(num==2){? ? ? ? ? ? xscore[1]*=2;? ? ? ? }? ? ? ? System.out.println("第三輪發(fā)牌");? ? ? ? Poke pz3=getPoke(p,flag);? ? ? ? System.out.println("莊家:"+"底牌"+" "+pz2.getColor()+pz2.getSize()+" "+pz3.getColor()+pz3.getSize());? ? ? ? Poke px3=getPoke(p,flag);if(num!=1){? ? ? ? ? ? System.out.println("玩家:"+"底牌"+" "+px2.getColor()+px2.getSize()+" "+px3.getColor()+px3.getSize());? ? ? ? ? ? System.out.println("玩家家是否看牌:1.是? 2.不是");? ? ? ? ? ? num=scan.nextInt();if(num==1){? ? ? ? ? ? ? ? System.out.println("玩家:"+px1.getColor()+px1.getSize()+" "+px2.getColor()+px2.getSize()+" "+px3.getColor()+px3.getSize());? ? ? ? ? ? }else{? ? ? ? ? ? ? ? System.out.println("玩家未看底牌");? ? ? ? ? ? }? ? ? ? }else{? ? ? ? ? ? System.out.println("玩家:"+px1.getColor()+px1.getSize()+" "+px2.getColor()+px2.getSize()+" "+px3.getColor()+px3.getSize());? ? ? ? }? ? ? ? System.out.println("請下注");? ? ? ? xscore[2]=scan.nextInt();? ? ? ? System.out.println("玩家下注:"+xscore[2]);if(num==2){? ? ? ? ? ? xscore[2]*=2;? ? ? ? }? ? ? ? ? ? ? ? Poke[] pokez={pz1,pz2,pz3};? ? ? ? Poke[] pokex={px1,px2,px3};? ? ? ? ? ? ? ? System.out.println("請雙方亮牌");? ? ? ? System.out.println("莊家:"+pz1.getColor()+pz1.getSize()+" "+pz2.getColor()+pz2.getSize()+" "+pz3.getColor()+pz3.getSize());? ? ? ? System.out.println("玩家:"+px1.getColor()+px1.getSize()+" "+px2.getColor()+px2.getSize()+" "+px3.getColor()+px3.getSize());? ? ? ? ? ? ? ? sz=setScore(getTpye(pokez));? ? ? ? sx=setScore(getTpye(pokex));? ? ? ? ? ? ? ? String result=show(sz,sx,pokez,pokex);if("玩家贏".equals(result)){? ? ? ? ? ? score+=xscore[0]+xscore[1]+xscore[2];? ? ? ? ? ? System.out.println("本輪玩家贏");? ? ? ? }else{? ? ? ? ? ? score-=xscore[0]+xscore[1]+xscore[2];? ? ? ? ? ? System.out.println("本輪莊家贏");? ? ? ? }? ? ? ? System.out.println("玩家積分"+score);? ? ? ? ? ? ? ? }? ? ? ? ? ? }publicstaticPokegetPoke(Poke[] p,boolean[] flag){? ? ? ? Random r=newRandom();intindex;do{? ? ? ? ? ? index=r.nextInt(p.length);? ? ? ? }while(flag[index]);? ? ? ? flag[index]=true;returnp[index];? ? }//比較牌面大小publicstaticStringgetTpye(Poke[] pz){? ? ? ? ? ? ? ? Poke p;for(inti=1;ipz[j+1].getCode()){? ? ? ? ? ? ? ? ? ? p=pz[j];? ? ? ? ? ? ? ? ? ? pz[j]=pz[j+1];? ? ? ? ? ? ? ? ? ? pz[j+1]=p;? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? }if(pz[0].getSize().equals(pz[1].getSize())&&pz[1].getSize().equals(pz[2].getSize())){return"三條";? ? ? ? }if(pz[0].getSize().equals(pz[1].getSize())||pz[1].getSize().equals(pz[2].getSize())||pz[0].getSize().equals(pz[2].getSize())){return"一對";? ? ? ? }if(!pz[0].getSize().equals(pz[1].getSize())&&!pz[1].getSize().equals(pz[2].getSize())&&!pz[0].getSize().equals(pz[2].getSize())? ? ? ? ? ? ? ? &&(pz[0].getCode()+1!=pz[1].getCode()||pz[1].getCode()+1!=pz[2].getCode())){return"單牌";? ? ? ? }if(pz[0].getCode()+1==pz[1].getCode()&&pz[1].getCode()+1==pz[2].getCode()? ? ? ? ? ? ? ? &&pz[0].getColor().equals(pz[1].getColor())&&pz[1].getColor().equals(pz[2].getColor())){return"同花順";? ? ? ? }if(pz[0].getCode()+1==pz[1].getCode()&&pz[1].getCode()+1==pz[2].getCode()){return"順子";? ? ? ? }if(pz[0].getColor().equals(pz[1].getColor())&&pz[1].getColor().equals(pz[2].getColor())){return"同花";? ? ? ? }returnnull;? ? }//比較輸贏publicstaticStringshow(intpz,intpx,Poke[] pz1,Poke[] px1){if(pz==px){if(pz1[2].getCode()>px1[2].getCode()){return"莊家贏";? ? ? ? ? ? }else{return"玩家贏";? ? ? ? ? ? }? ? ? ? }if(pz>px){return"莊家贏";? ? ? ? }else{return"玩家贏";? ? ? ? }? ? ? ? ? ? }//牌面積分publicstaticintsetScore(String type){intscore=0;if(type.equals("同花順")){? ? ? ? ? ? score=6;? ? ? ? }if(type.equals("三條")){? ? ? ? ? ? score=5;? ? ? ? }if(type.equals("同花")){? ? ? ? ? ? score=4;? ? ? ? }if(type.equals("順子")){? ? ? ? ? ? score=3;? ? ? ? }if(type.equals("一對")){? ? ? ? ? ? score=2;? ? ? ? }if(type.equals("單牌")){? ? ? ? ? ? score=1;? ? ? ? }returnscore;? ? }}
面向?qū)ο蟾呒壧匦?/p>
為什么使用繼承:
? ? 不同的類之間存在一些相同的屬性和方法
? ? 所以將類中相同的屬性和方法提取到公共類中
StudentTeather
name : Stringname : String
age : intage : int
sid : inttyear : int
eat();eat();
exam();checkPaper();;
什么是繼承:Java中通過extends 關(guān)鍵字讓一個(gè)類繼承另一個(gè)類灌具,被繼承的類叫父類(超類青团,基類),新的類叫子類(派生類)咖楣。子類可以擁有父類所有的屬性和方法繼承的語法和規(guī)則:? ? 語法:publicclassStudentextendsPerson{? 屬性 方法 }繼承的優(yōu)點(diǎn):代碼的復(fù)用督笆。例:創(chuàng)建一個(gè)建設(shè)銀行的ATM類 ,實(shí)現(xiàn)密碼校驗(yàn)方法诱贿,取款方法娃肿,手機(jī)充值方法創(chuàng)建一個(gè)工商銀行的ATM類,實(shí)現(xiàn)密碼校驗(yàn)方法珠十,取款方法料扰,轉(zhuǎn)賬方法發(fā)現(xiàn):其實(shí)密碼校驗(yàn)以及取款是每個(gè)銀行的ATM都存在的功能,在編碼時(shí)寫了重復(fù)代碼焙蹭,這時(shí)可以創(chuàng)建ATM類晒杈,讓它實(shí)現(xiàn)校驗(yàn)密碼和取款的方法。而其它的ATM類繼承該類孔厉,就可以使用這些方法了拯钻。Java中是單一繼承,一個(gè)類只能有一個(gè)父類子類實(shí)例化的過程:? ? 子類實(shí)例化會(huì)先實(shí)例化其父類撰豺,父類構(gòu)造器調(diào)用完畢粪般,才執(zhí)行子類構(gòu)造器? ? 子類繼承父類,在子類的構(gòu)造方法的第一句一定會(huì)調(diào)用父類的構(gòu)造方法? ? 如果父類沒有明確的構(gòu)造方法污桦,父類使用的是默認(rèn)構(gòu)造器刊驴。? ? 子類在繼承父類時(shí),在子類構(gòu)造方法中會(huì)默認(rèn)調(diào)用父類的默認(rèn)構(gòu)造器super()可以不寫? ? 子類在自己的構(gòu)造器中使用super關(guān)鍵字調(diào)用父類的構(gòu)造器super(參數(shù)1寡润,參數(shù)2捆憎,...)? ? 如果子類調(diào)用了父類的無參構(gòu)造器 而父類中沒有無參構(gòu)造器則會(huì)編譯報(bào)錯(cuò)? ? ? Super和this:? ? Super(); 指向父類的引用 調(diào)用父類的構(gòu)造器,只能出現(xiàn)在子類的構(gòu)造器中梭纹,? ? 且必須在第一行super()中有無參數(shù)躲惰,決定了調(diào)用哪個(gè)構(gòu)造器。? ? 在同一個(gè)構(gòu)造器中变抽,不能同時(shí)出現(xiàn)super和this
思考以下代碼的運(yùn)行結(jié)果
publicsclassCar{privateint site =4;//座位數(shù)Car(){? ? ? ? System.out.println ("載客量是"+site+"人);
? ? ? }
? ? ? public void setSite(int site){
? ? ? ? this.site = site;
? ? ? }
? ? ? void print(){
? ? ? ? System.out.print("載客量是"+site+"人");
? ? ? }
? }
? class Bus extends Car {
? ? ? Bus(int site){
? ? ? ? ? setSite(site);
? ? ? }
? }
? public static void main(String[] args) {
? ? ? Bus bus = new Bus(20);
? ? ? bus.print();
? }
封裝: 對類中的屬性和方法規(guī)定訪問權(quán)限础拨,保護(hù)類中數(shù)據(jù)的安全? ? ? 將類中的信息(屬性和方法)隱藏起來氮块,不允許外部程序之間訪問,而是通過該類? ? ? 提供的方法進(jìn)行訪問? ? ? ? ? ? 活中的例子:到飯館吃飯诡宗,你只需要跟服務(wù)員講你要吃什么飯菜服務(wù)員就會(huì)跟后臺(tái)廚房的廚師說明一下? ? ? 等待一段時(shí)間后滔蝉,飯菜就被服務(wù)員直接遞送到你面前,作為客戶的你是不知道也無需知道飯菜的具體做法塔沃,? ? ? 后臺(tái)廚房的廚師及做飯菜的過程就是被封裝的細(xì)節(jié)蝠引,而服務(wù)員則是公開暴露的訪問路徑,? ? ? 你只能通過服務(wù)員點(diǎn)餐然后獲得飯菜蛀柴,而不能直接去到后臺(tái)廚房要求廚師如何做飯菜螃概;? ? ? ? 類中存在屬性name ,調(diào)用類隨意對屬性進(jìn)行賦值 ,不會(huì)符合規(guī)范 沒有意義鸽疾。? ? 這是由于調(diào)用類可以直接訪問到類中的屬性? ? ? ? 訪問權(quán)限:用來控制類的成員和類的使用范圍private:私有地default:默認(rèn)地protected:受保護(hù)的public:公共的public和 默認(rèn) 可以修飾類? ? ? ? ? ? ? ? get方法和set方法訪問類中的屬性
多態(tài):子類和父類之間吊洼,不同的子類之間對于同一行為,有不同的實(shí)現(xiàn)方式
? ? 例:王者榮耀中的英雄都有技能 但不同的英雄技能不同
? ? ? ? 每個(gè)形狀都有面積 但不同的形狀面積不同
? ? 體現(xiàn):方法的重寫/override
? ? ? ? ? 方法的簽名相同(方法名制肮,參數(shù)列表) 冒窍,方法體不同。
例:定義形狀類 定義求面積 周長的方法? ? ? 定義圓形類 聲明屬性半徑? 繼承 形狀類? ? ? 由于不同形狀求面積方法不同 需要重寫父類的原始方法classShape{doublec;publicdoublearea();}classSquareextendsShape{publicSquare(doublec){this.c = c;? ? }publicdoublearea(){return0.0625*c*c;? ? }}classCircleextendsShape{publicCircle(doublec){this.c = c;? ? }publicdoublearea(){return0.0796*c*c;? ? }? ? }
? 重寫方法被調(diào)用時(shí)豺鼻,看對象類型综液。子類對象的重寫方法被調(diào)用時(shí),引用類型無論是父類還是子類拘领,運(yùn)行的都是子類重寫后的版本意乓。
? 方法重寫后的調(diào)用原理
? code..
可以通過super.方法名 在子類重寫方法中調(diào)用父類方法。? ? ? ? 重寫方法的注意事項(xiàng):1.方法名相同 约素,參數(shù)列表相同2.子類方法的返回值類型void等于父類,基本類型等于父類3.子類方法拋出的異常小于或等于父類4.子類方法的訪問權(quán)限大于或等于父類? ? ? ? ? ? ? 重載和重寫的區(qū)別:? ? ? ? 重寫:遵循“運(yùn)行期”的綁定届良,根據(jù)對象類型進(jìn)行調(diào)用? ? ? ? 重載:遵循“編譯器”的綁定,根據(jù)參數(shù)列表不同進(jìn)行調(diào)用
以下代碼中 那些是方法的重載圣猎,那些是方法的重寫 以及運(yùn)行結(jié)果publicclassOverrideOverloadDemo{publicstaticvoidmain(String[] args){? ? ? ? Goo g =newGoo();? ? ? ? Eoo e =newEoo();? ? ? ? g.show(e);? ? ? ? ? ? ? ? Foo f =newFoo();? ? ? ? g.show(f);? ? ? ? ? ? ? ? Eoo e1 =newFoo();? ? ? ? g.show(e1);? ? ? ? ? ? ? ? Foo f1 =newFoo();? ? ? ? g.show(f1);? ? }}//overloadclassGoo{voidshow(Eoo e){? ? ? ? System.out.println("父類參數(shù)");? ? ? ? e.show();? ? }voidshow(Foo f){? ? ? ? System.out.println("子類參數(shù)");? ? ? ? f.show();? ? }}classEoo{voidshow(){? ? ? ? System.out.println("父類show方法");? ? }}classFooextendsEoo{voidshow(){? ? ? ? System.out.println("子類show方法");? ? }}
? 引用數(shù)據(jù)類型的轉(zhuǎn)換:
? ? ? ? “麻煩你士葫,小王。幫我把那個(gè)東西拿過來好嗎”
? ? ? ? 在生活中送悔,你肯定用過這個(gè)詞--東西慢显。
? ? ? ? 小王:“你要讓我?guī)湍隳媚莻€(gè)水杯嗎?”
? ? ? ? 你要的是水杯類的對象欠啤。而東西是水杯的父類荚藻。通常東西類沒有實(shí)例對象,但我們有時(shí)需要東西(父類)的引用指向它的子類實(shí)例洁段。
? ? 父子類之間的轉(zhuǎn)換:
? ? 上溯造型(向上造成):子類對象- - > 父類對象应狱,造成子類特有的,擴(kuò)展的屬性和方法失效祠丝,只能有父類繼承的屬性和方法疾呻。
? ? ? ? ? ? 優(yōu)點(diǎn):有利于程序的維護(hù)和擴(kuò)展除嘹。
publicclassMaster{privateString name ="";// 主人名字privateintmoney =0;// 元寶數(shù)/**
? ? * 有參構(gòu)造方法。
? ? * @param name 主人名字
? ? * @param money 元寶數(shù)
? ? */publicMaster(String name,intmoney){this.name = name;this.money = money;? ? }publicvoidsetName(String name){this.name = name;? ? }publicvoidsetMoney(intmoney){this.money = money;? ? }publicintgetMoney(){returnmoney;? ? }publicStringgetName(){returnname;? ? }/**
? ? * 主人給Dog喂食岸蜗。
? ? */publicvoidfeed(Dog dog){? ? ? ? dog.eat();? ? }? }
publicclassPet{privateString name ="無名氏";// 昵稱privateinthealth =100;// 健康值privateintlove =0;// 親密度/**
? ? * 方法eat(),負(fù)責(zé)寵物吃飯功能尉咕。
? ? */publicvoideat();/**
? ? * 有參構(gòu)造方法。
? ? * @param name? 昵稱
? ? */publicPet(){? ? ? ? ? ? }publicPet(String name){this.name = name;? ? }publicvoidsetName(String name){this.name = name;? ? }publicvoidsetHealth(inthealth){this.health = health;? ? }publicvoidsetLove(intlove){this.love = love;? ? }publicStringgetName(){returnname;? ? }publicintgetHealth(){returnhealth;? ? }publicintgetLove(){returnlove;? ? } }
publicclassDogextendsPet{privateString strain;// 品種/**? ? * 有參構(gòu)造方法璃岳。? ? *@paramname? 昵稱? ? *@paramstrain? 品種? ? */publicDog(String name, String strain){super(name);this.strain = strain;? ? }publicStringgetStrain(){returnstrain;? ? }/**
? ? * 重寫吃食方法年缎。
? ? */publicvoideat(){if(getHealth()>=100){? ? ? ? ? ? System.out.println("狗狗"+this.getName() +"吃飽了,不需要喂食了矾睦!");? ? ? ? }else{this.setHealth(this.getHealth()+3);? ? ? ? ? ? System.out.println("狗狗"+this.getName() +"吃飽啦晦款!健康值增加3炎功。");? ? ? ? }? ? }}
如果再領(lǐng)養(yǎng)新種類XXX的寵物枚冗,就需要給XXX喂食,怎么辦蛇损?
添加XXX寵物類赁温,繼承Pet類,實(shí)現(xiàn)吃食方法
修改Master類淤齐,添加給XXX寵物喂食的方法
可以發(fā)現(xiàn)隨著程序的不斷擴(kuò)展股囊,需要對源程序進(jìn)行不斷的修改,這不符合程序的設(shè)計(jì)原則
頻繁修改代碼更啄,程序的可擴(kuò)展性稚疹、可維護(hù)性變得很差
使用多態(tài)優(yōu)化設(shè)計(jì)? ? ? 修改Master 類的eat()方法 將參數(shù) 改為Pet類型? ? ? 實(shí)現(xiàn)一個(gè)方法可以 對所有寵物喂食publicvoidfeed(Pet? pet){//父類的引用指向子類的對象pet.eat();? ? ? }? ? ? ? 調(diào)用Master類的喂食方法時(shí)可以傳入其子類對象 從而調(diào)用不同子類的喂食方法
下溯造成:父類-- >子類 直接強(qiáng)轉(zhuǎn)會(huì)報(bào)類型轉(zhuǎn)換錯(cuò)誤,要求父類對象必須是由子類對象向上轉(zhuǎn)換過的祭务,才可以向下轉(zhuǎn)換? ? ? ? ? ? ? ? 類型轉(zhuǎn)換這部分在講解時(shí)内狗,講解時(shí)學(xué)生能夠知道有這樣一種寫法。? ? 但是大多數(shù)學(xué)生不理解為什么要這么去寫义锥。所有需要設(shè)置一個(gè)案例柳沙,使學(xué)生能夠理解向上造型的用途。? ? 例:生產(chǎn)汽車根據(jù)不同的的參數(shù) 返回不同類型的汽車類 但方法的返回值是 汽車的父類? ? 抽象類abstract:該類不需要?jiǎng)?chuàng)建對象拌倍,提出了一個(gè)概念赂鲤,其中的方法有子類實(shí)現(xiàn)。? ? 特點(diǎn):抽象類不能實(shí)例化? ? ? ? ? 抽象類中可以有普通方法柱恤,可以有抽象方法? ? ? ? ? 向子類提供父類的定義数初,抽象類就是給其他類繼承的? ? ? ? ? ? ? 子類繼承抽象類:普通類必須實(shí)現(xiàn)抽象方法,抽象子類不實(shí)現(xiàn)? ? ? ? 抽象類作用:為子類提供一個(gè)公共的類型梗顺;? ? ? ? 抽象類的應(yīng)用——模板設(shè)計(jì)模式? ? 例如泡孩,現(xiàn)在有三類事物:? ? (1)機(jī)器人:充電,工作荚守;? ? (2)人:吃飯珍德,工作练般,睡覺;? ? (3)豬:進(jìn)食锈候,睡覺薄料。? ? 現(xiàn)要求實(shí)現(xiàn)一個(gè)程序,可以實(shí)現(xiàn)三種不同事物的行為泵琳。? ? 所有的子類如果要想正常的完成操作摄职,必須按照指定的方法進(jìn)行覆寫才可以? ? 而這個(gè)時(shí)候抽象類所起的功能就是一個(gè)類定義模板的功能。? 定義一個(gè)Employee抽象基類? 公司有以下幾種員工:? ? 開發(fā)人員:工資計(jì)算方式获列,每月固定工資? ? 銷售人員:底薪+提成? ? 小時(shí)工:按工作時(shí)間付工資谷市,每小時(shí)30元? ? 創(chuàng)建不同類型的3名員工對象,計(jì)算他們應(yīng)付的月工資之和
publicabstractclassEmployee{privateString name;publicEmployee(String name){this.name ="@"+ name +"@";? }protectedabstractintpaySalary();}
//開發(fā)人員publicclassDeveloperextendsEmployee{privateintsalary;publicDeveloper(String name,intsalary){super(name);this.salary = salary;? }@Override//方法重寫注解protectedintpaySalary(){returnsalary;? }}
//銷售人員publicclassSaleManextendsEmployee{privateintsalary;privateintcomm;//提成publicSaleMan(String name,intsalary,intcomm){super(name);this.salary = salary;this.comm = comm;? }@OverrideprotectedintpaySalary(){returnsalary + comm;? }}
//小時(shí)工publicclassHourlyWorkerextendsEmployee{privateinthours;//這個(gè)月工作了多少小時(shí)publicHourlyWorker(String name,inthours){super(name);this.hours = hours;? }@OverrideprotectedintpaySalary(){return30*hours;? }}
publicclassMain{publicstaticvoidmain(String[] args){? ? ? Employee[] employees =newEmployee[3];? ? ? employees[0] =newDeveloper("張三",5000);? ? ? employees[1] =newSaleMan("李四",2000,500);? ? ? employees[2] =newHourlyWorker("馮六",200);//計(jì)算總工資inttotal =0;for(inti =0; i < employees.length; i++)? ? ? {? ? ? ? ? total += employees[i].paySalary();? ? ? }? ? ? System.out.println("總共需要支付"+ total);? }}
關(guān)鍵字final修飾類:? 該類不能被繼承? ? 修飾屬性和變量:賦值后不允許修改數(shù)值击孩,地址不能改變? ? 修飾方法:方法不能被重寫final練習(xí)演示? ? 思考一個(gè)有趣的現(xiàn)象:byteb1=1;byteb2=3;byteb3=b1+b2;//當(dāng)程序執(zhí)行到這一行的時(shí)候會(huì)出錯(cuò)迫悠,因?yàn)閎1、b2可以自動(dòng)轉(zhuǎn)換成Int類型的變量巩梢,運(yùn)算時(shí)java虛擬機(jī)對它進(jìn)行了轉(zhuǎn)換创泄,結(jié)果導(dǎo)致把一個(gè)int賦值給byte-----出錯(cuò)如果對b1 b2加上final就不會(huì)出錯(cuò)finalbyteb1=1;finalbyteb2=3;? ? 關(guān)鍵字abstract和final不能同時(shí)使用? ? 接口 Interface:幾類完全不同的事物,擁有同樣的行為括蝠,這種行為定義在接口中鞠抑。接口是一種標(biāo)準(zhǔn),一種協(xié)議忌警,一種規(guī)范? ? USB接口本身沒有實(shí)現(xiàn)任何功能? ? USB接口規(guī)定了數(shù)據(jù)傳輸?shù)囊? ? USB接口可以被多種USB設(shè)備實(shí)現(xiàn)? ? ? ? 接口的特點(diǎn):? ? ? ? 接口不是類? ? ? ? 接口中定義的只能是抽象方法搁拙,無論是否書寫abstract關(guān)鍵字? ? ? ? 接口中屬性,必須是final修飾—常量 法绵,無論是否寫了final一個(gè)類可以實(shí)現(xiàn)多個(gè)接口, 接口可以繼承接口(多繼承)? 實(shí)現(xiàn)接口的演示publicinterfaceUsbInterface{//USB接口提供服務(wù)碟刺。voidservice();}publicclassUDiskimplementsUsbInterface{publicvoidservice(){? ? ? ? ? System.out.println("連接USB口疏唾,開始傳輸數(shù)據(jù)幸斥。");? ? ? ? }? }? ? 接口在多態(tài)中的體現(xiàn):1.繼承或?qū)崿F(xiàn)2.重寫3.父類(接口)的聲明指向子類的對象? ? 接口和抽象類的區(qū)別:? ? ? ? 一個(gè)是類勋篓,一個(gè)是接口? ? ? ? 抽象類可以有抽象方法,也可以有普通方法此熬,接口中都是抽象方法? ? ? ? 抽象類中可以有普通的屬性庭呜,接口中是常量
接口使用練習(xí)publicclassUnionPayTest{publicstaticvoidmain(String[] args){? ? ? ICBCImpl card1 =newICBCImpl(10000,"qwer12");? ? ? Scanner scan =newScanner(System.in);? ? ? System.out.println("請輸入密碼:");if(card1.checkPwd(scan.next())){? ? ? ? ? System.out.println("請輸入金額:");if(card1.drawMoney(scan.nextDouble())){? ? ? ? ? ? ? System.out.println("所剩金額:"+card1.getBalance());? ? ? ? ? }else{? ? ? ? ? ? ? System.out.println("金額不足");? ? ? ? ? }? ? ? }else{? ? ? ? ? System.out.println("密碼錯(cuò)誤");? ? ? }? }}interfaceUnionPay{publicdoublegetBalance();//查看余額publicbooleancheckPwd(String input);//檢查密碼publicbooleandrawMoney(doublenumber);//取錢}interfaceICBCextendsUnionPay{publicvoidpayOnline(doublenumber);//在線支付}interfaceABCextendsUnionPay{publicbooleanpayTelBill(String phoneNum,doublesum);//支付電話費(fèi)}classICBCImplimplementsICBC{privatedoublemoney;//賬戶余額privateString pwd;//賬戶密碼publicICBCImpl(doublemoney,String pwd){this.money = money;this.pwd = pwd;? }publicdoublegetBalance(){returnmoney;? }publicbooleancheckPwd(String input){if(pwd.equals(input)){returntrue;? ? ? }else{returnfalse;? ? ? }? }publicbooleandrawMoney(doublenumber){if(money-number>0){? ? ? ? ? money-=number;returntrue;? ? ? }else{returnfalse;? ? ? }? }publicvoidpayOnline(doublenumber){if(money>=number){? ? ? ? ? money-=number;? ? ? }? }}classABCImplimplementsABC{privatedoublemoney;privateString pwd;publicABCImpl(doublemoney,String pwd){this.money = money;this.pwd = pwd;? }publicdoublegetBalance(){returnmoney;? }publicbooleancheckPwd(String input){if(pwd.equals(input)){returntrue;? ? ? }returnfalse;? }publicbooleandrawMoney(doublenumber){if(money-number>-2000){? ? ? ? ? money-=number;returntrue;? ? ? }else{returnfalse;? ? ? }? }publicbooleanpayTelBill(String phoneNum,doublesum){if(phoneNum.length()==11&& money-sum>-2000){? ? ? ? ? money-=sum;returntrue;? ? ? }else{returnfalse;? ? ? }? }}
靜態(tài)static:? ? 類和對象的關(guān)系,類是對象的模板犀忱,類中有屬性和方法? ? Static修飾屬性:所有對象共享該屬性? ? Static修飾方法:所有對象共享該方法? ? 被static修飾的屬性和方法屬于類募谎,而不屬于某個(gè)對象? ? ? ? 靜態(tài)方法中不能直接使用非靜態(tài)屬性和方法,只能調(diào)用其他的靜態(tài)屬性和方法? ? 非靜態(tài)方法可以直接調(diào)用普通資源和靜態(tài)資源static可以修飾的元素和使用特點(diǎn)static可以修飾 屬性 方法 和 代碼塊static修飾屬性 :靜態(tài)變量? ? ? ? ? ? 所有對象共享 在類被載入時(shí)創(chuàng)建阴汇,只要類存在数冬,static變量就存在? ? ? ? ? ? 通過類名.屬性名 / 對象.屬性名 進(jìn)行訪問static修飾方法:靜態(tài)方法? ? ? ? ? ? 不需要實(shí)例化對象 可以直接通過類名.方法名 訪問? ? ? ? ? ? 實(shí)例化對象后 可以 對象.方法名 訪問? ? ? ? ? ? 注意事項(xiàng):? ? ? ? ? ? ? ? 靜態(tài)方法只能直接訪問靜態(tài)變量 不能直接訪問成員變量? ? ? ? ? ? ? ? 靜態(tài)方法中不能使用super和this關(guān)鍵字? ? ? ? ? ? ? ? 靜態(tài)方法不能被覆蓋(重寫)static修飾塊:靜態(tài)塊? ? ? ? ? ? 有static修飾的語句塊 不包含任何方法體的代碼塊? ? ? ? ? ? 當(dāng)類被加載時(shí) 靜態(tài)塊被執(zhí)行 并且只執(zhí)行一次? ? ? ? ? ? 常用于類屬性的初始化變量的作用域:? ? 類變量:? ? ? 用static修飾的成員變量,它們在類被載入時(shí)創(chuàng)建,只要類存在拐纱,static變量就存在? ? 實(shí)例變量:? ? ? 類體中聲明的成員變量铜异,即非static的屬性,創(chuàng)建對象后存在? ? 局部變量:? ? ? 方法體中聲明的變量秸架,方法中的參數(shù)揍庄,或代碼塊中聲明的變量,都是局部變量东抹。局部變量只在方法調(diào)用的過程中有效蚂子,方法調(diào)用結(jié)束后失效? ? 單例模式:在系統(tǒng)中該類只有一個(gè)實(shí)例化對象? ? 在系統(tǒng)中某些類只需要一個(gè)對象就可以完成所有操作,會(huì)將類設(shè)計(jì)為單例模式以節(jié)省系統(tǒng)的開銷? ? 分為:餓漢模式 缭黔,懶漢模式? ? Java的異常處理機(jī)制是Java程序在編譯或運(yùn)行期間食茎,發(fā)生的不可預(yù)期的意外,造成程序不能繼續(xù)執(zhí)行的情況Java中的異常是被管理起來的,當(dāng)程序發(fā)生異常馏谨,會(huì)創(chuàng)建出一個(gè)異常的對象Throwable? 所有異常的父類Error錯(cuò)誤:天災(zāi) 人力不可抗拒 計(jì)算機(jī)硬件的問題别渔,比如:硬盤壞了,內(nèi)存掉電java.lang.Exception? 異常: 人禍? 主要是因?yàn)槌绦蜷_發(fā)者不嚴(yán)謹(jǐn)造成的問題田巴,可以通過代碼來修補(bǔ)和解決? ? ? ? 檢查性異常(編譯)? ? ? ? ? ? 強(qiáng)制要求在代碼中處理異常? ? ? ? ? ? ? ? ? ? 運(yùn)行時(shí)異常(運(yùn)行)? java.lang.RuntimeException? 非檢查性異常? ? ? ? ? ? 不強(qiáng)制在代碼中處理異常? ? ? ? ? ? ? ? java.lang.ArrayIndexOutOfBoundsException 數(shù)組下標(biāo)越界異常? ? ? ? ? ? IndexOutOfBoundsException? ? ? 下標(biāo)越界異常? ? ? ? ? ? java.lang.ArithmeticException? 除數(shù)為0異常? (整數(shù))? ? ? ? ? ? ? ? ? ? 浮點(diǎn)數(shù):6.0/0Infinity無窮大NaN非數(shù)? ? Not aNumberjava.lang.NullPointerException? 空指針異常 (重點(diǎn))? ? ? ? ? ? ? ? ? ? 調(diào)用了null值的屬性或方法? (null值沒有任何屬性和方法)if(o !=null){? ? ? ? ? ? ? ? ? ? ? ? o.toString();? ? ? ? ? ? ? ? ? ? }else{? ? ? ? ? ? ? ? ? ? ? ? ..? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? java.lang.ClassCastException? 引用數(shù)據(jù)類型類型轉(zhuǎn)換異常? ? ? ? ? ? ? ? ? ? 父類向子類轉(zhuǎn)換時(shí)發(fā)生的異常(下溯造型時(shí)發(fā)生)? ? ? ? ? ? ? ? ? ? binstanceofBtrue變量b是B類的一個(gè)對象? ? ? ? ? ? ? ? ? ? ? ? ? ? flase? 變量b不是B類的一個(gè)對象if(oinstanceofB){? ? ? ? ? ? ? ? ? ? ? ? B b = (B)o;? ? ? ? ? ? ? ? ? ? }else{? ? ? ? ? ? ? ? ? ? ? ? ..? ? ? ? ? ? ? ? ? ? }? ? ? ? 異常的處理1.上報(bào)/拋出throw人工制造異常? ? ? ? ? ? ? ? throws? 表示某個(gè)方法向上拋出異常? ? ? ? ? ? ? ? 面試:throw和throws的區(qū)別2.捕獲try{? ? ? ? ? ? ? ? 嘗試執(zhí)行代碼? ? ? ? ? ? ? ? }catch(Exception e){? ? ? ? ? ? ? ? 發(fā)生異常時(shí)捕獲钠糊,執(zhí)行此處? ? ? ? ? ? ? ? ? ? }finally{? ? ? ? ? ? ? ? 無論如何都會(huì)執(zhí)行? ? ? ? ? ? ? ? }? ? ? ? ? ? final和finally的區(qū)別挟秤?? ? ? ? ? ? ? ? final: 最終關(guān)鍵字? ? ? ? ? ? ? ? ? ? 修飾類:不能被繼承? ? ? ? ? ? ? ? ? ? 修改方法:不能被重寫? ? ? ? ? ? ? ? ? ? 修改屬性:常量finally:異常捕獲最終塊:finally中的代碼在try包的概念:? ? 什么是包? ? 包的作用:? 例window文件系統(tǒng) 使用文件夾可以解決文件同名問題? ? ? ? ? ? ? ? ? 使文檔分門別類易于查找? ? 包的命名方式:組織的域名反寫? ? Java源文件與包的位置關(guān)系
將一個(gè)正整數(shù)分解質(zhì)因數(shù)壹哺。例如:輸入90,打印出90=233*5。
提示:對n進(jìn)行分解質(zhì)因數(shù)艘刚,應(yīng)先找到一個(gè)最小的質(zhì)數(shù)k管宵,然后按下述步驟完成:
(1)如果這個(gè)質(zhì)數(shù)恰等于n,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束攀甚,打印出即可箩朴。
(2)如果n>k,但n能被k整除秋度,則應(yīng)打印出k的值炸庞,并用n除以k的商,作為新的正整數(shù)你n,重復(fù)執(zhí)行第一步。
(3)如果n不能被k整除荚斯,則用k+1作為k的值,重復(fù)執(zhí)行第一步