第4章面向對象(基礎篇)_第1頁
第4章面向對象(基礎篇)_第2頁
第4章面向對象(基礎篇)_第3頁
第4章面向對象(基礎篇)_第4頁
第4章面向對象(基礎篇)_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

大志非才不就,大才非學不成。1第3章回顧方法⑴形參、實參、返回值、返回值類型⑵方法重載:解決類內部方法同名問題⑶遞歸調用:重點理解方法調用的過程數(shù)組⑴算法:排序、復制⑵數(shù)組內存布局:與基本數(shù)據(jù)類型的存儲不同

實質棧內存指向堆內存⑶數(shù)組的引用傳遞2第4章面向對象(基礎篇)4.1

面向對象編程思想4.2

類與對象4.3

封裝性4.4

構造方法4.5

匿名對象4.6

類設計分析(一)4.7String類4.8引用傳遞應用4.9this關鍵字4.10

垃圾回收機制

4.11static關鍵字4.12

代碼塊4.13

構造方法私有化4.14

對象數(shù)組4.15

內部類4.16

類設計分析(六)

3使用Java語言編程,時刻要以面向對象的思想考慮問題。4.1面向對象編程思想設計一個自動提款機終端系統(tǒng)——面向過程編程思想需要考慮的是從銀行卡插入提款機開始,一直到用戶拿到現(xiàn)金為止所經(jīng)過的所有流程。步驟:1.用戶輸入取款密碼。系統(tǒng)判斷密碼是否正確。如果正確,進入取款界面;如果錯誤,提示用戶重新輸入2.取款界面用戶輸入金額。判斷余額是否足夠。如果不足,取款失??;如果足夠,取款機按照金額點鈔。3.點鈔時,系統(tǒng)判斷提款機內的金額是否足夠。如果足夠,吐出鈔票,打印票據(jù);如果不足,取款失敗。44.1面向對象編程思想設計一個自動提款機終端系統(tǒng)——面向對象編程思想需要考慮的是自動提款機終端系統(tǒng)由哪些不同類型的對象構成,讓他們互相通信、傳遞消息就可以完成系統(tǒng)的功能。用戶

狀態(tài)——密碼——屬性

行為——輸入密碼+輸入金額——方法提款機

狀態(tài)——金額——屬性

行為——判斷密碼+判斷金額——方法方法調用用戶類提款機類使用面向對象的思維編程1.考慮題目中涉及哪些對象2.將這些對象進行抽象

類3.設計類(屬性+方法)4.不同類之間具備哪些關系5.傳遞信息——方法調用4.2類與對象汽車設計圖紙1.類與對象的關系6問題1:設計圖紙有什么用?問題2:光有設計圖紙能用嗎?能帶你去中街嗎在Java中,”人”可以定義成一個類,而某一個具體的人就可以稱為對象。”人”本身屬于一種廣義的、抽象的概念,不是一個具體的概念。1.類與對象的關系

人張三王五李四7類與對象關系:類是對象的模板,對象是類的實例。類只能通過對象才可以使用每個具體的人(對象)都有共同的狀態(tài),如姓名、年齡、性別等

抽象

類的屬性每個具體的人(對象)都有共同的行為,如說話、睡覺、走路等

抽象

類的方法類的組成8面向對象的基礎就是類。在Java中,使用class定義類。類由屬性和方法組成。屬性表示對象的狀態(tài),方法表示對象的行為。使用new創(chuàng)建類的對象。不同的對象靠不同屬性進行區(qū)分。class類名稱{

數(shù)據(jù)類型變量1;

數(shù)據(jù)類型變量2;

…… [修飾符][返回值類型]方法1(參數(shù)列表){

方法體;

}

……}2.類的定義定義屬性定義方法⑴類是由屬性和方法構成的。⑵屬性和方法可以有一個、多個,或者沒有。⑶屬性:表示對象的數(shù)據(jù)特征,通過變量的形式體現(xiàn)。⑷方法:表示對象的行為特征,通過方法的形式體現(xiàn)。⑸屬性又叫成員屬性或成員變量;方法又叫成員方法。classPerson{

}范例:自定義Person類思考問題:Person類能用嗎?能打印出姓名和年齡嗎?操作文件:Demo01.java結果說明:光有類,程序是運行不了的。應該這樣做:利用類創(chuàng)建對象,然后通過對象來給屬性賦值和調用方法,讓程序運行起來。10狀態(tài)

