面向對象上補充案例_第1頁
面向對象上補充案例_第2頁
面向對象上補充案例_第3頁
面向對象上補充案例_第4頁
面向對象上補充案例_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第三章 補充案例案例3-1 定義學生類一、案例描述 1、 考核知識點編號:00103002名稱:類和對象2、 練習目標Ø 掌握類定義的方式Ø 掌握如何在類中定義成員變量和成員方法3、 需求分析在面向對象的思想中最核心就是對象,在程序中創(chuàng)建對象的前提是需要定義一個類。為了讓初學者掌握類的定義方式,本案例將設計一個表示學生的類,該類具有表示姓名的屬性name和表示年齡的屬性age,同時還具有表示說話行為的方法speak(),用于輸出學生的姓名和年齡。 4、 設計思路(實現(xiàn)原理)1)使用class關鍵字定義一個表示學生類型的類,類名為Student。 2)在Student類中定義

2、兩個成員變量name和age,分別用來表示姓名和年齡。其中,name的數據類型為String,變量age的數據類型為int。 3)在Student類中定義一個表示說話行為的speak()方法,用于輸出學生的姓名和年齡。二、案例實現(xiàn)class StudentString name; int age; void speak() System.out.println("我的名字是 "+name+",今年 "+age+"歲"); 三、案例總結1、Java語言嚴格區(qū)分大小寫,class和Class是不同的,在定義類時只能使用class關鍵字2、

3、在Student類中,成員變量name是String類型,String表示一個字符串,后面的章節(jié)會詳細講解3、思考一下:自己定義一個手機(Phone)類,在類中定義品牌(brand)和價格(price)屬性,定義打電話的call()方法,代碼如下所示public class Phone String brand; double price; void call() System.out.println("hi,how are you doing"); 案例3-2 同一對象被多個變量引用一、案例描述1、 考核知識點編號:00103003名稱:對象創(chuàng)建與使用2、 練習目標

4、16; 掌握如何創(chuàng)建類的對象Ø 掌握如何使用兩個或者多個變量引用同一個實例對象。3、 需求分析在程序中,一個對象可能在多處使用,這樣就可能需要有多個變量來引用這個對象。為了讓初學者更好地掌握對象的創(chuàng)建和使用,本案例將基于案例3-1,創(chuàng)建三個學生對象,它們的引用變量分別是s1、s2和s3,首先分別使用s1和s2引用,為name和age賦值,然后調用speak()方法,最后將s2變量賦值給s3, s3也調用speak()方法。4、 設計思路(實現(xiàn)原理)1)編寫Example01類2)在main()方法中,創(chuàng)建Student類的第一個對象,其引用變量為s1,使用s1調用name和age變量

5、分別為它們賦值為“張三”和“19”,然后調用speak()方法。3)創(chuàng)建Student類的第二個對象,其引用變量為s2,使用s2分別為name和age賦值為“李四”和“20”,然后調用speak()方法。4)創(chuàng)建Student類的第三個對象,其引用變量為s3,將s2的值賦給s3,然后使用s3調用speak()方法。二、案例實現(xiàn)public class Example01 public static void main(String args) Student s1 = new Student();="張三"s1.age=19;s1.speak(); Stude

6、nt s2 = new Student();="李四"s2.age=20;s2.speak(); Student s3 = new Student();s3=s2;s3.speak();運行結果如圖3-1所示。圖3-1 運行結果三、案例總結1、Student s3 = s2這句代碼的作用是將s2引用的內存地址賦值給s3,換句話說,就是使變量s3和s2引用了同一個Student對象,因此s3.speak()方法和s2.speak()方法打印的結果相同。為了更加深刻地了解這句代碼的含義,下面通過一張內存圖來演示,具體如圖3-2所示。圖3-2 內存圖2、可以使用兩個

