第3章补充案例.docx

上传人:b****5 文档编号:7694168 上传时间:2023-01-25 格式:DOCX 页数:23 大小:138.81KB
下载 相关 举报
第3章补充案例.docx_第1页
第1页 / 共23页
第3章补充案例.docx_第2页
第2页 / 共23页
第3章补充案例.docx_第3页
第3页 / 共23页
第3章补充案例.docx_第4页
第4页 / 共23页
第3章补充案例.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

第3章补充案例.docx

《第3章补充案例.docx》由会员分享,可在线阅读,更多相关《第3章补充案例.docx(23页珍藏版)》请在冰豆网上搜索。

第3章补充案例.docx

第3章补充案例

第3章補充案例

案例3-1定義學生類

一、案例描述

1、考核知識點

編號:

00103002

名稱:

類和對象

2、練習目標

掌握類定義的方式

掌握如何在類中定義成員變量和成員方法

3、需求分析

在面向对象的思想中最核心就是对象,在程序中创建对象的前提是需要定义一个类。

为了让初学者掌握类的定义方式,本案例将设计一个表示学生的类,该类具有表示姓名的属性name和表示年龄的属性age,同时还具有表示说话行为的方法speak(),用于输出学生的姓名和年龄。

4、設計思路(實現原理)

1)使用class關鍵字定義一個表示學生類型的類,類名為Student。

2)在Student類中定義兩個成員變量name和age,分別用來表示姓名和年齡。

其中,name的數據類型為String,變量age的數據類型為int。

3)在Student类中定义一个表示说话行为的speak()方法,用于输出学生的姓名和年龄。

二、案例實現

classStudent{

Stringname;

intage;

voidspeak(){

System.out.println("我的名字是"+name+",今年"+age+"歲");

}

}

三、案例總結

1、Java語言嚴格區分大小寫,class和Class是不同的,在定義類時只能使用class關鍵字

2、在Student類中,成員變量name是String類型,String表示一個字符串,后面的章節會詳細講解

3、思考一下:

自己定义一个手机(Phone)类,在类中定义品牌(brand)和价格(price)属性,定义打电话的call()方法,代码如下所示

publicclassPhone{

Stringbrand;

doubleprice;

voidcall(){

System.out.println("hi,howareyoudoing");

}

}

案例3-2同一對象被多個變量引用

一、案例描述

1、考核知識點

編號:

00103003

名稱:

對象創建與使用

2、練習目標

掌握如何創建類的對象

掌握如何使用兩個或者多個變量引用同一個實例對象。

3、需求分析

在程序中,一个对象可能在多处使用,这样就可能需要有多个变量来引用这个对象。

为了让初学者更好地掌握对象的创建和使用,本案例将基于案例3-1,创建三个学生对象,它们的引用变量分别是s1、s2和s3,首先分别使用s1和s2引用,为name和age赋值,然后调用speak()方法,最后将s2变量赋值给s3,s3也调用speak()方法。

4、設計思路(實現原理)

1)編寫Example01類

2)在main()方法中,创建Student类的第一个对象,其引用变量为s1,使用s1调用name和age变量分别为它们赋值为“張三”和“19”,然后调用speak()方法。

3)創建Student類的第二個對象,其引用變量為s2,使用s2分別為name和age賦值為“李四”和“20”,然后调用speak()方法。

4)创建Student类的第三个对象,其引用变量为s3,将s2的值赋给s3,然后使用s3调用speak()方法。

二、案例實現

publicclassExample01{

publicstaticvoidmain(String[]args){

Students1=newStudent();

s1.name="張三";

s1.age=19;

s1.speak();

Students2=newStudent();

s2.name="李四";

s2.age=20;

s2.speak();

Students3=newStudent();

s3=s2;

s3.speak();

}

}

運行結果如圖3-1所示。

图3-1運行結果

三、案例總結

1、Students3=s2这句代码的作用是将s2引用的内存地址赋值给s3,换句话说,就是使变量s3和s2引用了同一个Student对象,因此s3.speak()方法和s2.speak()方法打印的结果相同。

通过一张内存图来演示,具体如图3-2所示。

图3-2內存圖

2、可以使用兩個或者多個變量引用同一個實例對象,只要通過其中一個變量對該對象的屬性進行修改,使用其它引用變量訪問時,訪問的都是修改后的屬性。

