文档库

最新最全的文档下载
当前位置:文档库 > Java程序设计-试验2(学生版)

Java程序设计-试验2(学生版)

华北电力大学

实验报告

实验名称Java程序面向对象设计(一)课程名称Java程序设计

专业班级:学生姓名:

学号:成绩:

指导教师:张学斌实验日期:

一、实验目的及要求

1.掌握类的定义。

2.掌握成员变量和成员方法的定义。

3.掌握构造方法的定义和使用。

4.掌握类的多态性

二、实验环境

Windows2000/Windows XP,JDK 1.2~1.6

三、试验内容和步骤

要求按照实验内容,写出详细实验过程和步骤,必要时截图。

实验1 机动车

1.1实验要求

编写一个Java应用程序,该程序有两个类:Vehicle(用于刻画机动车)和User(主类)。具体要求如下:

Vehicle类有一个double类型的变量speed,用于刻画机动车的速度,一个int型变量power,用于刻画机动车的功率。定义了speedUp(int s)方法,体现机动车有加速功能。定义了speedDown()方法,体现机动车有减速功能。定义了setPower(int s),用于设置机动车的功率。定义了getPower()方法,用于获取机动车的功率。

在主类User的mian()方法中用Vehicle类创建对象,并让该对象调用方法设置功率,演示加速和减速功能。

1.2程序模板

Vehicle.java

public class Vehicle {

【代码1】//声明double型变量speed,刻画速度

【代码2】//声明int型变量power,刻画功率

void speedUp(int s) {

【代码3】//将参数s的值与成员变量speed的和赋值给成员变量speed

}

void speedDown(int d) {

【代码4】//将成员变量speed与参数d的差赋值给成员变量speed

}

void setPower(int p) {

【代码5】//将参数p的值赋值给成员变量power

}

int getPower() {

【代码6】//返回成员变量power的值

}

double getSpeed() {

return speed;

}

}

----------------------------------------------------------------------------------------------

User.java

public class User {

public static void main(String args[]) {

Vehicle car1,car2;

【代码7】//使用new 运算符和默认的构造方法创建对象car1

【代码8】//使用new 运算符和默认的构造方法创建对象car2

car1.setPower(128);

car2.setPower(76);

System.out.println("car1的功率是:"+car1.getPower());

System.out.println("car2的功率是:"+car2.getPower());

【代码9】//car1调用speedUp方法将自己的speed的值增加80

【代码10】//car2调用speedUp方法将自己的speed的值增加80

System.out.println("car1目前的速度:"+car1.getSpeed());

System.out.println("car2目前的速度:"+car2.getSpeed());

car1.speedDown(10);

car2.speedDown(20);

System.out.println("car1目前的速度:"+car1.getSpeed());

System.out.println("car2目前的速度:"+car2.getSpeed());

}

}

1.3 实验指导

●创建一个对象时,成员变量被分配空间,这些内存空间称作该对象的实体或变量,而对象中

存放着引用,以确保这些变量被该对象操作使用。

●空对象不能使用,即不能让一个空对象去调用方法产生行为。假如程序中使用了空对象,在

运行时会产生异常:NullPointerException,对象时动态地分配实体的,Java的编译器对空对象不做检查。因此,在编译时要避免使用空对象。

1.4实验改进(编写程序,并给出结果)

1.改进speedUp()方法,使得Vehicle类的对象加速时不能将speed值超过200.

2.改进speedDown()方法,使得Vehicle类的对象在减速时不能将speed值小于0.

3.增进一个刹车方法void brake(),Vehicle类的对象调用它能将speed的值变成0.

1.5 实验结果

实验2 家中的电视

1.实验要求

编写一个Java应用程序,模拟家庭买一台电视,即家庭将电视作为自己的一个成员,即通过调用一个方法将某个电视的引用传递给自己的电视成员。具体要求如下:

●有三个源文件,其中TV.java中的TV类负责创建“电视”对象。Family.java中的Family类

负责创建“家庭”对象,MainClass.java是主类。

●在主类的main()方法中首先使用TV类创建一个对象haierTV ,然后使用Family类再创建一

个对象zhangsanFamily,并将先前TV类的实例haierTV的引用传递给zhangsanFamily对象的成员变量homeTV。

2.程序模板

TV.java

public class TV {

int channel; //电视频道

void setChannel(int m) {

if(m>=1){

channel=m;

}

}

int getChannel(){

return channel;

}

void showProgram(){

switch(channel) {

case 1 : System.out.println("综合频道");

break;

case 2 : System.out.println("经济频道");

break;

case 3 : System.out.println("文艺频道");

break;

case 4 : System.out.println("国际频道");

break;

case 5 : System.out.println("体育频道");

break;

default : System.out.println("不能收看"+channel+"频道");

}

}

}

----------------------------------------------------------------------------------------------

Family.java

