面向对象上补充案例_第1页
面向对象上补充案例_第2页
面向对象上补充案例_第3页
面向对象上补充案例_第4页
面向对象上补充案例_第5页
免费预览已结束,剩余33页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章补充案例案例3定义学生类一、案例描述1、考核知识点编号:00103002 名称:类和对彖2、练习目标掌握类定义的方式掌握如何在类中定义成员变量和成员方法3、需求分析在面向对彖的思想中最核心就是对彖,在程序中创建对彖的前提是需要定义一个类。为了让 初学者掌握类的定义方式,本案例将设计一个表示学生的类,该类具有表示姓名的属性name和 表示年龄的属性age,同时还具有表示说话行为的方法speak(),用于输出学生的姓名和年龄。4、设计思路(实现原理)1) 使用class关键字定义一个表示学生类型的类,类名为Student。2) 在Student类中定义两个成员变量name和age,分别用来表

2、示姓名和年龄。其中,name的数 据类型为Strmg,变量age的数据类型为into3) 在Student类中定义一个表示说话行为的speakQ方法,用于输出学生的姓名和年龄。二、案例实现class StudentString name;int age;void speak()System.out.printin (11 我的名字是 lf+name+,f» 今年"+age+"岁");三、案例总结1、Java语言严格区分人小写,class和Class是不同的,在定义类时只能使用class关键字2、在Student类中,成员变量name是Suing类型,St

3、ring表示一个字符串,后面的章节会详细讲解3、思考一下:自己定义一个手机(Phone)类,在类中定义品牌(brand)和价格(price)属性,定义打电话的 call。方法,代码如下所示public class Phone String brand;double price;void call ()Systemou匕.printin (Hhiz how are you doing'1);案例32同一对象被多个变量引用一、案例描述1、考核知识点编号:00103003 名称:对彖创建与使用2、练习目标掌握如何创建类的对象掌握如何使用两个或者多个变量引用同一个实例对象。3、需求分析在程序中

4、,一个对彖可能在多处使用,这样就可能需要有多个变量来引用这个对彖。为了让 初学者更好地掌握对彖的创建和使用,本案例将基于案例3-1,创建三个学生对彖,它们的引用 变量分别是si、s2和s3,首先分别使用si和s2引用,为name和age赋值,然后调用speakQ方 法,最后将s2变量赋值给S3, S3也调用speakQ方法。4、设计思路(实现原理)1) 编写 ExampleOl 类2) 在main。方法中,创建Student类的第一,个对象,其引用变量为si,使用si调用name和age 变量分别为它们赋值为“张三”和“19”,然后调用speak()方法。3 )创建Student类的第二个对彖

5、,其引用变量为s2,使用s2分别为name和age赋值为“李四” 和“20”,然后调用speak()方法。4) 创建Student类的第三个对象,其引用变量为s3,将s2的值赋给s3,然后使用s3调用speak() 方法。二、案例实现public class ExampleOl public static void main(String args) Student si = new Student();=n 张三”;si age=19;si speak();Student s2 = new Student();s2name十李四s2 age=20; s2 speak();Stu

6、dent s3 = new Student(); s3=s2;s3 speak();运行结果如图3-1所示。-Inlxian名名名s的的的D:我我我aq三四四al>J妙岁罗岁r 9 R 0e 1 2 2apt年年年HPMl图3运行结果三、案例总结1、Student s3 = s2这句代码的作用是将s2引用的内存地址赋值给s3,换句话说,就是使变量s3和s2 引用了同一个Student对彖,因此s3.speak()方法和s2.speak()方法打印的结果相同。为了更加深刻地了解这 句代码的含义,下面通过一张内存图来演示,具体如图32所示。2、可以使用两个或者多个变量引用同一个实例对象,只要