屬性行為

方法Stringname; //聲明姓名intage; //聲明年齡publicvoidspeak(){ //方法

System.out.println("姓名:"+name+"、年齡:"+age);}3.對象的創(chuàng)建及使用創(chuàng)建對象的格式法1.兩步①聲明對象②實例化對象

類名對象名稱=null;

對象名稱=new

類名();

法2.一步

類名對象名稱=new

類名();例:Personper=null;per=newPerson();或Personper=newPerson();11classPerson{ Stringname; //聲明姓名

intage; //聲明年齡

publicvoidspeak(){ //方法

System.out.println("姓名:"+name+"、年齡:"+age); }}publicclassDemo02{ publicstaticvoidmain(String[]args){

Personper=newPerson(); //內存分析圖 }}范例:Demo02.java創(chuàng)建并實例化對象12思考:創(chuàng)建出來的對象是什么樣子?⑴這個對象(per)擁有這個類的屬性和方法。⑵對象名(局部變量)都保存在棧內存里。⑶對象的所有屬性內容保存在堆內存里。⑷這個對象的屬性在沒賦值前取的都是默認值。4.訪問類中的屬性或方法格式對象名.屬性;

對象名.方法();范例Demo03.java為對象的屬性賦值,使用方法。13classPerson{ Stringname; //聲明姓名

intage; //聲明年齡

publicvoidspeak(){ //方法

System.out.println("姓名:"+name+"、年齡:"+age); }}publicclassDemo03{ publicstaticvoidmain(Stringargs[]){ Personper=newPerson(); //創(chuàng)建對象

="張三"; //為對象屬性賦值

per.age=30;

per.speak();

//調用方法

}}內存分析操作:Demo03.java觀察結果5.創(chuàng)建多個對象一個類可以創(chuàng)建多個該類的對象。范例Demo04.java

創(chuàng)建兩個對象(內存分析)注意:每個對象分別占據(jù)自己的堆、??臻g。15classPerson{ Stringname; //聲明姓名屬性

intage; //聲明年齡屬性

publicvoidtell(){ //取得信息

System.out.println("姓名:"+name+",年齡:"+age); }}publicclassDemo05{ //引用傳遞應用 publicstaticvoidmain(Stringargs[]){ Personper1=newPerson();

Personper2=per1; ="張三";

per1.age=30;

per2.age=33;

per1.tell();

per2.tell(); }}讀程序寫結果Demo05.java引用傳遞就是將一個堆內存空間的使用權交給多個棧內存空間,每一個棧內存空間都可以修改堆內存空間的內容,并使其內容保留下來。classPerson{ Stringname; //聲明姓名屬性

intage; //聲明年齡屬性

publicvoidtell(){ //取得信息

System.out.println("姓名:"+name+",年齡:"+age);}}publicclassDemo06{ //引用傳遞應用 publicstaticvoidmain(Stringargs[]){ Personper1=newPerson();

Personper2=newPerson();

="張三";

per1.age=30;

="李四";

per2.age=33;

per2=per1; per1.tell();

per2.tell();

}}一個棧內存空間只能指向一個堆內存空間如果想要再指向其他的堆內存空間,則必

須先斷開已有的指向,才能分配新的指向引用傳遞結論:堆空間:一塊堆空間可被多個??臻g指向。??臻g:一塊??臻g只有一個向外的指向。讀程序寫結果Demo06.java4.3封裝性封裝有兩個含義1.把對象的屬性和行為看成一個密不可分的整體,將這兩者“封裝”在一個獨立單位(對象)中2.信息隱蔽。把不需要讓外界知道的信息隱藏起來,只允許知道和使用,但不允許更改。一句話“對外不可見”。操作:使用權限修飾符設置屬性和方法的可見度權限從大到小依次是

public>protected>default>private18classPerson{

privateStringname;

privateintage; publicvoidspeak(){

System.out.println("姓名:"+name+"、年齡:"+age); }}publicclassDemo07{ publicstaticvoidmain(String[]args){ Personper=newPerson(); ="張三"; per.age=30; per.speak(); }}封裝屬性操作Demo07.java觀察結果1920示意圖類屬性或方法privatepublic屬性或方法不可以從類的外部訪問可以從類的外部訪問protected