public class Family {

TV homeTV;

void buyTV(TV tv) {

【代码1】//将参数tv赋值给homeTV

}

void remoteControl(int m) {

homeTV.setChannel(m);

}

void seeTV() {

homeTV.showProgram(); //homeTV调用showProgram()方法

}

}

-----------------------------------------------------------------------------------------

MainClass.java

public class MainClass {

public static void main(String args[]) {

TV haierTV = new TV();

【代码2】//haierTV调用setChannel(int m),并向参数m传递5

System.out.println("haierTV的频道是"+haierTV.getChannel());

Family zhangSanFamily = new Family();

【代码3】//zhangSanFamily调用void buyTV(TV tv)方法,并将haierTV传递给参数TV

System.out.println("zhangSanFamily开始看电视节目");

zhangSanFamily.seeTV();

int m=2;

System.out.println("hangSanFamily将电视更换到"+m+"频道");

zhangSanFamily.remoteControl(m);

System.out.println("haierTV的频道是"+haierTV.getChannel());

System.out.println("hangSanFamily再看电视节目");

zhangSanFamily.seeTV();

}

}

3.实验结果

实验3 共饮同井水

1.实验要求

编写程序模拟两个村庄共用一口水井。编写一个Village类,该类有一个静态的int型成员变量waterAmount,用于模拟井水的水量。在主类Land的main()方法中创建两个村庄,一个村庄改变了waterAmount的值,另一个村庄查看waterAmount的值。

2.程序模板

Village.java

public class Village {

static int waterAmount; //模拟水井的水量

int peopleNumber; //村庄的人数

String name; //村庄的名字

Village(String s) {

name = s;

}

static void setWaterAmount(int m) {

if(m>0)

waterAmount = m;

}

void drinkWater(int n){

if( waterAmount-n>=0) {

waterAmount = waterAmount-n;

System.out.println(name+"喝了"+n+"升水");

}

else

waterAmount = 0;

}

static int lookWaterAmount() {

return waterAmount;

}

void setPeopleNumber(int n) {

peopleNumber = n;

}

int getPeopleNumber() {

return peopleNumber;

}

}

-----------------------------------------------------------------------------

Land.java

public class Land {

public static void main(String args[]) {

【代码1】//用类名调用setWaterAmount(int m),并向参数传值200

int leftWater =【代码2】//用Village类的类名访问waterAmount

System.out.println("水井中有"+leftWater+" 升水");

Village zhaoZhuang,maJiaHeZhi;

zhaoZhuang = new Village("赵庄");

maJiaHeZhi = new Village("马家河子");

zhaoZhuang.setPeopleNumber(80);

maJiaHeZhi.setPeopleNumber(120);

【代码3】//zhaoZhuang调用drinkWater(int n),并向参数传值50

leftWater = 【代码4】//maJiaHeZhi调用lookWaterAmount()方法

String name=http://www.wendangku.net/doc/14442409d15abe23492f4d93.html;

System.out.println(name+"发现水井中有"+leftWater+" 升水");

maJiaHeZhi.drinkWater(100);

leftWater = 【代码5】//zhaoZhuang调用lookWaterAmount()方法

name=http://www.wendangku.net/doc/14442409d15abe23492f4d93.html;

System.out.println(name+"发现水井中有"+leftWater+" 升水");

int peopleNumber = zhaoZhuang.getPeopleNumber();

System.out.println("赵庄的人口:"+peopleNumber);

peopleNumber = maJiaHeZhi.getPeopleNumber();

System.out.println("马家河子的人口:"+peopleNumber);

}

}

3.实验指导

●当java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类的实

例变量就不会被分配内存。但是,类的类变量,在该类被加载到内存时,就分配了相应

的内存变量。如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内

存空间,而类变量不再重新分配内存,所有对象共享类变量。

●当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,只有当该类创

建对象后,类中的实例方法才分配入口地址。当使用new运算符和构造方法创建对象

时,首先分配成员变量给对象,同时实例方法必须分配入口地址,然后再执行构造方法

中的语句,完成必要的初始化。因而实例方法必须由对象调用执行。需要注意的是,当

创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入

口地址,也就是说,方法的入口地址被所有的对象共享。对于类中的类方法,在该类被

加载到内存时,就分配了相应的入口地址,即使该类没有创建对象,也可以直接通过类

名调用类方法。

4.扩展练习

(1) 【代码3】是否可以是Village.drinkWater(50);,为什么?

(2) 【代码4】是否可以是Village.lookWaterAmount();,为什么?

(3) Land类main()方法中倒数第2行代码是否可以更改为:

peopleNumber = Village.getPeopleNumber(); 为什么?

5.实验结果

实验4 求方程的根

1.实验要求

按照实验要求使用package语句将方程属性即计算根的方法封装在一个有包名的类中,包名是tom.jiafei,类的名字是SquareEquation。编写一个SunRise的主类,该主类使用import语句引入tom.jiafei 包中的SquareEquation类。