7、通过其中一个变量对该对象的属性进行修 改,使用其它引用变量访问时,访问的都是修改后的属性。案例33类的封装一、案例描述1、考核知识点 编号:00103004 名称:类的封装2、练习目标> 了解为什么要对类进行封装> 了解如何实现类的封装3、需求分析在案例3-2中,si对象的年龄是可以随便赋值的,如果将age的值赋值为-30,显然违背了事 实。为了解决这类问题,我们需要对类进行封装,防止外界对类中的成员变量随意访问。为了让 初学者更好地掌握类的封装,本案例将使用private关键字对成员变量name和age进行私有化, 同时分别提供一个setName(Stnng n)和setAge(

8、mt a)方法用于外界的访问,其中setAge(mt a)中需 要对age进行判断。4、设计思路(实现原理)1) 编写测试类Example02,将属性昭e的值设为-30,演示不合理现象。2) 对Student类进行修改,将name和age属性使用private修饰,然后定义getName()、setName(Stiing 11)、getAgeQ和setAge(iiit a)四个对外访问name和age的方法。3) 在setAge(int a)方法中对传入的参数进行检查,如呆输入值为负数,贝【J打印出“设置的年龄不 合法”,如果不为负数,才将其设置为age属性的值。4) 对Example02类进

9、行修改,在mainO方法中创建Student类的实例对彖,通过调用对象的 setName(Sumg n)和setAge(int a)方法来设置的name属性和age属性值,并调用speak()方法。二、案例实现1、定义Example02类,代码如F所示: public class Example02 publie static void main(S匸args)Student si = new Srudent();sl name = ”小新slage = -30;si speak();运行结果如图33所示。国管理员:命令提示得x|D =amplePackaje chaptei*03 >J

10、aua Example02 我的名字是小新,今年70岁2图33运行结果从上图可以看出,当将age的值设置为-30后,程序不会报错,但却违背了现实。 2、对Student类进行封装,其代码如下:class Student private String name ='张三";private int age = 19;publie String getName()return name;public void setName(String n) name = n;public int getAge()return age;public void setAge(int a) /对传入

11、的参数进行检査if(a < 0) System.out.println(n设置的年龄不合法”);elseage = a;void speak()System. out.printin ("我的名字址” + name + ",今年” + age + ”岁public class Example02 public static void main(String args) Student si = new Student();si setName ("小新");si.setAge(-30);si speak ();-|g|x|运行结果如图34所示。D:

12、 sanplePackage char)ter03 >Jaua Example02 ii孵為法今年朋图34运行结果三、案例总结1 Student的name和age属性使用private关键字修饰为私有后,在Exainple02类中不能再使用 和si.age的方式访问这两个属性,只能通过public类型的setName(Struig n)和setAge(int a)方法进行访问。 在上面的代码中,调用setAge(mt a)方法时的传入参数为-30,由于参数小于0,会打印出“设置的年龄不 合法”,并不会将负数赋值给age属性。由此可见,只要实现了封装就能对外界的访问进行控制,

13、避免对私 有变量随意修改而引发问题。2、思考一下:定义一个Division类(除法),类中定义两个int类型的私有成员变量dividend(被除数)和 divisor(除数),默认值都为 1。定义四个公有方法 setDividend(iiit niDividend getDividendQsetDivisor(int niDivisor)和getDivisorQ,用于对私有属性进行设置和访问。在setDivisor(mt mDivisor)方法中对传入的参数 进行检查,如果传入值为零,则打印“除数不能为零”,如果不为零,才将其设置为dwisor属性的值。定义ExampleO3类,在类的main

14、O方法中创建Division对象,分别调用setDividend(int mDividend)和 setDivisor(int mDivisor)方法给两个私有属性dividend和divisor赋值,然后打印出dividend和divisor的结 果。定义Division类,代码如下所示:public class Division private int dividend = 1;private int divisor = 1;publie void setDividend(int mDividend) dividend = mDividend;public in*t getDividend

15、 ()return dividend;publie void setDivisor(int mDivisor)if (mDivisor = 0)System, out. print In (H 除数不能为零"); else (divisor = mDivisor;publie int getDivisor()return divisor;(2)定义Example03类,代码如K所示:public class Example03public static void main(String args)Division division = new Division();division

16、szDividend (10);division setDivisor(0);int dividend = division getDividend);int divisor = division gecDivisor(); Systemoutprintln(dividend / divisor);运行结果如图35所示。武管理员.命令提示奇-|n|x|D: samplePackage Schapter03 >Jaua Example03 除数不能为零3IM_i图35运行结果从运行结果可以看出,由于实现了 Division类的封装,在setDivisor(int niDivision)方法

17、中对传入的值 进行检查,从而避免程序中出现除数为0的错误。案例3-4定义有参的构造方法一、案例描述1、考核知识点编号:00103005名称:构造方法的定义2、练习目标> 掌握有参构造方法的定义方式>理解系统会自动分配无参构造方法的情况3、需求分析如果希塑在创建对彖的时候直接为其属性赋值,可以定义有参的构造方法。有参构造方法指 的是在初始化对彖时,接受外部传入的值并赋给对象的属性。为了让初学者掌握有参构造方法的 用法,本案例将演示如何使用有参构造方法完成对象属性的初始化。4、设计思路(实现原理)1) 定义一个Student类,该类有一个age属性,在类中定义一个有参数的构造方法,该参

