Java程序设计B要点.docx
《Java程序设计B要点.docx》由会员分享,可在线阅读,更多相关《Java程序设计B要点.docx(35页珍藏版)》请在冰点文库上搜索。
Java程序设计B要点
《Java程序设计B》
实验指导书
尹春娇编写胡俊审定
安徽新华学院信息工程学院
2015年5月
前言
Java语言是一门当前流行的面向对象的程序设计语言,它相对于C++语言做了一些简化,也增加了一些新特性,是一门实践操作性很强、也比较容易入门的优秀程序设计语言。
上机实验的目的在于提高学生的分析问题、解决问题的能力和动手能力,通过实践环节理解Java语言的基本结构和面向对象的程序设计方法,体会Java语言的精髓。
为了使学生在上机实验时目标明确,本实验指导书针对课程内容编写了10个实验,实验项目比较全面的涵盖了Java语言程序设计的相关知识模块,读者可以根据教材讲授内容选择相应的实验内容,帮助对理论知识的深入理解。
由于编者水平有限,错误和不当之处在所难免,在此恳请读者给予批评指正,编者的电子邮件地址是:
yinchunjiao@。
2015年12月
第一章Java语言概述
实验一Java开发环境设置与Java程序结构
一、实验目的
1.练习java基本开发环境的配置
2.编写简单的java程序和applet,体会java程序开发过程,掌握java命令行工具
二、实验仪器
1.计算机一台
三、实验原理
1.Java程序开发的基本环境是Sun公司提供的java开发平台,分J2ME、J2SE、J2EE三种,教学选用J2SE,下载并安装J2SE的最新版本,配置开发环境。
2.Java程序的开发过程分编辑、编译、运行三个步骤,应用程序和Applet的运行方式有所不同。
四、实验内容
1.Java软件开发工具包(J2SE)的下载、安装与环境配置
2.编写简单的java应用程序并编译运行
五、实验步骤
1.下载J2SE安装程序:
从Sun官方网站下载J2SE的最新版本的JDK软件包,目前版本是JDK6.0。
JDK软件包安装程序分为在线(Onling)安装和离线安装(OffLine)两种,
根据安装时机子能否连网而做出选择,下载时要注意选择相应的操作系统类型。
同时下载J2SE的Documentation,其中包含J2SE的API手册,以方便编程时查阅参考。
2.安装J2SE:
运行J2SE安装程序“jdk-6u4-windows-i586-p.exe”,在安装过程中可以设置安装路径及选择要安装的组件,默认的安装路径为“C:
\ProgramFiles\Java\jdk1.6.0_04\”,也可以根据需要将J2SE安装
到其他目录下。
默认的组件选择是全部安装。
3.设置环境变量:
为了能正确方便的使用JDK,需要手工配置一些Windows的环境变量。
以WindowsXP为例说明设置过程。
在桌面“我的电脑”图标上单击右键,选择“属性”菜单,在出现的系统属性设置界面的“高级”选项卡中单击“环境变量”按钮,将出现“环境变量”设置界面。
在“系统变量”框中选择“Path”,然后单击“编辑”按钮,在出现的“编辑系统变量”对话框中,在“变量值”栏的末尾添加“;C:
\ProgramFiles\Java\jdk1.6.0_04\bin”。
如果“系统变量”框中没有“Path”变量,则选择“新建”按钮新建一个名为“Path”的环境变量,变量值设为“C:
\ProgramFiles\Java\jdk1.6.0_04\bin”。
用同样方法设置环境变量“classpath”,为了保证JVM能找到你的程序所在当前文件夹下的自定义的类文件,通常将当前文件夹也添加到“classpath”的变量值中,即将“classpath”的值设置为“C:
\ProgramFiles\Java\jdk1.6.0_04\lib;.”。
设置完成后,单击“开始”→“运行”,在对话框中输入“cmd”,点击“确定”或键盘回车键后打开命令行窗口。
在命令提示符下输入“java”或“javac”,回车后,如果出现其用法参数提示信息,则安装配置正确,如下图所示。
4.编写java源程序:
使用文本编辑器(如记事本或EditPlus)编辑简单的java源程序,如下列HelloJava程序:
publicclassHelloJava{
publicstaticvoidmain(Stringargs[]){
System.out.println("HelloJava!
");
}
}
保存源程序,本例存为HelloJava.java。
5.编译并运行java程序:
在命令提示符窗口使用Java编译器(javac.exe)进行编译,将Java源程序编译成字节码文件(HelloJava.class),然后使用Java解释器(java.exe)可将编译后的字节码文件HelloJava.class解释执行。
六、数据记录及处理
1.JDK安装路径及Path、Classpath变量的配置值
2.Java源程序、保存的文件名及运行输出结果
七、实验注意事项
1.环境变量配置时多个值之间用分号分割,当前目录”.”添加到classpath变量中
2.Java源文件保存时文件名必须与public类名一致
八、思考题
1.为什么必须配置path和calsspath环境变量?
其作用是什么?
2.Java虚拟机在java程序执行过程中的作用。
第三章Java面向对象程序设计
实验二面向对象程序设计
一、实验目的
1.通过编程和上机实验理解Java语言面向对象编程思想,掌握类和对象的构建与使用,了解成员变量和成员方法的特性,掌握面向对象程序设计的方法。
2.了解类的继承性和多态性的作用及实现机制,了解接口的作用,了解包的创建和使用。
二、实验仪器
1.计算机一台
三、实验原理
1.Java是一种纯粹的面向对象的语言,相对于C++做了一些简化,其单继承机制避免了多继承存在的问题,通过接口又弥补了单继承的不足。
2.多态性提高了问题的抽象级别,降低了问题的复杂度,多态分两种,静态多态性和动态多态性,分别通过方法重载和继承时方法覆盖实现。
3.Java中类和接口属于引用数据类型,因此作为参数传递时实际传的是隐含地址。
四、实验内容
1.设计类来描述真实客观世界中的事物,使用类的成员变量来表示事物的属性和状态,使用类的成员方法来提供对成员变量的访问或修改;创建类的对象,使用对象的方法来访问或修改对象的变量。
(1)程序功能:
设计一个用来描述汽车的类Car,使用类的成员变量来表示汽车的车主姓名、当前的速率和当前方向盘的转向角度,使用类的成员方法来表示改变汽车的速率和停车两个操作;创建主类来使用Car类的对象,在调用类的构造函数时指定对象的变量的初始值,以后再使用对象的方法来访问或修改对象的变量的值。
(2)程序源代码如下。
//汽车类Car的定义
classCar{
privateStringownerName;//车主姓名
privatefloatcurSpeed;//当前车速
privatefloatcurDirInDegree;//当前方向盘转向角度
publicCar(StringownerName){
this.ownerName=ownerName;
}
publicCar(StringownerName,floatspeed,floatdirInDegree){
this(ownerName);
this.curSpeed=speed;
this.curDirInDegree=dirInDegree;
}
publicStringgetOwnerName(){//提供对车主姓名的访问
returnownerName;
}
publicfloatgetCurDirInDegree(){//提供对当前方向盘转向角度的访问
returncurDirInDegree;
}
publicfloatgetCurSpeed(){//提供对当前车速的访问
returncurSpeed;
}
publicvoidchangeSpeed(floatcurSpeed){//提供改变当前的车速
this.curSpeed=curSpeed;
}
publicvoidstop(){//提供停车
this.curSpeed=0;
}
}
//主类TestCar的定义
publicclassTestCar{
publicstaticvoidmain(String[]args){
Carcar=newCar("成龙",200f,25f);
System.out.println("车主姓名:
"+car.getOwnerName());
System.out.println("当前车速:
"+car.getCurSpeed());
System.out.println("当前转向角度:
"+car.getCurDirInDegree());
car.changeSpeed(80);
System.out.println("在调用changeSpeed(80)后,车速变为:
"+car.getCurSpeed());
car.stop();
System.out.println("在调用stop()后,车速变为:
"+car.getCurSpeed());
}
}
(3)保存源程序,编译并运行,观察运行结果。
2.使用修饰符来限定类的成员变量或成员方法的属性
使用类的成员修饰符来设置类成员的访问权限,可以达到数据保护的目的。
编写程序练习修饰符的使用。
常用的修饰符如下:
publicprivateprotectedpackagestaticfinal
不同修饰符的访问控制权限如表3.1所示。
访问权限修饰符
类
子类
包
所有类和包
public
√
√
√
√
private
√
protected
√
√
√
缺省权限
√
√
表3.1
(1)程序功能:
通过两个类StaticDemo、Test说明静态变量/方法与实例变量/方法的区别。
(2)程序源代码如下。
classStaticDemo{
staticintx;
inty;
publicstaticintgetX(){
returnx;
}
publicstaticvoidsetX(intnewX){
x=newX;
}
publicintgetY(){
returny;
}
publicvoidsetY(intnewY){
y=newY;
}
}
publicclassTest{
publicstaticvoidmain(String[]args){
System.out.println("静态变量x="+StaticDemo.getX());
System.out.println("实例变量y="+StaticDemo.getY());//非法,编译时将出错
StaticDemoa=newStaticDemo();
StaticDemob=newStaticDemo();
a.setX
(1);
a.setY
(2);
b.setX(3);
b.setY(4);
System.out.println("静态变量a.x="+a.getX());
System.out.println("实例变量a.y="+a.getY());
System.out.println("静态变量b.x="+b.getX());
System.out.println("实例变量b.y="+b.getY());
}
}
(3)对上面的源程序进行编译,观察出错提示。
(4)修改源程序中的出错语句,删除或使用解释符//隐藏起来,例如,//System.out.println("实例变量y="+StaticDemo.getY());
(5)重新编译并运行该程序,观察运行结果。
3.调用方法时参数传递的练习
在Java中,方法调用时的参数传递只有值传递一种,即进行实参到形参的简单值拷贝。
当基本类型数据作为参数时,把实参值拷贝给形参,方法内部对参数的修改不会影响实参;当引用类型(类、接口、数组)数据作参数时,因为引用就是隐含的指针,所以进行值拷贝时,其实是在传递引用(隐含指针),方法内部对参数的修改会影响到实参。
3.1、编写一个传递基本类型数据进行方法调用的程序
(1)程序功能:
程序首先给整型变量x和y赋一个初值10,然后调用方法ff1对x和y做乘方及输出x和y的乘方值,最后再输出x和y的乘方值。
(2)程序源代码如下。
classPassParam{
publicstaticvoidmain(String[]args){
intx=10,y=10;
ff1(x,y);
System.out.println("x="+x+",y="+y);
}
staticvoidff1(intpassX,intpassY){
passX=passX*passX;
passY=passY*passY;
System.out.println("passX="+passX+",passY="+passY);
}
}
(3)编译并运行,观察运行结果,体会基本数据类型的值传递。
3.2、编写一个传递对象进行方法调用的程序
(1)程序功能:
定义一个有x、y两个成员的类Power,主类TestParam中创建Power的对象给x、y赋初值10,方法ff2以Power类对象为参数,内部对参数对象的x、y的值进行乘方,输出调用ff2前后的成员x、y的值。
(2)程序源代码如下。
classPower{
intx=10,y=10;
voidprintXY(){
System.out.println("x="+x+",y="+y);
}
Power(intnx,intny){
x=nx;y=ny;
}
}
PublicclassTestParam{
publicstaticvoidmain(String[]args){
Powerp=newPower(10,10);
p.printXY();
ff2(p);
System.out.println("方法调用后x="+p.x+",y="+p.y);
}
Staticvoidff2(Powerob)
{
ob.x=ob.x*ob.x;
ob.y=ob.y*ob.y;
}
p.printXY();
}
(3)编译并运行,观察运行结果,体会引用类型的值传递。
4.类的继承性练习
Java继承机制允许在已有类(父类)的基础上构造新类,新类(子类)自动继承父类的所有属性和方法,同时可以对子类进行扩充,继承机制很好地支持了软件重用,有效地提高了程序设计的效率。
4.1继承性练习
(1)程序功能:
编写创建学生类的程序,体现继承性。
(2)程序源代码如下。
publicclassStudent//学生类,作为父类,描述学生基本信息
{
protectedStringxm;//姓名,保护成员
protectedintxh;//学好,保护成员
voidsetdata(Stringm,inth)//设置数据的方法
{
xm=m;
xh=h;
}
publicvoidprint()//输出数据的方法
{
System.out.println(xm+","+xh);
}
}
classUndergraduateextendsStudent{//大学生类,扩充了学院、系的信息
protectedStringxy;//学院
protectedStringxi;//系
publicstaticvoidmain(Stringargs[]){
Students=newStudent();
s.setdata("李四",12321);
s.print();
Undergraduateus=newUndergraduate();
us.setdata("张三",12345);//调用父类的成员方法
us.xy="安徽新华学院";//访问本类的成员变量
us.xi="信息工程学院计算机系";//访问本类的成员变量
us.print();//调用父类的成员方法
System.out.print(us.xm+","+us.xy+","+us.xi);
}
}
(3)编译并运行,观察运行结果,体会继承性。
4.2this和super的使用
(1)程序功能:
程序功能:
说明this和super的用法。
程序首先定义Point(点)类,然后创建点的子类Line(线)。
最后通过Test类输出线段的长度。
程序中通过super(a,b)调用父类Point的构造方法为父类的x和y赋值。
在子类Line的setLine方法中,因为参数名和成员变量名相同,为给成员变量赋值,使用this引用,告诉编译器是为当前类的成员变量赋值。
在length和toString方法中使用父类成员变量时,使用super引用,告诉编译器使用的是父类的成员变量。
(2)程序源代码如下:
classPoint{
protectedintx,y;
Point(inta,intb){
setPoint(a,b);
}
publicvoidsetPoint(inta,intb){
x=a;
y=b;
}
}
classLineextendsPoint{
protectedintx,y;
Line(inta,intb){
super(a,b);
setLine(a,b);
}
publicvoidsetLine(intx,inty){
this.x=x+x;
this.y=y+y;
}
publicdoublelength(){
intx1=super.x,y1=super.y,x2=this.x,y2=this.y;
returnMath.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
publicStringtoString(){
return"直线端点:
["+super.x+","+super.y+"]["+
x+","+y+"]直线长度:
"+this.length();
}
}
publicclassTest{
publicstaticvoidmain(Stringargs[]){
Lineline=newLine(50,50);
System.out.println("\n"+line.toString());
}
}
(3)编译并运行,观察运行结果。
5.类的多态性练习
多态简言之就是“一个接口多种实现”,或者说“不同的对象接收到相同的消息执行不同的操作”,Java语言的多态分两种:
编译时多态(静态多态)和运行时多态(动态多态),编译时多态通过方法的重载(包括构造方法)来实现,运行时多态通过方法的覆盖来实现。
5.1方法的重载(静态多态性)
(1)程序功能:
使用同名方法求两个整数、浮点数、字符的较大值。
(2)程序源代码如下,补充空缺代码,并编译运行。
classGSelect{
publicstaticintgreaterOf(inta,intb){
//补充方法体,返回两个整数中的较大值
}
publicstaticdoublegreaterOf(doublea,doubleb){
//补充方法体,返回两个浮点数中的较大值
}
publicstaticchargreaterOf(chara,charb){
//补充方法体,返回两个字符中的较大值
}
publicclassTestGreater{
publicstaticvoidmain(String[]args){
inta1=30,b1=12;
doublea2=23.3,b2=23.4;
chara3=’G’.b3=’s’;
System.out.println(a1+”“+b1+"中较大的是:
"+GSelect.greaterOf(a1,b1));
System.out.println(a2+”“+b2+"中较大的是:
"+GSelect.greaterOf(a2,b2));
System.out.println(a3+”“+b3+"中较大的是:
"+GSelect.greaterOf(a3,b3));
}
}
5.2方法的覆盖(动态多态性)
(1)程序功能:
定地Shape类作为图形类的基类,其中包含计算面积的方法,在Shape类的基础上派生出两个子类Rectangle和Circle,子类中覆盖父类计算面积的方法,在主类中计算矩形和圆形的面积,体现出多态性。
(2)程序源代码如下:
classShape{//基类的定义
protecteddoublearea;
doublegetArea(){
area=0;
returnarea;
}
}
classRectangleextendsShape{//矩形类的定义
protecteddoublewidth,height;
Rectangle(doublew,doubleh){
width=w;
height=h;