任务二:借书卡程序设计
单元二:面向对象程序设计
教学目标
•知识目标
–类的方法组成部分;
–定义和使用类的方法;
–变量作用域;
–定义包和导入包的关键字;
–构造方法实现对象成员的初始化;
–方法重载;
–对构造方法进行重载。
•能力目标
–能会定义和使用类的方法;
–能会正确理解变量的作用域;
–能会使用包组织Java工程;
–运用构造方法完成对象实例化;
–能会正确区分和使用方法重载。
教学内容
任务陈述
知识准备
任务实施
任务拓展
任务实训
任务描述:
借书卡是学生日常生活重要组成部分。每张借书卡信息包含账号、持卡人姓名、身份证号码、地址、已借书数、可借书数、本次借书数、本次还书数。使用借书卡还可以借书、还书和查询。要求:根据持卡人不同操作,显示不同信息。当借书操作后,显示本次借书数及已借书数;当还书操作时,显示本次还书数和已借书数。
Ø运行结果:
1.任务陈述
2.知识准备
•2.4类的方法
•2.4.1定义类的方法
Java类中方法的声明采用以下格式:
[访问修饰符]<修饰符>返回值类型方法名称([参数列表]){方法体}
1.返回值类型:表示方法返回值的类型。如果方法不返回任何值,它必须声明为void(空)。对于有返回值的方法,方法中一定有return语句,方法的返回值类型和return语句后面的类型一样。例如,如果一个方法中含有代码return“aaaa”;那么包含该句的方法返回值是字符型。接收方法返回值的变量也必须与指定方法返回值的类型相兼容。
2.方法名称:可以是任何合法标识符,但具有意义,第一个字母小写。
3.参数列表:允许将参数值传递到方法中。列举的元素由逗号分开,而每一个元素包含一个类型和一个标识符,也称之为形参。
2.知识准备
3.静态方法的调用
静态方法的调用无需定义对象,可以通过类名直接使用,我们也称这种方法为类方法。
定义格式:[public]static返回值方法名([参数列表]){…}
调用格式:类名.方法名(实参1,实参2,……);
例如,在类Person中定义一个静态方法eat():
public static void eat(){……}
那么,静态方法的调用:Person.eat();
注意:静态方法内部只能调用静态方法和静态变量。
【实例2-2】计算立方体的体积程序设计
2.知识准备
•2.5构造方法
创建类的对象时,使用new关键字和一个与类名相同的方法来完成,这个方法是在实例化过程中被调用的,称之为构造方法。构造方法区别于普通的方法,有几个明显的特点:
Ø它的名字必须与它所在的类的名字完全相同。
Ø不返回任何数据类型,也不需要使用void声明。
Ø它的作用是创建对象并初始化成员变量。
Ø在创建对象时,系统会自动调用类的构造方法。
Ø构造方法一般都用public来声明,这样才能在程序任意位置创建对象。
Ø每个类至少有一个构造方法。如果不写构造方法,Java将提供一个默认的不带参的方法体为空的构造方法。
格式:
[访问权限]类名称([参数1,参数2,……]){//程序语句;//构造方法没有返回值}
注意:构造方法不能像成员方法那样直接被对象调用,只能在new运算符实例化对象时,被系统自动调用。
2.知识准备
构造方法分类
构造方法根据参数进行了分类:无参构造方法和有参构造方法。
1.无参构造方法
例如:public class People{public People(){……//使用固定值初始化成员变量}}
那么在含有main方法的测试类中实例化People对象时:
People p1=new People();
注意:无参构造方法可以不写,类中默认含有一个无参构造方法,并且该构造方法的方法体内没有语句。而使用默认值初始化对象成员变量,数值型变量初始为0,布尔型初始为false,字符型初始为“\0”,字符串初始为null;
2.有参构造方法
例如:public class People{int age;String name;public People(int myAge,String myName){age=myAge;name=myName;}}
那么在含有main方法的测试类中实例化People对象时:
People p1=new People(20,”zhangsan”);
上面的实例化就可以看出是把成员变量进行了动态的赋值。
注意:当定义了有参的构造方法后,无参构造方法将不再存在,如果还想使用无参的构造方法进行实例化对象,就需要显性的写出无参构造方法。
•2.3方法重载
•2.3.1方法重载的概念
–方法重载是指多个方法享有相同的名字,但是这些方法的参数必须不同,所谓的不同是指:参数的个数不同,参数类型不同,参数的顺序不同。返回类型不能用来区分重载的方法。在这种情况下,该方法就叫被重载了,这个过程称为方法的重载。当一个重载方法被调用时方法名是一样的,因此Java用参数的类型、(或)数量、(或)顺序来选择实际调用的重载方法。
例如:System.out.println();里面的println这个方法就是重载方法。注意:方法的重载要使用恰当,当一个动作(方法)分别接受不同的指令(参数)产生不同的效果,可以使用。但过度的使用将会降低程序的可读性。
参数不同是区分重载方法的关键因素,参数不同主要包括以下方面的不同:参数类型不同。例如:
public void method(String s);
public void method(int s);
参数个数不同。例如:
public void method(String s,int i);
public void method(String s);
参数顺序不同。例如:
public void method(String s,int i);
public void method(int i,String s);
【实例2-4】求圆形的面积,要求用户输入任何类型的数据后都要能得到最终的面积值。
public class MethodOverloading{
final float PI=3.14;
double calArea(double r){return PI*r*r;}float calArea(float r){return PI*r*r;}float calArea(int r){return PI*r*r;}folat calArea(String r){float i=Float.parseInt(r);return PI*r*r;}}
可以发现方法重载主要目的是为了满足在不同输入的情况下依然可以得到进行相同或相似的处理。在编程上有些麻烦,但是在使用性和灵活性得到了加强。由于实现了Java在编译时的方法的多种状态,所以有时也成为静态多态。
构造方法重载
不仅普通方法可以重载,构造方法也可以重载。只要构造方法的参数个数不同,或是类型不同,便可定义多个名称相同的构造方法。
【实例2-5】利用构造函数重载创建对不同变量初始化的对象
public class Rectangle{double width;double length;Rectangle(){//直接初始化为数值
width=1;length=5;}Rectangle(double x){//把两个变量初始化为相同传入值
width=x;length=x;}Rectangle(double w,double len){//分别对两个属性初始化不同的值
width=w;length=len;}}}
2.6变量的作用域
变量声明的位置决定变量作用域。Java变量的范围有四个级别:类级、对象实例级、方法级、块级。
类级变量又称全局级变量,在对象产生之前就已经存在,就是static修饰的静态变量。
对象实例级,就是成员变量,它可以使用在整个类和对象中。
方法级:就是在方法内部定义的变量,就是局部变量。
块级:就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如if、for语句的块。
注意:后面两个级别变量作用域的判断只需要记住:在变量声明的地方找到离它最近的一对大括号就是它的作用域,出了这对大括号就不能用了。
2.5定义包和导入包的关键字
包是Java提供的文件组织形式,采用类似于文件夹的形式。包提供了访问级别控制和命名空间管理。不同的包中允许出现相同名字的文件。
1.定义包
格式:package<顶层包名>[.子包名1][.子包名2]…[.子包名n];
例如:依照地域范围+制作人+功能分类来定义包
package com.cn.can.dao
2.导入包
格式:package<顶层包名>[.子包名1][.子包名2]…[.类名|*];
例如:导入系统类库中的Date表示日期的类。
import java.util.Date;
注意:在Java中,java.lang包不需要使用import手动导入,系统自动位置导入,因此在该保内存放了很多常用的基础的类,例如Math。
1.解决步骤
本任务中行为有借书、还书和查询。在BookCard类分别定义了3个方法borrow(int);TheReturn(int);query()。
Ø打开Eclipse,创建BookCard类;
Ø在类大括号内进行属性定义;
Ø在类的大括号内定义3个方法,表示借书、还书和查询;
Ø在BookCard类的main方法中,创建一个BookCard类的对象;
Ø利用创建的BookCard对象,使用对象名.方法的形式调用方法,完成具体的功能;
3.任务实施
2.任务代码
public class BookCard{public void borrow(int cash){if(Remain>=cash){Remain=Remain-cash;
//省略输出语句}}public void TheReturn(int cash){Remain=Remain+cash;
//省略输出语句}public void query(){System.out.println("可借书数"+Remain);}}
3.任务实施
4.任务拓展
1.任务拓展要求:
原任务中方法borrow(int);TheReturn(int);query()都没有返回值,现在改为正确借书、还书后,返回true,否则返回false。
2.任务拓展分析:
大部分的方法都需要有返回值,对于有返回值的方法一定要注意方法的返回值与方法体内的return语句对应起来。
例如,如果方法体内含有if-else语句,那么就应该注意返回值的问题。
5.任务实训
一、实训目的
二、实训内容
三、简要提示
四、实训思考