18、数用 于为age属性赋值。2)编写一个测试类Example04,在main。方法中通过有参构造方法创建一个对彖。3)打印该对彖age属性的值。二、案例实现1、对Student类进行修改,代码如下所示:class Student int age;public Student(int mAge) age = mAge;2、定义Example04类,代码如下所示:public class Example04 public static void main(String args)Student si = new Student(20);System .out p rintln ("age

19、屈性的值为:n+sl age);运行结果如图3-6所示。国管理员:命令提示净x|I: KcamplePackaje chapte>*03 >jaua Example04 age属性的值为:203d图36运行结果三、案例总结1、从运行结呆可以看出,new Student(20)语句调用了有参的构造方法Studeiit(int mAge),动态地将20 传递给了 age属性。和普通方法一样,构造方法中同样可以接收多个参数,只要在使用new关键字创建对 彖时,传入数量相同和类型一致的参数,就可以自动地调用对应的构造方法。2、思考一卞:在Example04的main。方法中是否能够使用ne

20、w Student。创建对象呢?答案是否定的, 因为new SmdentO会调用无参的构造方法,而本案例的Student类中并没有定义无参的构造方法。有些同学肯定会问,之前的Student类都没有定义无参的构造方法,却能使用new SmdentQ创建对彖, 本案例为什么不行呢?这是因为一个类中如果没有定义构造方法,系统会默认为其分配一个方法体为空的 无参构造方法,而一旦定义了构造方法,系统就不再提供默认的构造方法。本案例中由于我们定义了一个 有参的构造方法,所以系统不会默认分配无参的构造方法,此时如果通过new Student。去调用无参的构造 方法,程序就会发生错误。案例35构造方法的重载、

21、案例描述1、考核知识点编号:00103006名称:构造方法重载2、练习目标掌握如何在类中定义重载的构造方法3、需求分析和普通方法一样,构造方法也可以重载。不同的构造方法,可以为不同的属性进行赋值。本 案例将通过创建对象的方式演示不同构造方法的使用方式,并根据构造方法的输出结果对构造方 法的重载进行学习。4、设计思路(实现原理)1) 对Smdent类进行修改,在类中定义三个重载的构造方法,包括无参的构造方法,接收一个String 类型参数的构造方法,接收Strmg类型和mt类型两个参数的构造方法。2) 编写测试类Example05,在main()方法中,分别使用三个重载的构造方法创建三个Stud

22、ent对 彖。二、案例实现1、对Student类进行修改,代码如下所示:class Student public Student()System .outp rintln ("无参白勺构造方法");publie Student(String name) System.out.printin个参数的构造方法“);publie Student(String name, int age) System, outprintin两个参数的构造方法“);2、定义ExampleO5类,代码如下所示:public class Example05 publie static void mai