default問題:數(shù)據(jù)必須封裝,又要訪問,怎辦?解決辦法1范例Demo08.javaDemo09.java在類的內部使用setter()為封裝的屬性賦值,使用getter()獲取屬性內容。classPerson{

privateStringname; //聲明姓名屬性

publicvoidsetName(Stringn){ //設置姓名

name=n; } publicStringgetName(){ //取得姓名

returnname; }}publicclassDemo08{ //內存分析 publicstaticvoidmain(Stringarsgh[]){ Personper=newPerson();

per.setName("張三");//調用setter()設置姓名

System.out.println("姓名:"+per.getName()); }}21讀程序寫結果4.4構造方法構造方法——特殊的方法只有一個作用:給屬性賦值(注意:無論封不封裝)一般情況權限為:public、default沒有返回值類型方法名與類名稱一致不能直接使用,只能由new調用22解決辦法2Personper=new

Person();classPerson{ privateStringname; privateintage;

publicPerson(Stringn,inta){//構造方法

name=n; age=a; } publicvoidspeak(){

System.out.println("姓名:"+name+"、年齡:"+age); }}publicclassDemo10{ publicstaticvoidmain(Stringargs[]){ Personper=new

Person("張三

",30); per.speak(); }}范例Demo10.java通過構造方法為屬性賦值4.4構造方法⑴在Java中,只要是類就必然存在構造方法。問題:以前的程序都沒有明確地聲明構造方法?沒明確聲明構造方法的程序在編譯時,JVM會直接生成一個無參的、什么都不做的構造方法。⑵構造方法是可以重載的。重載時,JVM會根據(jù)構造方法的參數(shù)類型或個數(shù)不同,調用不同的構造方法實現(xiàn)對象屬性初始化。范例Demo11.java

構造方法重載24說明classPerson{

privateStringname; //聲明姓名屬性

publicvoidsetName(Stringn){ //設置姓名

name=n; } publicStringgetName(){ //取得姓名

returnname;

}}publicclassDemo08{ //內存分析 publicstaticvoidmain(Stringarsgh[]){ Personper=newPerson();

per.setName("張三");//調用setter()設置姓名

System.out.println("姓名:"+per.getName());

}}25Person(){};4.5匿名對象匿名對象就是沒有明確給出名字的對象。匿名對象只使用一次,只在堆內存中開辟空間,不存在棧內存的引用。匿名對象在使用一次之后就等待被垃圾收集機制回收。結論:匿名對象是開辟了堆內存空間并可以直接使用的對象。范例Demo12.java匿名對象的應用26classPerson{ privateStringname; privateintage; publicPerson(Stringn,inta){

name=n; age=a; } publicvoidtell(){

System.out.println("姓名:"+name+";年齡:"+age); }}publicclassDemo12{ publicstaticvoidmain(Stringargs[]){

newPerson("張三",30).tell(); }}274.6類設計分析(一)編寫一個學生類Student,要求如下:屬性:學號、姓名、數(shù)學、英語、計算機方法:求總分、平均分、最高分、最低分并輸出。面向對象思維⑴設計類:

①屬性:根據(jù)題可知類所包含的屬性,所有屬性必須封裝。

②方法:加入構造方法給屬性賦值;根據(jù)要求添加相應的普通方法。⑵編寫測試類

(又叫主類):在測試類里只定義主方法;在主方法中,只創(chuàng)建對象和調用方法。28Student類的屬性屬性類型屬性名稱學號Stringstuno姓名Stringname數(shù)學floatmath英語floatenglish計算機floatcomputer29范例Demo13.java

類設計分析方法名稱返回值類型作用publicStudent(Strings,Stringn,floatm,floate,floatc)為屬性賦值publicfloatsum()float計算總分publicfloatavg()float計算平均分publicfloatmax()float計算最高分publicfloatmin()float計算最低分publicvoidspeak01()void輸出屬性publicvoidspeak02()void輸出信息30查閱API文檔及基礎類簡介API文檔為用戶列出全部類及相關的操作方法和說明在java.lang包中提供了程序設計的基礎類String——有關字符串的操作Object——是類層次結構的根類包裝類——將基本數(shù)據(jù)類型進行包裝成類Math——包含用于執(zhí)行基本數(shù)學運算的方法(如指數(shù)、對數(shù)、平方根和三角函數(shù))。System——包含輸入、輸出的方法。Throwable——是Java語言中所有錯誤或異常的超類(Error和Exception)314.7String1.

String對象的創(chuàng)建2.String對象內容的不可變性3.String對象內容的比較4.String中常用方法321.

String對象的創(chuàng)建String對象的創(chuàng)建方式有兩種靜態(tài)方式——采用直接賦值方法Stringstr="abc";動態(tài)方式——使用new堆內存空間操作符

Stringstr=newString("abc");33思考題:兩種實例化方式有什么區(qū)別?使用哪種更好呢?在Java中設計了一個對象池,其中保存了多個對象,新實例化的對象如果已經(jīng)在池中存在了,則不再重新開辟新的空間,而是直接從池中取出繼續(xù)使用。兩種實例化區(qū)別:使用靜態(tài)方法創(chuàng)建字符串時,String就采用了這樣的設計,所以當字符串內容重復時,會將對象指向已經(jīng)存在的空間。若不存在,則開辟新空間。使用動態(tài)方法創(chuàng)建字符串時,因使用了new關鍵字,所以無論如何都要開辟堆空間。34“共享設計”理念publicclassDemo20{ //內存分析

publicstaticvoidmain(Stringargs[]){ Strings1="ABC"; Strings2=newString("ABC"); Strings3="ABC"; System.out.println(s1==s2); System.out.println(s2==s3); System.out.println(s1==s3); }}35讀程序寫結果提示:”==“的作用①數(shù)值比較②內存地址比較結論:使用靜態(tài)賦值的方式更好些。publicclassDemo18{ //內存分析圖 publicstaticvoidmain(Stringargs[]){ Stringstr="hello"; str=str+"world!"; //"+"字符串連接符 System.out.println("str="+str); }}2.String對象內容的不可變性含義:字符串的內容一旦聲明則不可改變。結論:一個String對象內容的改變實際上是通過內存地址的斷開-連接變化完成的,而字符串本身的內容并沒有任何的變化。publicclassDemo17{ publicstaticvoidmain(Stringargs[]){ Stringstr="學生"; for(inti=0;i<100;i++){

str=str+i; } System.out.println(str); }}String在開發(fā)中不正確的使用在Demo17中循環(huán)修改100次str的內容,代碼性能低。使用StringBuffer類完成。(可變字符串類)publicclassDemo19{publicstaticvoidmain(Stringargs[]){ Stringstr1="hello"; //直接賦值

Stringstr2=newString("hello");//通過new賦值

Stringstr3=str2; //傳遞引用

System.out.println(str1.equals(str2)); System.out.println(str1.equals(str3)); System.out.println(str2.equals(str3)); }}3.String對象內容的比較38結論:String內容比較使用equals()