7、或者多個變量引用同一個實例對象,只要通過其中一個變量對該對象的屬性進行修改,使用其它引用變量訪問時,訪問的都是修改后的屬性。案例3-3 類的封裝一、案例描述1、 考核知識點編號:00103004名稱:類的封裝2、 練習目標Ø 了解為什么要對類進行封裝Ø 了解如何實現(xiàn)類的封裝3、 需求分析在案例3-2中,s1對象的年齡是可以隨便賦值的,如果將age的值賦值為-30,顯然違背了事實。為了解決這類問題,我們需要對類進行封裝,防止外界對類中的成員變量隨意訪問。為了讓初學者更好地掌握類的封裝,本案例將使用private關鍵字對成員變量name和age進行私有化,同時分別提供一個set

8、Name(String n)和setAge(int a)方法用于外界的訪問,其中setAge(int a)中需要對age進行判斷。4、 設計思路(實現(xiàn)原理)1) 編寫測試類Example02,將屬性age的值設為-30,演示不合理現(xiàn)象。2) 對Student類進行修改,將name和age屬性使用private修飾,然后定義getName()、setName(String n)、getAge()和setAge(int a)四個對外訪問name和age的方法。3) 在setAge(int a)方法中對傳入的參數進行檢查,如果輸入值為負數,則打印出“設置的年齡不合法”,如果不為負數,才將其設置為ag

9、e屬性的值。4)對Example02類進行修改,在main()方法中創(chuàng)建Student類的實例對象,通過調用對象的setName(String n)和setAge(int a)方法來設置的name屬性和age屬性值,并調用speak()方法。二、案例實現(xiàn)1、定義Example02類,代碼如下所示:public class Example02 public static void main(String args) Student s1 = new Student(); = "小新"s1.age = -30;s1.speak();運行結果如圖3-3所示。圖3-3

10、 運行結果 從上圖可以看出,當將age的值設置為-30后,程序不會報錯,但卻違背了現(xiàn)實。2、對Student類進行封裝,其代碼如下:class Student private String name = "張三"private int age = 19;public String getName() return name;public void setName(String n) name = n;public int getAge() return age;public void setAge(int a) / 對傳入的參數進行檢查if(a < 0)System.

11、out.println("設置的年齡不合法");elseage = a;void speak() System.out.println("我的名字是" + name + ",今年" + age + "歲");public class Example02 public static void main(String args) Student s1 = new Student();s1.setName("小新");s1.setAge(-30);s1.speak();運行結果如圖3-4所示。圖3-4

12、 運行結果三、案例總結1、Student的name和age屬性使用private關鍵字修飾為私有后,在Example02類中不能再使用和s1.age的方式訪問這兩個屬性,只能通過public類型的setName(String n)和setAge(int a)方法進行訪問。在上面的代碼中,調用setAge(int a)方法時的傳入參數為-30,由于參數小于0,會打印出“設置的年齡不合法”,并不會將負數賦值給age屬性。由此可見,只要實現(xiàn)了封裝就能對外界的訪問進行控制,避免對私有變量隨意修改而引發(fā)問題。2、思考一下:定義一個Division類(除法),類中定義兩個int類型的私有成員

13、變量dividend(被除數)和divisor(除數),默認值都為1。定義四個公有方法setDividend(int mDividend )、getDividend()、setDivisor(int mDivisor)和getDivisor(),用于對私有屬性進行設置和訪問。在setDivisor(int mDivisor)方法中對傳入的參數進行檢查,如果傳入值為零,則打印“除數不能為零”,如果不為零,才將其設置為divisor屬性的值。定義Example03類,在類的main()方法中創(chuàng)建Division對象,分別調用setDividend(int mDividend)和setDivisor

14、(int mDivisor)方法給兩個私有屬性dividend和divisor賦值,然后打印出dividend和divisor的結果。(1)定義Division類,代碼如下所示:public class Division private int dividend = 1;private int divisor = 1;public void setDividend(int mDividend) dividend = mDividend;public int getDividend() return dividend;public void setDivisor(int mDivisor) if