2.程序模板

模板1

将模板1给出的源文件SquareEquation.java编译后得到的字节码文件复制到c:/1000/tom/jiafei 目录中。

SquareEquation.java

package tom.jiafei;

public class SquareEquation {

double a,b,c;

double root1,root2;

boolean boo;

public SquareEquation(double a,double b,double c) {

this.a=a;

this.b=b;

this.c=c;

if(a!=0)

boo=true;

else

boo=false;

}

public void getRoots() {

if(boo) {

System.out.println("是一元2次方程");

double disk=b*b-4*a*c;

if(disk>=0) {

root1=(-b+Math.sqrt(disk))/(2*a);

root2=(-b-Math.sqrt(disk))/(2*a);

System.out.printf("方程的根:%f,%f\n",root1,root2);

}

else {

System.out.printf("方程没有实根\n");

}

}

else {

System.out.println("不是一元2次方程");

}

}

public void setCoefficient(double a,double b,double c) {

this.a=a;

this.b=b;

this.c=c;

if(a!=0)

boo=true;

else

boo=false;

}

}

模板2

1.设置classpath。假设本地JDK的安装目录是:D:\jdk1.6。

在命令行执行如下命令:set classpath = D:\jdk1.6\jre\lib\rt.jar;.;c:\1000;

或右击“我的电脑”->属性->系统特性->高级选项->环境变量,将classpath的值改为classpath = D:\jdk1.6\jre\lib\rt.jar;.;c:\1000;

2.将模板2给出的Java源程序SunRise.java保存到D:\2000中。

SunRise.java

import tom.jiafei.*;

public class SunRise {

public static void main(String args[]) {

SquareEquation equation=new SquareEquation(4,5,1);

equation.getRoots();

equation.setCoefficient(-3,4,5);

equation.getRoots();

}

}

3 实验指导

?如果使用import语句引入了整个包中的类,那么可能会增加编译时间。但绝不会影响程序

运行的性能。Java运行平台由所需要的Java类库和虚拟机组成,这些类库被包含在一个jre\lib 中的压缩文件中,当程序执行时,Java运行平台从类库中加载程序真正使用的类字节码到内存。

?可以使用import语言引入自定义包中的类,但必须在classpath中指明包的位置。

实验5 实例成员和类成员

1.实验要求

掌握实例成员和类成员的使用方法

2.程序模板

Example.java

class A

{

【代码1】//声明一个float型实例变量a

【代码2】//声明一个float型类变量b,即static变量b

void setA(float a)

{

【代码3】//将参数a的值赋值给成员变量a

}

void setB(float b)

{

【代码4】//将参数b的值赋值给成员变量b

}

float getA()

{

return a;

}

float getB()

{

return b;

}

void inputA()

{

System.out.println(a);

}

static void inputB()

{

System.out.println(b);

}

}

public class Example

{

public static void main(String args[])

{

【代码5】//通过类名操作类变量b,并赋值100

【代码6】//通过类名调用方法inputB()

A cat=new A();

A dog=new A();

【代码7】//cat象调用方法setA(int a)将cat的成员a的值设置为200

【代码8】//cat调用方法setB(int b)将cat的成员b的值设置为400

【代码9】//dog象调用方法setA(int a)将dog的成员a的值设置为150

【代码10】//dog调用方法setB(int b)将dog的成员b的值设置为300

【代码11】//cat调用inputA()。

【代码12】//cat调用inputB()。

【代码13】//dog调用inputA()。

【代码14】//dog调用inputB()。

}

}

实验6 银行账户

1.实验要求

声明银行账户类,成员变量包括账号、储户姓名、开户时间、身份证号码、存款余额等信息,成员方法包括开户、存款、取款、查询(余额、明细)、销户等操作。

public class Account{

private String acctNumber;

private String customerName;

private String acctOpenTime;

private String customerIdNum;

private double balance;

public Account(String accoutnNumber){

this.acctNumber = accoutnNumber;

}

public Account openAccount(String accountNumber){ return new Account(accountNumber);

}

public void save(double money){

this.balance += money;

}

public void query(){

System.out.println("Balance is: " + balance);

//....

}

}

2.实验结果

五、本次上机体会

创建一个Rectangle类,添加两个属性width、height。

(1)在Rectangle中添加两个方法计算矩形的周长和面积。

(2)编程利用Rectangle输出一个矩形的周长和面积。

设计一个Array类,添加一个整型数组,添加构造方法对数组赋初值。

(1)为Array类添加数组求和方法,添加返回求和值的方法。

(2)编程利用Array计算数组的和值并输出。

(实验报告如打印,纸张用A4,左装订;页边距:上下2.5cm,左2.9cm, 右2.1cm;字体:宋体小四号,1.25倍行距。)

Java程序设计-试验2(学生版)