內存地址比較使用“==”4.String中常用方法方法定義類型描述1publicString(char[]value)構造直接將一個字符數(shù)組變?yōu)橐粋€字符串2publicString(char[]value,intoffset,intcount)構造將指定范圍的字符數(shù)組變?yōu)樽址?publicString(byte[]bytes)構造將一個byte數(shù)組全部變?yōu)樽址?publicString(byte[]bytes,intoffset,intlength)構造將指定范圍的byte數(shù)組變?yōu)樽址?publicchar[]toCharArray()普通將一個字符串變?yōu)樽址麛?shù)組6publiccharcharAt(intindex)普通從一個字符串中取出指定位置的字符7publicbyte[]getBytes()普通將一個字符串變?yōu)閎yte數(shù)組8publicintlength()普通取得字符串長度9publicintindexOf(Stringstr)普通從頭開始查找指定的字符串位置10publicintindexOf(Stringstr,intfromIndex)普通從指定位置開始查找指定的字符串位置方法定義類型描述11publicStringtrim()普通清除左、右兩端的空格12publicStringsubstring(intbeginIndex)普通從指定位置開始,一直取到尾進行字符串的截取13publicStringsubstring(intbegin,intend)普通指定截取字符串的開始點和結束點14publicString[]split(Stringregex)普通按照指定的字符串對字符串進行拆分*15publicStringtoUpperCase()普通將一個字符串全部變?yōu)榇髮懽帜?6publicStringtoLowerCase()普通將一個字符串全部變?yōu)樾懽帜?7publicbooleanstartsWith(Stringprefix)普通判斷是否以指定的字符串開頭18publicbooleanendsWith(Stringsuffix)普通判斷是否以指定的字符串結尾19publicbooleanequals(Stringstr)普通判斷兩個字符串內容是否相等20publicbooleanequalsIgnoreCase(Stringstr)普通不區(qū)分大小寫比較兩個字符串是否相等publicclassStringTest01{ publicstaticvoidmain(Stringargs[]){ Stringstr1="HelloWorld!";//靜態(tài)賦值 //將一個字符串變?yōu)樽址麛?shù)組

charc[]=str1.toCharArray(); for(inti=0;i<c.length;i++){ System.out.print(c[i]+"、");} System.out.println(""); //將一個字符串變?yōu)閎yte數(shù)組

byteb[]=str1.getBytes();

for(inti=0;i<b.length;i++){ System.out.print(b[i]+"、"); } }}41范例StringTest01.java字符串類方法測試publicclassStringTest02{ publicstaticvoidmain(Stringargs[]){ //靜態(tài)賦值

Stringstr1="HelloWorld!"; //取出字符串中第2個字符

System.out.println(str1.charAt(1)); //求字符串長度

System.out.println("str1的長度"+str1.length()); //截子串取str1中第2~8個位置的內容

System.out.println(str1.substring(1,8)); }}42范例StringTest02.java字符串類方法測試beginIndex-起始索引(包括)endIndex-結束索引(不包括)publicclassStringTest03{ publicstaticvoidmain(Stringargs[]){ //靜態(tài)賦值

Stringstr1="HelloWorld!"; //轉成大寫

System.out.println(str1.toUpperCase()); //轉成小寫

System.out.println(str1.toLowerCase()); Stringstr2="helloworld"; //去掉左右空格后輸出

System.out.println(str2.trim()); }}43范例StringTest02.java字符串類方法測試編寫一個程序,輸出一個給定的字符串中大寫字母的數(shù)量,小寫字母的數(shù)量以及非英文字母的數(shù)量。s="ABAabb$&^$#BAAb898B#@%aa";44思考題TestString01.javaTestString02.javapublicclassTestString01{ publicstaticvoidmain(String[]args){ Strings="ABAabb$&^$#BAAb898B#@%aa"; intcU=0,cL=0,cO=0; for(inti=0;i<s.length();i++){ charc=s.charAt(i); if(c>='A'&&c<='Z'){ cU++; }elseif(c>='a'&&c<='z'){ cL++; }else{ cO++; } } System.out.println("大寫:"+cU); System.out.println("小寫:"+cL); System.out.println("其他:"+cO); }}45publicclassTestString02{publicstaticvoidmain(String[]args){ Strings="ABAabb$&^$#BAAb898B#@%aa"; Strings1="abcdefghijklmnopqrstuvwxyz"; Strings2="ABCDEFGHIJKLMNOPQRSTUVWSYZ"; intcU=0,cL=0,cO=0; for(inti=0;i<s.length();i++){ charc=s.charAt(i); if(s2.indexOf(c)!=-1){ cU++; }elseif(s1.indexOf(c)!=-1){ cL++; }else{cO++; } }

System.out.println("大寫:"+cU+"小寫:"+cL+"其他:"+cO);}}464.8引用傳遞應用一publicclassRefDemo02{ //字符串作為參數(shù)傳遞的變化publicstaticvoidmain(Stringargs[]){ Stringstr1="hello";

System.out.println(str1);

fun(str1); //調用fun()方法

System.out.println(str1);}publicstaticvoidfun(Stringstr2){

str2="world"; //修改字符串內容}}47注意:字符串內容一旦聲明則不可改變。4.8引用傳遞應用二classDemo{ //字符串作為屬性的變化 Stringtemp="hello"; }publicclassRefDemo03{ publicstaticvoidmain(Stringargs[]){ Demod1=newDemo(); //實例化Demo對象

d1.temp="world"; //修改temp屬性的內容

System.out.println(d1.temp);

fun(d1); System.out.println(d1.temp); } publicstaticvoidfun(Demod2){

d2.temp="helloworld"; //修改temp值

}}48注意:引用數(shù)據(jù)類型作參數(shù)傳遞的是堆內存的使用權這里字符串只作為屬性。4.9this關鍵字1.this表示當前對象this2.使用this調用本類中的屬性this.屬性3.使用this調用構造方法this(參數(shù))含義:this代表對象自身的引用(內存分析)作用:⑴解決變量命名沖突的問題