15、 (mDivisor = 0) System.out.println("除數不能為零"); else divisor = mDivisor;public int getDivisor() return divisor;(2)定義Example03類,代碼如下所示:public class Example03public static void main(String args) Division division = new Division();division.setDividend(10);division.setDivisor(0);int dividend = d

16、ivision.getDividend();int divisor = division.getDivisor();System.out.println(dividend / divisor);運行結果如圖3-5所示。圖3-5 運行結果從運行結果可以看出,由于實現(xiàn)了Division類的封裝,在setDivisor(int mDivision)方法中對傳入的值進行檢查,從而避免程序中出現(xiàn)除數為0的錯誤。案例3-4 定義有參的構造方法一、案例描述 1、 考核知識點編號:00103005名稱:構造方法的定義2、 練習目標Ø 掌握有參構造方法的定義方式Ø 理解系統(tǒng)會自動分配無參構造

17、方法的情況3、 需求分析如果希望在創(chuàng)建對象的時候直接為其屬性賦值,可以定義有參的構造方法。有參構造方法指的是在初始化對象時,接受外部傳入的值并賦給對象的屬性。為了讓初學者掌握有參構造方法的用法,本案例將演示如何使用有參構造方法完成對象屬性的初始化。4、 設計思路(實現(xiàn)原理)1) 定義一個Student類,該類有一個age屬性,在類中定義一個有參數的構造方法,該參數用于為age屬性賦值。2) 編寫一個測試類Example04,在main()方法中通過有參構造方法創(chuàng)建一個對象。3) 打印該對象age屬性的值。二、案例實現(xiàn)1、對Student類進行修改,代碼如下所示:class Student in

18、t age;public Student(int mAge) age = mAge;2、定義Example04類,代碼如下所示:public class Example04 public static void main(String args) Student s1 = new Student(20);System.out.println("age屬性的值為:"+s1.age);運行結果如圖3-6所示。圖3-6 運行結果三、案例總結1、從運行結果可以看出,new Student(20)語句調用了有參的構造方法Student(int mAge),動態(tài)地將20傳遞給了age屬

19、性。和普通方法一樣,構造方法中同樣可以接收多個參數,只要在使用new關鍵字創(chuàng)建對象時,傳入數量相同和類型一致的參數,就可以自動地調用對應的構造方法。2、思考一下:在Example04的main()方法中是否能夠使用new Student()創(chuàng)建對象呢?答案是否定的,因為new Student()會調用無參的構造方法,而本案例的Student類中并沒有定義無參的構造方法。有些同學肯定會問,之前的Student類都沒有定義無參的構造方法,卻能使用new Student()創(chuàng)建對象,本案例為什么不行呢?這是因為一個類中如果沒有定義構造方法,系統(tǒng)會默認為其分配一個方法體為空的無參構造方法,而一旦定義了

20、構造方法,系統(tǒng)就不再提供默認的構造方法。本案例中由于我們定義了一個有參的構造方法,所以系統(tǒng)不會默認分配無參的構造方法,此時如果通過new Student()去調用無參的構造方法,程序就會發(fā)生錯誤。案例3-5 構造方法的重載一、案例描述1、 考核知識點編號:00103006名稱:構造方法重載2、 練習目標Ø 掌握如何在類中定義重載的構造方法3、 需求分析和普通方法一樣,構造方法也可以重載。不同的構造方法,可以為不同的屬性進行賦值。本案例將通過創(chuàng)建對象的方式演示不同構造方法的使用方式,并根據構造方法的輸出結果對構造方法的重載進行學習。4、 設計思路(實現(xiàn)原理) 1)對Student類進行

21、修改,在類中定義三個重載的構造方法,包括無參的構造方法,接收一個String類型參數的構造方法,接收String類型和int類型兩個參數的構造方法。2)編寫測試類Example05,在main()方法中,分別使用三個重載的構造方法創(chuàng)建三個Student對象。二、案例實現(xiàn)1、對Student類進行修改,代碼如下所示:class Student public Student() System.out.println("無參的構造方法");public Student(String name) System.out.println("一個參數的構造方法");p

