面向對象-教案(第11講) 對象初始化;(第12講)創建和使用數組_第1頁
面向對象-教案(第11講) 對象初始化;(第12講)創建和使用數組_第2頁
面向對象-教案(第11講) 對象初始化;(第12講)創建和使用數組_第3頁
面向對象-教案(第11講) 對象初始化;(第12講)創建和使用數組_第4頁
面向對象-教案(第11講) 對象初始化;(第12講)創建和使用數組_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

《面向對象程序設計》教案第11講教學對象計算機科學技術專業授課內容4.10對象初始化4.11變量作用域4.12局部變量類型推斷4.13垃圾回收課程標準教學目標(一)知識目標1.了解對象初始化和變量作用域2.掌握局部變量類型推斷var的使用3.了解垃圾回收的概念(二)能力目標1.能夠應用類、對象、封裝、繼承、多態等知識編寫應用程序2.能夠掌握面向對象理論與方法,進行創新性的編程設計教學方法課前預習、課堂講授、課堂練習。學時及分配(第1學時50分鐘)課堂講授30分鐘課堂練習20分鐘4.10對象初始化4.11變量作用域4.12局部變量類型推斷4.13垃圾回收學時及分配(第2學時50分鐘)課堂講授20分鐘課堂練習30分鐘編程訓練知識點分析重點:對象初始化變量作用域方法的遞歸調用難點:方法的遞歸調用教學過程設計內容方式問題導入上次課學習了實例變量和靜態變量,實例變量和靜態變量的初始化略有不同。在Java程序中需要創建許多對象。為對象確定初始狀態稱為對象初始化。下面我們來學習對象初始化相關內容。內容要點4.10對象初始化在Java程序中需要創建許多對象。為對象確定初始狀態稱為對象初始化。對象初始化主要是指初始化對象的成員變量。實例變量和靜態變量的初始化略有不同。當一個對象不再使用,應該清除以釋放它所占的空間,通過垃圾回收器清除對象。4.10.1實例變量的初始化Java語言能夠保證所有的對象都被初始化。實例變量的初始化有下面幾種方式:(1)聲明時初始化。(2)使用初始化塊。(3)使用構造方法初始化。1.成員變量默認值在類的定義中如果沒有為變量賦初值,則編譯器為每個成員變量指定一個默認值。對引用類型的變量,默認值為null。對基本數據類型的變量,默認值如表4-1所示。【程序4-14】使用成員變量默認值初始化對象狀態。Student.javapackagecom.boda.xy;publicclassStudent{intid;成員變量沒有賦初值,它們將使用默認值。Stringname;成員變量沒有賦初值,它們將使用默認值。doublemarks;booleanpass;//定義成員方法publicvoiddisplay(){System.out.println("id="+id);System.out.println("name="+name);System.out.println("marks="+marks);System.out.println("pass="+pass);}publicstaticvoidmain(String[]args){Students=newStudent();s.display();}}2.在變量聲明時初始化可以在成員變量聲明的同時為變量初始化,如下所示。3.使用初始化塊初始化在類體中使用一對大括號定義一個初始化塊,在該塊中可以對實例變量初始化。例如:intid;Stringname;doublemarks;booleanpass;{id=1001;這里是初始化塊,由一對大括號定界。name="李明";這里是初始化塊,由一對大括號定界。marks=90.5;pass=true;}4.使用構造方法初始化可以在構造方法中對變量初始化,例如,對于Student類可以定義下面的構造方法。publicStudent(intid,Stringname,doublemarks,booleanpass){用構造方法參數初始化成員變量。this.id=id;用構造方法參數初始化成員變量。=name;this.marks=marks;this.pass=pass;}5.初始化次序從上面程序輸出結果可以看到,構造方法被最后執行,這與初始化塊和構造方法在源代碼中的位置無關。實際上,程序是按下面順序為實例變量初始化的。(1)首先使用默認值或指定的初值初始化。(2)接下來執行初始化塊。(3)最后再執行構造方法。4.10.2靜態變量的初始化靜態變量的初始化與實例變量的初始化類似,靜態變量如果在聲明時沒有指定初值,編譯器也將使用默認值為其賦初值。主要方法有:(1)聲明時初始化。(2)使用靜態初始化塊。(3)使用構造方法初始化。1.靜態初始化塊對于static變量除了可以使用前兩種方法初始化外,還可以使用靜態初始化塊。靜態初始化塊是在初始化塊前面加上static關鍵字。例如,下面的類定義就使用了靜態初始化塊。publicclassStaticDemo{staticintx=100;static{靜態初始化塊。x=48;靜態初始化塊。}publicStsticDemo{x=88;}//其他代碼}2.初始化順序當一個類有多種初始化方法時,執行順序是:(1)用默認值給static變量賦值,然后執行靜態初始化塊為static變量賦值。(2)用默認值給實例變量賦值,然后執行初始化塊為實例變量賦值。(3)最后使用構造方法初始化實例變量和靜態變量。4.11變量的作用域在Java中有多個地方可以使用變量,如類的成員變量、方法的局部變量、代碼塊中聲明的變量(如for語句以及異常處理塊等)。變量的作用域(scope)是指一個變量可以在程序的什么范圍內被使用。Java程序的作用域是通過塊實現的,塊(block)是使用一對大括號封裝的語句序列,塊可對語句進行分組并定義變量的作用域。一般來說,變量只在其聲明的塊中可見,在塊外不可見。若一個變量屬于某個作用域,它在該作用域可見,即可被訪問,否則不能被訪問。變量的生存期(lifetime)是指變量被分配內存的時間期限。當聲明一個方法局部變量時,系統將為該變量分配內存,只要方法沒有返回,該變量將一直保存在內存中。一旦方法返回,該變量將從內存棧中清除,它將不能再被訪問。對于對象,當使用new創建對象時,系統將在堆中分配內存。當一個對象不再被引用時,對象和內存將被回收。但不是對象離開作用域就立即被回收。實際上是在之后某個時刻當垃圾回收器運行時才被回收。4.12局部變量類型推斷在方法中聲明一個引用類型變量并使用構造方法創建對象時,需要兩次輸入變量類型,第一次用于聲明變量類型,第二次用于構造方法,比如:AccountmyAccount=newAccount();在聲明變量時使用一次類型名Account,在創建實例時又使用一次類型名,顯然存在代碼冗余問題。從Java10開始,開發人員可以使用var聲明一個局部變量,然后通過構造方法或工廠方法創建對象,在創建對象時讓編譯器自己去推斷類型,從而確定變量的類型:varmyAccount=newAccount();在處理var時,編譯器先是查看表達式右邊部分,也就是所謂的構造器,并將它作為變量的類型。這樣可以少輸入一些字符,更重要的是,它避免了信息冗余,而且對齊了變量名,更容易閱讀。不是在任何時候都可使用var聲明變量,它只能用在局部變量聲明并創建時,更準確地說,是那些帶有構造器的局部變量聲明。下面用法不正確。不可以,現在不能推斷myAccount的類型varmyAccount;不可以,現在不能推斷myAccount的類型myAccount=newAccount();字符串是引用類型,下面用法是正確的:varname="張大海";4.13垃圾回收在Java程序中允許創建盡可能多的對象,而不用擔心銷毀它們。當程序使用完一個對象,該對象不再被引用時,Java運行系統就在后臺自動運行一個線程,它將銷毀該對象并釋放其所占的內存空間,這個過程稱為垃圾回收(GarbageCollection,GC)。后臺運行的線程稱為垃圾回收器(garbagecollector)。垃圾回收器自動完成垃圾回收操作,因此,這個功能也稱為自動垃圾回收。所以,在一般情況下,程序員不必關心對象不被清除而產生內存泄露問題。1.對象何時有可能被回收當一個對象不再被引用時,該對象才有可能被回收。請看下面代碼。Accountaccount=newAccount(),account2=newAccount();account2=account;上面代碼段創建了兩個Account對象account、account2,然后讓account2指向account,這時account2原來指向的對象沒有任何引用指向它了,也沒有任何辦法得到或操作該對象了,該對象就有可能被回收了。另外,也可明確刪除一個對象的引用,這通過為對象引用賦null值即可,如下所示:account2=null;//原來的account2對象可被回收,注意與上面代碼的區別一個對象可能有多個引用,只有在所有的引用都被刪除,對象才有可能被回收。2.強制執行垃圾回收盡管Java提供了垃圾回收器,但不能保證不被使用的對象及時被回收。如果希望系統運行垃圾回收器,可以直接調用System類的gc()方法,如下所示:System.gc();另一種調用垃圾回收器的方法是通過Runtime類的gc()實例方法,如下所示:Runtimert=Runtime.getRuntime();rt.gc();要注意,啟動垃圾回收器并不意味著馬上能回收無用的對象。因為,執行垃圾回收器需要一定的時間,且受各種因素如內存堆的大小、處理器的速度等的影響,因此垃圾回收器的真正執行是在啟動垃圾回收器后的某個時刻才能執行。【知識點總結】(1)靜態成員使用static修飾符修飾。類的每個實例都能訪問這個類的靜態變量和靜態方法。然而,為清晰起見,最好使用“類名.變量”和“類名.方法”來訪問靜態變量和靜態方法。(2)實例變量的初始化順序是在聲明時初始化、使用初始化塊初始化、使用構造方法初始化。靜態變量的初始化順序是聲明時初始化、使用靜態初始化塊初始化、使用構造方法初始化。(3)當一個對象不再被使用,自動調用后臺垃圾回收器銷毀對象,也可以調用System.gc()方法或者Runtime實例的gc()方法強制執行垃圾回收器。但這些方法都不保證系統立即回收無用對象。編程訓練教材習題4.7,4.8采用機房集中授課,邊講邊練,同時用啟發式、討論式等教學方法。布置課外學習任務課后思考題:1.在一個類中可以定義兩個同名但參數類型不同的方法嗎?在一個類中可以定義兩個名稱和參數列表相同,但返回值不同或修飾符不同的方法嗎?什么是方法重載?2.給定兩個方法定義:publicstaticdoublem(doublex,doubley)publicstaticdoublem(intx,doubley)對于下面給出的語句,將調用兩個方法中的哪一個?(1)doublez=m(4,5);(2)doublez=m(4,5.5);(3)doublez=m(4.5,5.5);編程題:教材習題4、11教學反思《面向對象程序設計》教案第12講教學對象計算機科學技術專業授課內容第5章數組5.1創建和使用數組5.2數組的應用5.3案例學習——數組起泡排序課程標準教學目標(一)知識目標1.了解數組的應用2.掌握數組的定義和初始化以及元素的訪問3.掌握增強的for循環,與可變參數方法(二)能力目標1.通過探究數組的應用和使用方法,提高學生編程能力2.理解軟件開發的新方法,使用這種方法開發的軟件具有可復用、易維護和可擴展等特性教學方法采用講授法、演示法、討論法、案例教學。學時及分配(第1學時50分鐘)課堂講授30分鐘課堂實踐20分鐘5.1創建和使用數組5.2數組的應用1學時及分配(第2學時50分鐘)課堂講授20分鐘課堂實踐30分鐘5.2數組的應用25.3案例學習——數組起泡排序知識點分析重點:數組的定義與應用增強for循環數組應用難點:可變參數方法的定義和使用數組參數與返回值教學過程設計內容方式問題導入數組是幾乎所有程序設計語言都提供的一種數據存儲結構。Java語言的數組是一種引用數據類型,即數組是對象。數組在程序設計中具有廣泛應用,它通常用來存儲和操作一組類型相同的數據。統計學生成績問題,使用數組就很方便。有5名學生學年考試成績如下表所示:科目1科目2科目3科目48075789367879865867260767680766382709067內容要點5.1創建和使用數組所謂數組(array)是名稱相同,下標不同的一組變量,它用來存儲一組類型相同的數據。5.1.1數組定義兩個步驟:(1)聲明數組:聲明數組名稱和元素的數據類型。(2)創建數組:為數組元素分配存儲空間。1.聲明數組使用數組之前需要聲明,聲明數組就是告訴編譯器數組名和數組元素類型。例如,下面代碼聲明了兩個數組。double[]marks;Account[]accounts;2.創建數組數組聲明僅僅聲明一個數組對象引用,而創建數組是為數組的每個元素分配存儲空間。創建數組使用new語句。下面代碼創建marks數組和accounts數組。marks=newdouble[5];//數組包含5個double型元素accounts=newAccount[3];//數組包含3個Account型元素數組的聲明與創建可以寫在一個語句中,例如:聲明同時創建數組double[]marks=newdouble[5];聲明同時創建數組Account[]accounts=newAccount[3];對于引用類型數組(對象數組),它的每個元素初值為null,因此,還需要創建數組元素對象。accounts[0]=newAccount(103,"張三",3000.0);accounts[1]=newAccount(104,"王五",5000.0);accounts[2]=newAccount(105,"李四",8000.0);上面語句執行后效果如圖5-2所示。5.1.2訪問數組元素聲明了一個數組,并使用new運算符為數組元素分配內存空間后,就可以使用數組中的每一個元素。通過數組名和下標訪問數組元素,下標從0開始,到數組的長度減1。例如,上面定義的accounts數組包含3個元素,所以只能使用accounts[0]、accounts[1]和accounts[2]這三個元素。數組一經創建大小不能改變。數組作為對象提供一個length成員變量,它的值是數組元素個數,訪問該成員變量的方法為“數組名.length”。【程序5-1】數組的聲明、創建以及元素和length成員的使用。ArrayDemo.java為了保證安全性,Java運行時系統要對數組元素的范圍進行越界檢查,若數組元素下標超出范圍,將拋出ArrayIndexOutOfBoundsException運行時異常。例如,下面代碼拋出異常。System.out.println(marks[5]);5.1.3數組初始化器聲明數組同時可以使用初始化器對數組元素初始化,它是在一對大括號中給出數組的每個元素值。這種方式適合數組元素較少的情況,這種初始化也稱為靜態初始化。double[]marks={79,84.5,63,90,98};Account[]accounts={newAccount(103,"張三",3000),newAccount(104,"王五",5000),newAccount(105,"李四",8000)};5.1.4增強的for循環如果程序只需順序訪問數組中每個元素,可以使用增強的for循環,它是Java5新增功能。增強的for循環可以用來迭代數組和對象集合的每個元素。它的一般格式為:for(typeidentifier:expression){//循環體}該循環的含義為:對expression(數組或集合)中的每個type類型的元素identifier,執行一次循環體中的語句。這里,type為數組或集合中的元素類型。expression必須是一個數組或集合對象。下面使用增強的for循環實現求數組marks數組中各元素的和,代碼如下:doublesum=0;for(varscore:marks){sum=sum+score;}System.out.println("總成績="+sum);5.2數組的應用5.2.1數組元素的復制經常需要將一個數組的元素復制到另一個數組中。首先應該想到將數組元素一個一個復制到目標數組中。設有一個數組source,其中有4個元素,現在定義一個數組target,與原來數組類型相同,元素個數相同。使用下面方法將源數組的每個元素復制到目標數組中。int[]source={10,30,20,40};//源數組int[]target=newint[source.length];//目標數組for(vari=0;i<source.length;i++)target[i]=source[i];除上述方法外,還可以使用System類的arraycopy()方法,格式如下:publicstaticvoidarraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)下面代碼實現將source中的每個元素復制到數組target中。int[]source={10,30,20,40};int[]target=newint[source.length];System.arraycopy(source,0,target,0,4);【程序5-2】數組元素的復制與異常ArrayCopyDemo.java注意,不能使用下列方法試圖將數組source中的每個元素復制到target數組中。int[]source={10,30,20,40};int[]target=source;//這是引用賦值上述兩條語句實現對象的引用賦值,兩個數組引用指向同一個數組對象,如圖5-5所示。5.2.2數組參數與返回值數組對象可以作為參數傳遞給方法,例如下面代碼定義了一個求數組元素和的方法。publicstaticdoublesumArray(doublearray[]){varsum=0;for(vari=0;i<array.length;i++){sum=sum+array[i];}returnsum;}注意,由于數組是對象,因此將其傳遞給方法是按引用傳遞。當方法返回時,數組對象不變。但要注意,如果在方法體中修改了數組元素的值,則該修改反映到返回的數組對象。一個方法也可以返回一個數組對象,例如,下面的方法返回參數數組的元素反轉后的一個數組。publicstaticint[]reverse(int[]list){varresult=newint[list.length];//創建一與參數數組大小相同的數組for(vari=0,j=result.length–1;i<list.length;i++,j--){result[j]=list[i];//實現元素反轉}returnresult;//返回數組}有了上述方法,可以使用如下語句實現數組反轉。int[]list={6,7,8,9,10};int[]list2=

溫馨提示

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

評論

0/150

提交評論