⑵解決不確定性的問題stackpernameagethisheapclassPerson{ Stringname;

publicvoidgetInfo(){

System.out.println(this);//直接打印this

}}publicclassThisDemo05{publicstaticvoidmain(Stringargs[]){//內存分析 Personper1=newPerson();

System.out.println(per1);

per1.getInfo();

//當前調用getInfo()方法的對象是per1 Personper2=newPerson(); System.out.println(per2);

per2.getInfo();

//當前調用getInfo()方法的對象是per2

}}501.this表示當前對象結論:誰調用方法,誰就是this。2.使用this調用本類中的屬性51classPerson{ //回顧構造方法,觀察其里面的參數(shù)寫法 privateStringname; privateintage;

publicPerson(Stringn,inta){//構造方法

name=n; age=a; } publicvoidspeak(){

System.out.println("姓名:"+name+"、年齡:"+age); }}publicclassDemo10{ publicstaticvoidmain(Stringargs[]){ Personper=new

Person("張三

",30); per.speak(); }}2.使用this調用本類中的屬性classPerson{

privateStringname; //姓名

privateintage; //年齡

publicPerson(Stringname,intage){

//通過構造方法賦值

name=name; age=age; } publicStringgetInfo(){ //取得信息的方法

return"姓名:"+name+",年齡:"+age; }}publicclassThisDemo01{ publicstaticvoidmain(Stringargs[]){ Personper1=newPerson("張三",33);

System.out.println(per1.getInfo());

}}形參屬性classPerson{ //使用this調用本類中的屬性,解決變量命名沖突

privateStringname;

privateintage;

publicPerson(Stringname,intage){

=name;

//為類中的name屬性賦值

this.age=age;

//為類中的age屬性賦值

} publicStringgetInfo(){ //取得信息的方法

return"姓名:"++",年齡:"+this.age; }}publicclassThisDemo02{ publicstaticvoidmain(Stringargs[]){ Personper1=newPerson("張三",33);

System.out.println(per1.getInfo());

}}53結論:當方法參數(shù)或者方法中的局部變量和類的屬性同名的情況下,屬性會被屏蔽。此時,要訪問屬性則需要用“this.屬性”的方式來引用屬性。classPerson{ //簡化程序

privateStringname;privateintage;

publicPerson(){ System.out.println("一個新對象被實例化"); } publicPerson(Stringname){ System.out.println("一個新對象被實例化");

=name; } publicPerson(Stringname,intage){

System.out.println("一個新對象被實例化");

=name;

this.age=age; } publicStringgetInfo(){

return"姓名:"+name+",年齡:"+age;

}}3.使用this調用構造方法3.使用this調用構造方法如果一個類中有多個構造方法,可以使用this(參數(shù))的形式互相調用構造方法,以簡化代碼。注意:this(參數(shù))調用語句只能放在構造方法的首行。范例ThisDemo03.javaclassPerson{ //簡化程序

privateStringname;privateintage;

publicPerson(){ System.out.println("一個新對象被實例化"); } publicPerson(Stringname){

this();

//調用本類中的無參構造方法

=name; } publicPerson(Stringname,intage){

this(name);

//調用有一個參數(shù)的構造方法

this.age=age; } publicStringgetInfo(){ return"姓名:"+name+",年齡:"+age; }}publicclassThisDemo03{ publicstaticvoidmain(Stringargs[]){ Personper1=newPerson("張三",33);

System.out.println(per1.getInfo());

}}使用this(參數(shù))可以調用構造方法,以簡化代碼。classPerson{

privateStringname;privateintage;

publicPerson(){

this(name,age);

System.out.println("一個新對象被實例化"); } publicPerson(Stringname){

this(); //調用本類中的無參構造方法

=name; } publicPerson(Stringname,intage){

this(name); //調用有一個參數(shù)的構造方法

this.age=age; }} 讀程序編寫一個Person類,要求如下:當姓名和年齡都相等時,我們認為這兩個對象相等。

類設計分析(二)思路分析

1.編寫一個Person類,包括屬性和方法2.編寫一個測試類,創(chuàng)建兩個對象問題:

范例ThisDemo07.java1.如何進行對象的比較?2.在哪兒進行對象比較?思考:對象比較放在測試類里合適嗎?ThisDemo07.java在類的設計上出現(xiàn)了問題。解答:測試類只負責使用方法,具體怎樣實現(xiàn)功能要放在類里進行編寫。范例:ThisDemo06.java刷卡流程想進門就刷卡刷卡器刷卡成功刷卡失敗只關心成功或失敗信息publicbooleancompare(Personper){//

觀察怎樣使用的引用傳遞 Personp1=this; //當前的對象,就表示per1 Personp2=per; //傳遞進來的對象,就表示per2 if(p1==p2){ //先判兩對象在內存中是否為同一地址

returntrue; } if(.equals()&&p1.age==p2.age){ returntrue; //兩個對象相等

}else{ returnfalse; //兩個對象不相等

}} If(per1.compare(per2)){ //

測試類 System.out.println("兩個對象相等!"); }else{ System.out.println("兩個對象不相等!"); }4.10垃圾回收機制作用:①回收不再使用的對象

②移動正在使用的對象內存,填補由于內存

回收產(chǎn)生的縫隙,消除內存碎片。注意:此機制只作用于堆內存,與棧內存無關。對象是何時變成垃圾的呢?①對象的引用被賦值為空值Personp=newPerson();p=null;②一次性使用的匿名對象newPerson().tell();③沒有棧內存的指向for(inti=1;i<1000;i++){ Personp=newPerson();}4.11static關鍵字1.靜態(tài)屬性2.靜態(tài)方法3.特殊的靜態(tài)方法——main()由static聲明的屬性,叫靜態(tài)屬性。由static聲明的方法,叫靜態(tài)方法。思考問題:⑴由static聲明的屬性和方法有什么特點和作用?⑵靜態(tài)的屬性或方法與非靜態(tài)的屬性或方法有何區(qū)別?classPerson{

//讀程序 Stringname; Stringcity=“沈陽”; //屬性顯式賦于初始值

publicPerson(Stringname){ =name; } publicvoidinfo(){

System.out.println(“姓名:”++“工作城市:”+this.city);

}}publicclassStaticDemo01{ publicstaticvoidmain(Stringargs[]){ Personp1=newPerson("張三"); Personp2=newPerson("李四"); (); (); }}1.靜態(tài)屬性①如果現(xiàn)在員工所在的工作城市不是沈陽,而是調動到北京。這時怎樣修改程序?修改方法:

p1.city=“北京”;

p2.city=“北京”;②如果員工數(shù)量不是2個,而是50個。這時又怎樣修改程序?注意:

實際開發(fā)中的Person類是被封裝的,外界是無法修改city屬性的。思考問題p1p2stackheapname=null;

李四city=沈陽name=null;

張三city=沈陽最佳方案使用static關鍵字聲明city屬性。靜態(tài)屬性特點⑴靜態(tài)屬性是所有對象共同擁有的⑵靜態(tài)屬性可以由類名稱直接調用解釋:靜態(tài)的東西在類第1次被加載到JVM時,就會被分配空間。只要程序還在運行,靜態(tài)東西的空間就一直存在。換句話說,靜態(tài)的東西是在對象創(chuàng)建之前就已經(jīng)存在了,所以可由類名直接調用。范例StaticDemo02.javaclassPerson{

//讀程序,分析內存 Stringname;

staticStringcity="沈陽";

publicPerson(Stringname){ =name; } publicvoidinfo(){

System.out.println(“姓名:”++“,工作城市:"+this.city); }}publicclassStaticDemo02{ publicstaticvoidmain(Stringargs[]){

Person.city="北京";

Personp1=new

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論