22、ublic Student(String name, int age) System.out.println("兩個參數的構造方法");2、定義Example05類,代碼如下所示:public class Example05 public static void main(String args) Student s1 = new Student();Student s2 = new Student("Rose");Student s3 = new Student("Rose", 23);運行結果如圖3-7所示。圖3-7 運行結果三、

23、案例總結一個類中可以定義多個重載的構造方法,在創(chuàng)建對象時,根據傳入參數的不同會調用相應的構造方法。案例3-6 this關鍵字訪問構造方法一、案例描述1、 考核知識點編號:00103007名稱:this關鍵字的使用2、 練習目標Ø 掌握如何在構造方法中使用this關鍵字訪問重載的構造方法3、 需求分析如果一個類中定義了多個重載的構造方法,為了避免在重載的構造方法中重復書寫代碼,可以在一個構造方法中使用this關鍵字調用其它的構造方法。為了讓初學者掌握this關鍵字訪問構造方法的用法,本案例將演示如何使用this關鍵字調用其他的構造方法。4、 設計思路(實現(xiàn)原理)1) 在Student類

24、中創(chuàng)建多個重載的構造方法,包括無參的構造方法和一個參數的構造方法,以及兩個參數的構造方法。2) 在一個參數的構造方法中使用this關鍵字調用無參構造方法,在兩個參數的構造方法中調用一個參數的構造方法。3) 編寫測試類Example06,在main()方法中,調用兩個參數的構造方法創(chuàng)建對象,演示構造方法的執(zhí)行順序。二、案例實現(xiàn)1、對Student類進行修改,代碼如下所示:class Student public Student() System.out.println("無參的構造方法");public Student(String name) this();System.o

25、ut.println("一個參數的構造方法");public Student(String name, int age) this(name);System.out.println("兩個參數的構造方法");2、定義Example06類,代碼如下所示:public class Example06 public static void main(String args) Student s1 = new Student("Jack", 22);運行結果如圖3-8所示。圖3-8 運行結果三、案例總結1、從運行結果可以看出,三個構造方法都被

26、調用了,為了更加清楚地了解三個構造方法的執(zhí)行順序,下面通過一張圖例進行說明,如圖3-9所示。圖3-9 構造方法的執(zhí)行順序2、在構造方法中,使用 this調用重載構造方法的代碼必須放在第一行,否則程序不能通過編譯,這就限定了在一個構造方法中只能調用一次重載的構造方法。3、在構造方法中可以通過this.方法名(參數 )的方式調用普通的成員方法,但是在普通的成員方法中不能使用this(參數 )的方式來調用構造方法。案例3-7 垃圾回收機制一、案例描述1、 考核知識點編號:00103008名稱:垃圾回收機制2、 練習目標Ø 掌握垃圾回收機制的特點Ø 掌握垃圾回收相關的方法3、 需求

27、分析垃圾對象會占用一定的內存空間,當垃圾對象積累到一定程度后,Java虛擬機會自動進行垃圾回收。但是,如果希望程序可以及時通知Java虛擬機回收垃圾對象,可以通過System.gc()方法強制啟動垃圾回收器回收垃圾。為了讓初學者熟悉垃圾回收機制,本案例將演示如何通過System.gc()方法強制啟動垃圾回收器回收垃圾。4、 設計思路(實現(xiàn)原理)1) 對Student類進行修改,在類中對finalize()方法進行重寫。2) 編寫測試類Example07,創(chuàng)建若干個Student對象,然后調用System.gc()方法通知垃圾回收期回收垃圾,為了確??梢钥吹嚼厥盏倪^程,可以在類中編寫一個簡單