23、n(S匸ring args)Student31=newStudent();Students2=newStudent("Rose");Students3=newStudent ("Rose'1, 23);运行结果如图3-7所示。-Inlxixc法法 "方方 ka法造造 ac方鳥 ep适的的HP图37运行结果三、案例总结一个类中可以定义多个重载的构造方法,在创建对象时,根据传入参数的不同会调用相应的构造方法。案例36 this关键字访问构造方法、案例描述1、考核知识点编号:00103007名称:this关键字的使用2、练习目标掌握如何在构造方法中使用

24、this关键字访问重载的构造方法3、需求分析如果一个类中定义了多个重载的构造方法,为了避免在重载的构造方法中重复书写代码,可 以在一个构造方法中使用this关键字调用其它的构造方法。为了让初学者掌握tlus关键字访问构 造方法的用法,本案例将演示如何使用this关键字调用其他的构造方法。4、设计思路(实现原理)1)在Student类中创建多个重载的构造方法,包括无参的构造方法和一个参数的构造方法,以及两个参数的构造方法。2) 在一个参数的构造方法中使用this关键字调用无参构造方法,在两个参数的构造方法中调用 一个参数的构造方法。3) 编写测试类Example06,在mam()方法中,调用两个

25、参数的构造方法创建对彖,演示构造方 法的执行顺序。二、案例实现1、对Smdent类进行修改,代码如下所示:class Student public Student()System .outp rinrln ("无参白勺构造方法");public Student(String name) this ();System, outprintin (”一个参数的构造方法”);public Student(String name, int age) this(name);System, outprintin (”两个参数的构造方法”);2、定义Example06类,代码如F所示:pu

26、blic class Example06 public static void main(String args)Student si = new Student ("Jack11, 22);运行结果如图38所示。武管理员.命令提示袴-|n|x|D : Xs amp lc Pac hay e Sc hapt e r 03 > Java Example 06 等瞬髓方法3两人参数的松适方法_i三、案例总结1、从运行结果可以看出,三个构造方法都被调用了,为了更加清楚地了解三个构造方法的执行顺序, 下面通过一张图例进行说明,如图39所示。执行顺序Student()this()Stud

27、ent(S ring name)this(name)newStudent(,Jack,23)>Student(String namejnt age)涉图39构造方法的执行顺序2、在构造方法中,使用this调用重载构造方法的代码必须放在第一行,否则程序不能通过编译,这 就限定了在一个构造方法中只能调用一次重载的构造方法。3、在构造方法中可以通过this.方法名(参数)的方式调用普通的成员方法,但是在普通的成员方法 中不能使用this(参数)的方式来调用构造方法。案例3-7垃圾回收机制一、案例描述1、考核知识点编号:00103008 名称:垃圾回收机制2、练习目标>掌握垃圾回收机制的特

28、点> 掌握垃圾回收相关的方法3、需求分析垃圾对彖会占用一定的内存空间,当垃圾对彖积累到一定程度后,Java虚拟机会自动进行垃 圾回收。但是,如果希望程序可以及时通知Java虎拟机回收垃圾对彖,可以通过System.gc()方法 强制启动垃圾回收器回收垃圾。为了让初学者熟悉垃圾回收机制,本案例将演示如何通过 Svstem.gcQ方法强制启动垃圾回收器回收垃圾。4、设计思路(实现原理)1)对Student类进行修改,在类中对fiiializeQ方法进行重写。2)编写测试类Example07,创建若干个Student对象,然后调用System.gc()方法通知垃圾回收 期回收垃圾,为了确保可以

29、看到垃圾回收的过程,可以在类中编写一个简单的循环语句,延 长程序执行时间。二、案例实现1、对Student类进行修改,代码如下所示:class Student public void finalize()System, out. printin (”垃圾对象被回收了”);2、定义Example07类,代码如下所示: public class Example07 publie static void main(S匸args) new Student(); new Student();System gc();for (int i = 0; i < 1000000; i+)/延长程序结束时间运

30、行结果如图310所示。-|n|x|D: sanplePackage char)ter03 >Jaua Example07图3-10运行结果三、案例总结1、从运行结果可以看到,两个Student对彖的fliiaUzeO方法都被调用了,这表示两个对彖作为垃圾被 回收了。如果把System.gc()这行代码注释,会发现命令行窗I I不会打印任何内容,这说明对彖在变成垃圾 后不会被立即回收,同时也验证了 System.gcQ方法的作用。2、由于System.gc()方法只是通知Java虚拟机尽快进行垃圾回收,这意味着垃圾回收器也可能不会马 上运行,因此,在程序的最后使用了一个for循环来延长程序