案例3-3類的封裝

一、案例描述

1、考核知識點

編號:

00103004

名稱:

類的封裝

2、練習目標

了解為什么要對類進行封裝

了解如何實現類的封裝

3、需求分析

在案例3-2中,s1對象的年齡是可以隨便賦值的,如果將age的值賦值為-30,顯然違背了事實。

為了解決這類問題,我們需要對類進行封裝,防止外界對類中的成員變量隨意訪問。

為了讓初學者更好地掌握類的封裝,本案例將使用private關鍵字對成員變量name和age進行私有化,同時分別提供一個setName(Stringn)和setAge(inta)方法用于外界的訪問,其中setAge(inta)中需要對age進行判斷。

4、設計思路(實現原理)

1)編寫測試類Example02,將屬性age的值設為-30,演示不合理現象。

2)對Student類進行修改,將name和age屬性使用private修飾,然后定义getName()、setName(Stringn)、getAge()和setAge(inta)四个对外访问name和age的方法。

3)在setAge(inta)方法中对传入的参数进行检查,如果输入值为负数,则打印出“設置的年齡不合法”,如果不為負數,才將其設置為age屬性的值。

4)对Example02类进行修改,在main()方法中创建Student类的实例对象,通过调用对象的setName(Stringn)和setAge(inta)方法来设置的name属性和age属性值,并调用speak()方法。

二、案例實現

1、定義Example02類,代碼如下所示:

publicclassExample02{

publicstaticvoidmain(String[]args){

Students1=newStudent();

s1.name="小新";

s1.age=-30;

s1.speak();

}

}

運行結果如圖3-3所示。

图3-3運行結果

從上圖可以看出,當將age的值設置為-30后,程序不會報錯,但卻違背了現實。

2、對Student類進行封裝,其代碼如下:

classStudent{

privateStringname="張三";

privateintage=19;

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringn){

name=n;

}

publicintgetAge(){

returnage;

}

publicvoidsetAge(inta){

//對傳入的參數進行檢查

if(a<0){

System.out.println("设置的年龄不合法");

}else{

age=a;

}

}

voidspeak(){

System.out.println("我的名字是"+name+",今年"+age+"岁");

}

}

publicclassExample02{

publicstaticvoidmain(String[]args){

Students1=newStudent();

s1.setName("小新");

s1.setAge(-30);

s1.speak();

}

}

运行结果如图3-4所示。

图3-4运行结果

三、案例总结

1、Student的name和age属性使用private关键字修饰为私有后,在Example02类中不能再使用s1.name和s1.age的方式访问这两个属性,只能通过public类型的setName(Stringn)和setAge(inta)方法进行访问。

在上面的代码中,调用setAge(inta)方法时的传入参数为-30,由于参数小于0,会打印出“设置的年龄不合法”,并不会将负数赋值给age属性。

由此可见,只要实现了封装就能对外界的访问进行控制,避免对私有变量随意修改而引发问题。

2、思考一下:

定义一个Division类(除法),类中定义两个int类型的私有成员变量dividend(被除数)和

divisor(除数),默认值都为1。

定义四个公有方法setDividend(intmDividend)、getDividend()、setDivisor(intmDivisor)和getDivisor(),用于对私有属性进行设置和访问。

在setDivisor(intmDivisor)方法中对传入的参数进行检查,如果传入值为零,则打印“除数不能为零”,如果不为零,才将其设置为divisor属性的值。

定义Example03类,在类的main()方法中创建Division对象,分别调用setDividend(intmDividend)和setDivisor(intmDivisor)方法给两个私有属性dividend和divisor赋值,然后打印出dividend和divisor的结果。

(1)定义Division类,代码如下所示:

publicclassDivision{

privateintdividend=1;

privateintdivisor=1;

publicvoidsetDividend(intmDividend){

dividend=mDividend;

}

publicintgetDividend(){

returndividend;

}

publicvoidsetDivisor(intmDivisor){

if(mDivisor==0){

System.out.println("除数不能为零");

}else{

divisor=mDivisor;

}

}

publicintgetDivisor(){

returndivisor;

}

}

(2)定义Example03类,代码如下所示:

publicclassExample03{

publicstaticvoidmain(String[]args){

Divisiondivision=newDivision();

division.setDividend(10);

division.setDivisor(0);

intdividend=division.getDividend();

intdivisor=division.getDivisor();

System.out.println(dividend/divisor);

}

}

运行结果如图3-5所示。

图3-5运行结果

从运行结果可以看出,由于实现了Division类的封装,在setDivisor(intmDivision)方法中对传入的值进行检查,从而避免程序中出现除数为0的错误。

案例3-4定义有参的构造方法

一、案例描述

1、考核知识点

编号:

00103005

名称:

构造方法的定义

2、练习目标

掌握有参构造方法的定义方式

理解系统会自动分配无参构造方法的情况

3、需求分析

如果希望在创建对象的时候直接为其属性赋值,可以定义有参的构造方法。

有参构造方法指的是在初始化对象时,接受外部传入的值并赋给对象的属性。

为了让初学者掌握有参构造方法的用法,本案例将演示如何使用有参构造方法完成对象属性的初始化。

4、设计思路(实现原理)

1)定义一个Student类,该类有一个age属性,在类中定义一个有参数的构造方法,该参数用于为age属性赋值。

2)编写一个测试类Example04,在main()方法中通过有参构造方法创建一个对象。

3)打印该对象age属性的值。

二、案例实现

1、对Student类进行修改,代码如下所示:

classStudent{

intage;

publicStudent(intmAge){

age=mAge;

}

}

2、定义Example04类,代码如下所示:

publicclassExample04{

publicstaticvoidmain(String[]args){

Students1=newStudent(20);

System.out.println("age属性的值为:

"+s1.age);

}

}

运行结果如图3-6所示。

图3-6运行结果

三、案例总结

1、从运行结果可以看出,newStudent(20)语句调用了有参的构造方法Student(intmAge),动态地将20传递给了age属性。

和普通方法一样,构造方法中同样可以接收多个参数,只要在使用new关键字创建对象时,传入数量相同和类型一致的参数,就可以自动地调用对应的构造方法。

2、思考一下:

在Example04的main()方法中是否能够使用newStudent()创建对象呢?

答案是否定的,因为newStudent()会调用无参的构造方法,而本案例的Student类中并没有定义无参的构造方法。

有些同学肯定会问,之前的Student类都没有定义无参的构造方法,却能使用newStudent()创建对象,本案例为什么不行呢?

这是因为一个类中如果没有定义构造方法,系统会默认为其分配一个方法体为空的无参构造方法,而一旦定义了构造方法,系统就不再提供默认的构造方法。

本案例中由于我们定义了一个有参的构造方法,所以系统不会默认分配无参的构造方法,此时如果通过newStudent()去调用无参的构造方法,程序就会发生错误。

案例3-5构造方法的重载

一、案例描述

1、考核知识点

编号:

00103006

名称:

构造方法重载

2、练习目标

掌握如何在类中定义重载的构造方法

3、需求分析

和普通方法一样,构造方法也可以重载。

不同的构造方法,可以为不同的属性进行赋值。

本案例将通过创建对象的方式演示不同构造方法的使用方式,并根据构造方法的输出结果对构造方法的重载进行学习。

4、设计思路(实现原理)

1)对Student类进行修改,在类中定义三个重载的构造方法,包括无参的构造方法,接收一个String类型参数的构造方法,接收String类型和int类型两个参数的构造方法。

2)编写测试类Example05,在main()方法中,分别使用三个重载的构造方法创建三个Student对象。

二、案例实现

1、对Student类进行修改,代码如下所示:

classStudent{

publicStudent(){

System.out.println("无参的构造方法");

}

publicStudent(Stringname){

System.out.println("一个参数的构造方法");

}

publicStudent(Stringname,intage){

System.out.println("两个参数的构造方法");

}

}

2、定义Example05类,代码如下所示:

publicclassExample05{

publicstaticvoidmain(String[]args){

Students1=newStudent();

Students2=newStudent("Rose");

Students3=newStudent("Rose",23);

}

}

运行结果如图3-7所示。

图3-7运行结果

三、案例总结

一个类中可以定义多个重载的构造方法,在创建对象时,根据传入参数的不同会调用相应的构造方法。

案例3-6this关键字访问构造方法

一、案例描述

1、考核知识点

编号:

00103007