28、的循環(huán)語句,延長程序執(zhí)行時間。二、案例實現(xiàn)1、對Student類進行修改,代碼如下所示:class Student public void finalize() System.out.println("垃圾對象被回收了");2、定義Example07類,代碼如下所示:public class Example07 public static void main(String args) new Student();new Student();System.gc();for (int i = 0; i < 1000000; i+) / 延長程序結束時間運行結果如圖3-10

29、所示。圖3-10 運行結果三、案例總結1、從運行結果可以看到,兩個Student對象的finalize()方法都被調用了,這表示兩個對象作為垃圾被回收了。如果把System.gc()這行代碼注釋,會發(fā)現(xiàn)命令行窗口不會打印任何內容,這說明對象在變成垃圾后不會被立即回收,同時也驗證了System.gc()方法的作用。2、由于System.gc()方法只是通知Java虛擬機盡快進行垃圾回收,這意味著垃圾回收器也可能不會馬上運行,因此,在程序的最后使用了一個for循環(huán)來延長程序運行的時間,從而確保能夠看到垃圾對象被回收的過程。3、Student類中定義的 finalize()方法其簽名必須是publi

30、c(protected) void finalize()throw Throwable,這樣做的原因會涉及到后面的一些知識,比如類的繼承、Object類、方法的重寫、異常等等,同學們在學完這些內容后就會明白其中的道理。案例3-8靜態(tài)變量一、案例描述1、 考核知識點編號:00103009名稱:靜態(tài)變量 2、 練習目標Ø 了解靜態(tài)變量的作用Ø 掌握靜態(tài)變量的定義和使用方式3、 需求分析當多個對象存儲的數據相同時,可以使用靜態(tài)變量的方式存儲。例如,有一個Student類具有name、className屬性,請根據該類創(chuàng)建出三個Student對象,并將這些對象的className值

31、都設置為“三年級二班”。 4、 設計思路(實現(xiàn)原理)1) 定義Student類,并在類中定義name和className屬性。2) 編寫測試類Example08,在main()方法中創(chuàng)建三個學生對象,并分別為這些對象的name和className屬性賦值,然后輸出這些對象的name和className值。3) 對Student類進行修改,將className定義為靜態(tài)變量。4) 修改測試類,在main()方法中使用Student.className = “三年級二班”語句為靜態(tài)變量className進行賦值,然后輸出這些對象的name和className值。為了更好地理解Student類中靜態(tài)

32、變量className和Student實例對象的關系,下面通過一個圖例進行演示,如圖3-11所示:圖3-11 靜態(tài)變量與實例對象的關系二、案例實現(xiàn)1、定義Student類,代碼如下所示:class StudentString name;String className;2、定義Example08類,代碼如下所示:public class Example08 public static void main(String args) Student s1 = new Student(); = "張三"s1.className = "三年級二班"