31、运行的时间,从而确保能够看到垃圾对象被 回收的过程。3、Student 类中定义的 finalize()方法其签名必须是 public(piotected) void fiiialize()tluow Tluowable , 这样做的原因会涉及到后面的一些知识,比如类的继承、Object类、方法的重写、异常等等,同学们在学 完这些内容后就会明白其中的道理。案例3-8静态变量一、案例描述1、考核知识点编号:00103009名称:静态变量2、练习目标> 了解静态变量的作用>掌握静态变量的定义和使用方式3、需求分析当多个对彖存储的数据相同时,可以使用静态变量的方式存储。例如,有一个Smd

32、ent类具 有name、className属性,请根据该类创建出三个Student对象,并将这些对象的className值 都设置为“三年级二班”。4、设计思路(实现原理)1)定义Student类,并在类中定义name和className属性。2)编写测试类ExainpleOS,在main()方法中创建三个学生对象,并分别为这些对彖的name和 className属性赋值,然后输出这些对彖的name和className值。3 )对Student类进行修改,将className定义为静态变量。4)修改测试类,在main。方法中使用Student.className ="三年级二班”语句

33、为静态变量 className进行赋值,然后输出这些对彖的name和className值。为了更好地理解Student类中静态变量className和Student实例对象的关系,I、面通过一个 图例进行演示,如图3-11所示:图3-11静态变量与实例对象的关系二、案例实现1、定义Student类,代码如下所示:class StudentString name;String className;2、定义ExampleOS类,代码如F所示:public class Example08 public static void main(String args)Student si = new S*c

34、udent ();si. name = ”张三si. className = ”三年级二班 SStudent s2 = new S*cudent ();s2 . name = ”李四s2. className = ”三年级二班 SStudent s3 = new S*cudent ();s 3. name = ,f 王五s3. className = ”三年级二班SSystem.out.println "我的名字是"+ slname + ",来 1勺"+ slclassName);System.out.println "我的名字是"+

35、 s2name + ",来+ s2className);System.out.println "我的名字是"+ $3name + ",来+ s3className);a I f I J笏刊砂 拠级级级 te年年年 ap三三三 ch<Tn<TTrnn 7R工、R e ?g ka三四五pl宀i 丁am名名名 s的的的D:我我我运行结果如图3J2所示。-InXzJ图32运行结果3、对Student类进行修改,代码如下所示:class Student String name;static String className;4、对ExampleOS类进

36、行修改,代码如下所示:public class Example08 public static void main(String args)Student. className ="三年级二班";Student si = new Student();si. name = ”张三 SStudent s2 = new Student();s2 . name = ”李四”;Student s3 = new Student();s 3. name = ”王五System.out.println ("我的名字是"+ slname + ",来Fl"

37、; + slclassName);System.out.println ("我的名字是"+ s2name + ",来Fl" + s2className);System.out.println ("我的名字是"+ s3name + ",来Fl" + s3className);运行结果如图313所示。CEPyJ 电71 pl壬王子 all名名名 爲的的a il Ti J刊到刊 3二迂 re级级级 te年年年 5三三三 cl自自/冃 7工、R畋 e ? ?9 竺二四五Example08ai图33运行结果三、案例总结1、本

38、案例中,三个Student对彖的classNaine属性值均为“三年级二班”,对于这样的相同数据,没有 必要在每个对象中都开辟一块空间存储,完全可以在内存中只用一块空间存储,并被一个类的所有实例对 象所共享。在Java中提供了一个static关键字,使用static关键字修饰的成员变量称为静态变量,静态变 量能被该类所有实例对彖共享。2、静态变量可以使用“类名.静态方法名”的方式访问,也可以通过“对彖引用变量.静态方法名”的 方式访问,例如本例中的静态变量className,通过Student.className或者s2.className这两种方式访问 都是可以的,不过更推荐使用前一种方式。

39、3、思考一卞:定义一个Person类,在类中定义两个String类型的成员变量name和nationalitv(国籍), 变量nationality使用static关键字修饰为静态变量,其值为“中国”。定义Example09类,在类的main。方法中创建Person类的两个实例对彖,并打印出这两个对象的姓名 和国籍。(1) 定义Person类,代码如下所示:class Person String name;static String nationality = "中国(2) 定义Exainple09类,代码如下所示:public class ExampleO9public stati