名称:

this关键字的使用

2、练习目标

掌握如何在构造方法中使用this关键字访问重载的构造方法

3、需求分析

如果一个类中定义了多个重载的构造方法,为了避免在重载的构造方法中重复书写代码,可以在一个构造方法中使用this关键字调用其它的构造方法。

为了让初学者掌握this关键字访问构造方法的用法,本案例将演示如何使用this关键字调用其他的构造方法。

4、设计思路(实现原理)

1)在Student类中创建多个重载的构造方法,包括无参的构造方法和一个参数的构造方法,以及两个参数的构造方法。

2)在一个参数的构造方法中使用this关键字调用无参构造方法,在两个参数的构造方法中调用一个参数的构造方法。

3)编写测试类Example06,在main()方法中,调用两个参数的构造方法创建对象,演示构造方法的执行顺序。

二、案例实现

1、对Student类进行修改,代码如下所示:

classStudent{

publicStudent(){

System.out.println("无参的构造方法");

}

publicStudent(Stringname){

this();

System.out.println("一个参数的构造方法");

}

publicStudent(Stringname,intage){

this(name);

System.out.println("两个参数的构造方法");

}

}

2、定义Example06类,代码如下所示:

publicclassExample06{

publicstaticvoidmain(String[]args){

Students1=newStudent("Jack",22);

}

}

运行结果如图3-8所示。

图3-8运行结果

三、案例总结

1、从运行结果可以看出,三个构造方法都被调用了,为了更加清楚地了解三个构造方法的执行顺序,下面通过一张图例进行说明,如图3-9所示。

图3-9构造方法的执行顺序

2、在构造方法中,使用this调用重载构造方法的代码必须放在第一行,否则程序不能通过编译,这就限定了在一个构造方法中只能调用一次重载的构造方法。

3、在构造方法中可以通过this.方法名([参数…])的方式调用普通的成员方法,但是在普通的成员方法中不能使用this([参数…])的方式来调用构造方法。

案例3-7静态变量

一、案例描述

1、考核知识点

编号:

00103009

名称:

静态变量

2、练习目标

了解静态变量的作用

掌握静态变量的定义和使用方式

3、需求分析

当多个对象存储的数据相同时,可以使用静态变量的方式存储。

例如,有一个Student类具有name、className属性,请根据该类创建出三个Student对象,并将这些对象的className值都设置为“三年级二班”。

4、设计思路(实现原理)

1)定义Student类,并在类中定义name和className属性。

2)编写测试类Example08,在main()方法中创建三个学生对象,并分别为这些对象的name和className属性赋值,然后输出这些对象的name和className值。

3)对Student类进行修改,将className定义为静态变量。

4)修改测试类,在main()方法中使用Student.className=“三年级二班”语句为静态变量className进行赋值,然后输出这些对象的name和className值。

为了更好地理解Student类中静态变量className和Student实例对象的关系,下面通过一个图例进行演示,如图3-10所示:

图3-10静态变量与实例对象的关系

二、案例实现

1、定义Student类,代码如下所示:

classStudent{

Stringname;

StringclassName;

}

2、定义Example08类,代码如下所示:

publicclassExample08{

publicstaticvoidmain(String[]args){

Students1=newStudent();

s1.name="张三";

s1.className="三年级二班";

Students2=newStudent();

s2.name="李四";

s2.className="三年级二班";

Students3=newStudent();

s3.name="王五";

s3.className="三年级二班";

System.out.println("我的名字是"+s1.name+",来自"+s1.className);

System.out.println("我的名字是"+s2.name+",来自"+s2.className);

System.out.println("我的名字是"+s3.name+",来自"+s3.className);

}

}

运行结果如图3-11所示。

图3-11运行结果

3、对Student类进行修改,代码如下所示:

classStudent{

Stringname;

staticStringclassName;

}

4、对Example08类进行修改,代码如下所示:

publicclassExample08{

publicstaticvoidmain(String[]args){

Student.className="三年级二班";

Students1=newStudent();

s1.name="张三";

Students2=newStudent();

s2.name="李四";

Students3=newStudent();

s3.name="王五";

System.out.println("我的名字是"+s1.name+",来自"+s1.className);

System.out.println("我的名字是"+s2.name+",来自"+s2.className);

System.out.print

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1