33、Student s2 = new Student(); = "李四"s2.className = "三年級二班"Student s3 = new Student(); = "王五"s3.className = "三年級二班"System.out.println("我的名字是" + + ",來自" + s1.className);System.out.println("我的名字是" + + &quo

34、t;,來自" + s2.className);System.out.println("我的名字是" + + ",來自" + s3.className);運行結果如圖3-12所示。圖3-12 運行結果 3、對Student類進行修改,代碼如下所示:class Student String name;static String className;4、對Example08類進行修改,代碼如下所示:public class Example08 public static void main(String args) Student.c

35、lassName = "三年級二班"Student s1 = new Student(); = "張三"Student s2 = new Student(); = "李四"Student s3 = new Student(); = "王五"System.out.println("我的名字是" + + ",來自" + s1.className);System.out.println("我的名字是" +

36、 + ",來自" + s2.className);System.out.println("我的名字是" + + ",來自" + s3.className);運行結果如圖3-13所示。圖3-13 運行結果三、案例總結1、本案例中,三個Student對象的className屬性值均為“三年級二班”,對于這樣的相同數據,沒有必要在每個對象中都開辟一塊空間存儲,完全可以在內存中只用一塊空間存儲,并被一個類的所有實例對象所共享。在Java中提供了一個static關鍵字,使用static關鍵字修飾的成員變量稱為靜態(tài)

37、變量,靜態(tài)變量能被該類所有實例對象共享。2、靜態(tài)變量可以使用“類名.靜態(tài)方法名”的方式訪問,也可以通過“對象引用變量.靜態(tài)方法名”的方式訪問,例如本例中的靜態(tài)變量className,通過Student.className或者s2.className這兩種方式訪問都是可以的,不過更推薦使用前一種方式。3、思考一下:定義一個Person類,在類中定義兩個String類型的成員變量name和nationality(國籍),變量nationality使用static關鍵字修飾為靜態(tài)變量,其值為“中國”。定義Example09類,在類的main()方法中創(chuàng)建Person類的兩個實例對象,并打印出這兩個對

38、象的姓名和國籍。(1)定義Person類,代碼如下所示:class Person String name;static String nationality = "中國"(2)定義Example09類,代碼如下所示:public class Example09public static void main(String args) Person lily = new Person(); = "麗麗"Person lucy = new Person(); = "露西"System.out.printl

39、n( + "的國籍是" + lily.nationality);System.out.println( + "的國籍是" + lucy.nationality);運行結果如圖3-14所示。圖3-14 運行結果案例3-9 靜態(tài)方法中訪問類的成員一、案例描述1、 考核知識點編號:00103010名稱:靜態(tài)方法2、 練習目標Ø 了解在靜態(tài)方法中只能訪問類的靜態(tài)成員,而不能訪問非靜態(tài)成員。3、 需求分析在程序中經常會調用方法,但靜態(tài)方法之間、靜態(tài)方法和非靜態(tài)方法之間,它們是否能夠互相調用呢?請編寫一個測試類,在類中定

40、義若干個靜態(tài)方法和非靜態(tài)方法,通過方法之間的相互調用,演示靜態(tài)方法和非靜態(tài)方法的調用情況。 4、 設計思路(實現(xiàn)原理)1)編寫Example10類,在類中定義兩個靜態(tài)方法staticMethod1()、staticMethod2(),兩個非靜態(tài)方法nonStaticMethod1()、nonStaticMethod2()2)在Example10類中,針對定義的四個方法進行互相調用,觀察調用情況。二、案例實現(xiàn)1、定義Example10類,在類中定義上述的四個方法和一個main()方法,代碼如下所示:public class Example10static void staticMethod1()

41、 System.out.println("靜態(tài)方法1");static void staticMethod2() System.out.println("靜態(tài)方法2");void nonStaticMethod1() System.out.println("非靜態(tài)方法1");void nonStaticMethod2() System.out.println("非靜態(tài)方法2");public static void main(String args) 2、對靜態(tài)方法staticMethod1()進行修改,在方法中訪

42、問靜態(tài)方法staticMethod2()。在main()方法中調用靜態(tài)方法staticMethod1(),代碼如下所示:public class Example10static void staticMethod1() System.out.println("靜態(tài)方法1");staticMethod2();static void staticMethod2() System.out.println("靜態(tài)方法2");void nonStaticMethod1() System.out.println("非靜態(tài)方法1");void no

43、nStaticMethod2() System.out.println("非靜態(tài)方法2");public static void main(String args) Example10.staticMethod1();運行結果如圖3-15所示。圖3-15 運行結果從運行結果可以看到,程序正常執(zhí)行,這說明在靜態(tài)方法中可以訪問靜態(tài)方法。3、對靜態(tài)方法staticMethod1()進行修改,在方法中訪問非靜態(tài)方法nonStaticMethod1(),代碼如下所示:public class Example10static void staticMethod1() System.ou

44、t.println("靜態(tài)方法1");nonStaticMethod1();static void staticMethod2() System.out.println("靜態(tài)方法2");void nonStaticMethod1() System.out.println("非靜態(tài)方法1");void nonStaticMethod2() System.out.println("非靜態(tài)方法2");public static void main(String args) Example10.staticMethod1