40、c void main(String args)Person lily = new Person ();lily, name = ”丽丽”;Person lucy = new Person (); = ”露西Systemoutprintln (lilyname + "的国籍是" + lilynationality); Systemoutprintln (lucyname + "的国籍是" + lucynationality);运行结果如图314所示。图34运行结果案例3-9静态方法中访问类的成员一、案例描述1、考核知识点编号:00103

41、010名称:静态方法2、练习目标> 了解在静态方法中只能访问类的静态成员,而不能访问非静态成员。3、需求分析在程序中经常会调用方法,但静态方法之间、静态方法和非静态方法之间,它们是否能够互 相调用呢?请编写一个测试类,在类中定义若干个静态方法和非静态方法,通过方法之间的相互 调用,演示静态方法和非静态方法的调用情况。4、设计思路(实现原理)1) 编写Example 10类,在类中定义两个静态方法staticMethodl()> staticMethod2(),两个非静态 方法 nonStaticMethod 1Q nonStaticMethod2Q2) 在Example 10类中,

42、针对定义的四个方法进行互相调用,观察调用情况。二、案例实现1、定义Example 10类,在类中定义上述的四个方法和一个main。方法,代码如卞所示:public class Example10static void staticMethodl()(System .out p rintln ("静态方法 1");static void staticMethod2()System out println ("静态方法 2");void nonStaticMethodl()System .out p rintln ("WE 静态方法 I1'

43、);void nonStaticMethod2()System .out p rintln ("WE 静态方法 2");public static void main(String args)2、对静态方法staticMethodlQ进行修改,在方法中访问静态方法staticMethod2Qc在main()方法中调 用静态方法staticMethodlQ,代码如下所示:public class Example10static void staticMethodl()(System .out p rintln ("静态方法 1");s,caticMe,ch

44、od2 ();static void staticMethod2()System out println ("静态方法 2");void nonStaticMethodl()System .out p rintln ("WE 静态方法 lu);void nonS"CaticMethod2 ()System .out p rintln ("WE 静态方法 21');public static void main(String args)Example10 sraticMerhodl();运行结果如图315所示。I>"3am

45、plcPachac(cSchaptcr03>java Example 10图3J5运行结果从运行结果可以看到,程序正常执行,这说明在静态方法中可以访问静态方法。3、对静态方法staticMethodlQ进行修改,在方法中访问非静态方法nonStaticMethod 1 (),代码如卜所public class Example10 static void staticMethodl()System .out p rinrln ("静态方法 1"); nonStaticMethodl();static void staticMethod2()Systemou匕prinrl

46、n ("静态方法2");void nonSraticMethodl()System .out p rinrln ("WE 静态方法 I1');void nonS"CaticMethod2 ()System .out p rinrln ("WE 静态方法 21');public static void main(String args)Example10 sraticMerhodl();运行结果如图316所示。-|n|x|P : sanp le Pac hage c hapt e rM3 >Jauac Examp lei k

47、lExamplelB. jaua=4:错误,无憾从静态上卞文中弓I用非静态方法nonSt aticMechodlC)nonStaticMethodl<>;图3J6运行结果从错误提示信息可以看到,发生错误的原因是在静态方法中访问了非静态的方法。4、在 staticMethodlQ方法中,将代码"nonStaticMethod 1 ()v注释掉,并对非静态方法 nonStaticMethod 1 () 进行修改,在方法中分别调用静态方法statiMetliodlQ和非静态方法nonStaticMethod2()0在main()方法中 创建Example09的实例对彖,调用no

48、nStaticMethod 1()方法,代码如下所示:public class Example10static void staticMethodl()(System .out p rintln ("静态方法 1");/ nonStaticMethodl();static void staticMethod2()System out println ("静态方法 2");void nonSraticMethodl()System .out p rintln ("WE 静态方法 I1');s匸aticMerhodl(); nonStati

49、cMethod2();void nonS*caticMethod2 ()System .out p rintln ("WE 静态方法 2");public s匸atic void main(String args)Example10 e = new ExamplelO(); e nonStaricMethodl ();运行结果如图317所示。图3J7运行结果从运行结果可以看到,程序正常执行,这说明在非静态方法中既可以方法静态方法,也可以访问非静 态方法。三、案例总结1、在静态方法中只能访问静态方法,在非静态方法中可以访问静态方法和非静态方法。2、思考一下:在静态方法中是否能

50、够访问静态变量和非静态变量?其实和上面的讲解一样,非静态 变量只能通过对彖或者对彖的引用变量访问,而静态方法在创建对象之前就可以通过类名直接访问,因此 在静态方法中不能访问非静态变量,只能访问静态变量。案例310代码块一、案例描述1、考核知识点编号:00103011 名称:静态代码块2、练习目标> 理解代码块的不同分类>掌握不同代码块的作用及其执行时机3、需求分析有时候,需要将某一段关联紧密的或者实现了某一功能的代码封装的一个代码块中。为了让 初学者熟悉代码块的应用,本案例将编写一个包含了静态代码块,局部代码块和构造代码块的类, 演示不同代码块之间的执行时机。4、设计思路(实现原理

51、)1)编写Example 11类,在类中定义一个静态代码块、一个构造代码块、一个无参的构造方法和一个成员方法localBlockQ,在localBlocky方法中定义一个局部代码块。2)创建Example 11类的两个实例对彖,使用Example 11类型的变量el和e2引用,并通过变量el和e2调用这两个对象的localBlockQ方法。二、案例实现定义Example 11类,代码如下所示:public class Example11 static System .out p rintln ("静态彳弋码块");System.out.println (”构造彳弋码块”;p

52、ublic Examplell()Systemou匕println 构造方法");void localBlock()(System, out. print In ("局部代码块");public static void main(String args)Example11 el = new Examplell();ellocalBlock();n);System out println("Example11 e2 = new Examplell(); e2 localBlock();运行结果如图3-18所示。图3-18运行结果三、案例总结1、静态代码块在

53、加载类的时候执行,由于类只在第一次使用时被加载,且只加载一次,因此静态代 码块只执行一次。从运行结果可以看到,虽然创建了两个Example 10的实例对象,由于Example 10类只会 加载一次,所以“静态代码块”只打印一次。在实际开发中,经常有一些代码需要在类加载时就执行,比如加载数据库驱动,这些代码就应该放在 静态代码块中。2、构造代码块在创建类的实例对彖时执行,也就是说每次创建类的实例对象时,都会执行一次构造 代码块。从运行结果可以看到,构造代码块优先于构造方法执行,因此在实际开发中,可以把重载构造方 法中重复的代码抽取到构造代码块中执行。3、局部代码块定义在方法中,它在方法被调用的时

54、候执行。使用局部代码块是为了限制变量的生命 周期,使变量在使用完毕后被尽快回收,从而节省内存空间。案例3巧单例设计模式 %案例描述1、考核知识点编号:00103012名称:单例设计模式2、练习目标> 了解什么是单例设计模式>掌握单例设计模式的特点3、需求分析在程序开发中,经常需要保证类的实例对彖只有一个,这时,可以将类设计为单例设计模式。 为了让初学者熟悉单例设计模式,本案例将编写一个实现了单例设计模式的类。4、设计思路(实现原理)1)定义一个类Singleton,为了保证该类只能创建一个实例对象,在类中定义一个私有的构造方法。2)在类中创建一个该类的实例对彖,并且定义一个静态变量

55、INSTANCE(变量名随意)引用此实例 对象。3 )为了防止外界使用Singleton.INSTANCE的方式直接访问该实例对象,将INSTANCE变量使用 private关键字修饰为私有,同时提供一个用于返回实例对象的静态方法。二、案例实现1、定义Singleton类,在类中定义一个私有,无参的构造方法,代码如下:public class Singleron private Singleton()2、创建Smgleton的一个实例对彖,定义一个私有的静态变量INSTANCE引用这个对象,代码如下所public class Singleton priva匸十 Singleton()private static Singleton INSTANCE = new Singleton();3、定义一个静态方法getliistanceO将实例对象返回,代码如下:public class Singleton priva匸十 Singleton()private static Singleton INSTANCE = new Singleton();public static Singleton getlnstance()ret

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论