45、();運行結果如圖3-16所示。圖3-16 運行結果從錯誤提示信息可以看到,發(fā)生錯誤的原因是在靜態(tài)方法中訪問了非靜態(tài)的方法。4、在staticMethod1()方法中,將代碼“nonStaticMethod1()”注釋掉,并對非靜態(tài)方法nonStaticMethod1()進行修改,在方法中分別調用靜態(tài)方法statiMethod1()和非靜態(tài)方法nonStaticMethod2()。在main()方法中創(chuàng)建Example09的實例對象,調用nonStaticMethod1()方法,代碼如下所示:public class Example10static void staticMethod1() S

46、ystem.out.println("靜態(tài)方法1");/ nonStaticMethod1();static void staticMethod2() System.out.println("靜態(tài)方法2");void nonStaticMethod1() System.out.println("非靜態(tài)方法1");staticMethod1();nonStaticMethod2();void nonStaticMethod2() System.out.println("非靜態(tài)方法2");public static v

47、oid main(String args) Example10 e = new Example10();e.nonStaticMethod1 ();運行結果如圖3-17所示。圖3-17 運行結果從運行結果可以看到,程序正常執(zhí)行,這說明在非靜態(tài)方法中既可以方法靜態(tài)方法,也可以訪問非靜態(tài)方法。三、案例總結1、在靜態(tài)方法中只能訪問靜態(tài)方法,在非靜態(tài)方法中可以訪問靜態(tài)方法和非靜態(tài)方法。2、思考一下:在靜態(tài)方法中是否能夠訪問靜態(tài)變量和非靜態(tài)變量?其實和上面的講解一樣,非靜態(tài)變量只能通過對象或者對象的引用變量訪問,而靜態(tài)方法在創(chuàng)建對象之前就可以通過類名直接訪問,因此在靜態(tài)方法中不能訪問非靜態(tài)變量,只能訪問

48、靜態(tài)變量。案例3-10 代碼塊一、案例描述1、 考核知識點編號:00103011名稱:靜態(tài)代碼塊2、 練習目標Ø 理解代碼塊的不同分類Ø 掌握不同代碼塊的作用及其執(zhí)行時機3、 需求分析有時候,需要將某一段關聯(lián)緊密的或者實現(xiàn)了某一功能的代碼封裝的一個代碼塊中。為了讓初學者熟悉代碼塊的應用,本案例將編寫一個包含了靜態(tài)代碼塊,局部代碼塊和構造代碼塊的類,演示不同代碼塊之間的執(zhí)行時機。4、 設計思路(實現(xiàn)原理)1)編寫Example11類,在類中定義一個靜態(tài)代碼塊、一個構造代碼塊、一個無參的構造方法和一個成員方法localBlock(),在localBlock()方法中定義一個局部

49、代碼塊。2)創(chuàng)建Example11類的兩個實例對象,使用Example11類型的變量e1和e2引用,并通過變量e1和e2調用這兩個對象的localBlock()方法。二、案例實現(xiàn)定義Example11類,代碼如下所示:public class Example11 static System.out.println("靜態(tài)代碼塊");System.out.println("構造代碼塊");public Example11() System.out.println("構造方法");void localBlock() System.out.

50、println("局部代碼塊");public static void main(String args) Example11 e1 = new Example11();e1.localBlock();System.out.println("-");Example11 e2 = new Example11();e2.localBlock();運行結果如圖3-18所示。圖3-18 運行結果三、案例總結1、靜態(tài)代碼塊在加載類的時候執(zhí)行,由于類只在第一次使用時被加載,且只加載一次,因此靜態(tài)代碼塊只執(zhí)行一次。從運行結果可以看到,雖然創(chuàng)建了兩個Example10的

51、實例對象,由于Example10類只會加載一次,所以“靜態(tài)代碼塊”只打印一次。在實際開發(fā)中,經常有一些代碼需要在類加載時就執(zhí)行,比如加載數據庫驅動,這些代碼就應該放在靜態(tài)代碼塊中。2、構造代碼塊在創(chuàng)建類的實例對象時執(zhí)行,也就是說每次創(chuàng)建類的實例對象時,都會執(zhí)行一次構造代碼塊。從運行結果可以看到,構造代碼塊優(yōu)先于構造方法執(zhí)行,因此在實際開發(fā)中,可以把重載構造方法中重復的代碼抽取到構造代碼塊中執(zhí)行。3、局部代碼塊定義在方法中,它在方法被調用的時候執(zhí)行。使用局部代碼塊是為了限制變量的生命周期,使變量在使用完畢后被盡快回收,從而節(jié)省內存空間。案例3-11 單例設計模式一、案例描述1、 考核知識點編號:

52、00103012名稱:單例設計模式2、 練習目標Ø 了解什么是單例設計模式Ø 掌握單例設計模式的特點3、 需求分析在程序開發(fā)中,經常需要保證類的實例對象只有一個,這時,可以將類設計為單例設計模式。為了讓初學者熟悉單例設計模式,本案例將編寫一個實現(xiàn)了單例設計模式的類。4、 設計思路(實現(xiàn)原理)1)定義一個類Singleton,為了保證該類只能創(chuàng)建一個實例對象,在類中定義一個私有的構造方法。2)在類中創(chuàng)建一個該類的實例對象,并且定義一個靜態(tài)變量INSTANCE(變量名隨意)引用此實例對象。3)為了防止外界使用Singleton.INSTANCE的方式直接訪問該實例對象,將INS

53、TANCE變量使用private關鍵字修飾為私有,同時提供一個用于返回實例對象的靜態(tài)方法。二、案例實現(xiàn)1、定義Singleton類,在類中定義一個私有,無參的構造方法,代碼如下:public class Singleton private Singleton() 2、創(chuàng)建Singleton的一個實例對象,定義一個私有的靜態(tài)變量INSTANCE引用這個對象,代碼如下所示:public class Singleton private Singleton() private static Singleton INSTANCE = new Singleton();3、定義一個靜態(tài)方法getInstan

54、ce()將實例對象返回,代碼如下:public class Singleton private Singleton() private static Singleton INSTANCE = new Singleton();public static Singleton getInstance() return INSTANCE;4、定義Example12類,在類的main()方法中調用兩次getInstance()方法,獲得兩個Singleton的實例對象,使用“=”比較這兩個對象是否相等,代碼如下所示:public class Example12 public static void ma

55、in(String args) Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 = s2);運行結果如圖3-19所示。圖3-19 運行結果從運行結果可以看到,兩個對象使用“=”比較的結果為 true,說明兩次獲得的是同一個Singleton的實例對象。三、案例總結1、為了更加深刻的理解單例設計模式,下面對單例設計模式的特點進行歸納:l 類中定義一個無參的構造方法,并且聲明為私有l(wèi) 在類的內部創(chuàng)建該類的一個實例對象,使用私有的靜態(tài)變量引用該實例對象l 定義靜態(tài)方法返回該實例對象2、本案例中這種代碼格式的單例設計模式被形象的稱為餓漢式單例設計模式,這是因為在程序中,無論是否需要該類的實例對象,在類加載時都會創(chuàng)建一個實例對象。案例3-12 靜態(tài)內部類成員的定義和訪問一、案例描述1、 考核知識點編號:00103014名稱:靜態(tài)內部類2、 練習目標Ø 理解在靜態(tài)內部類中可以定義靜態(tài)成員和非靜態(tài)成員Ø 掌握訪問靜態(tài)內部類中靜態(tài)成員和非靜態(tài)成員的方式3、 需求分析靜態(tài)內部類中可以定義靜態(tài)成員和非靜態(tài)成員,這兩者的訪問方式有所不

溫馨提示

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

評論

0/150

提交評論