实验二 类与对象
一、实验目的
1、掌握使用类来封装对象的属性和方法;
2、掌握对象的组合和参数传递;
3、掌握类变量与实例变量,以及类方法与实例方法的区别;
4、掌握使用package语句和import语句;
5、掌握关键字this的用法。
二、实验内容
1、编写一个Java应用程序,该程序中有两个类,即Vehicle(用于刻画机动车)和User(主类)。具体要求如下:
(1)Vehicle类有一个double类型的变量speed,用于刻画机动车的速度,有一个int型变量power,用于刻画机动车的功率。在类中定义了speedUp(int s )方法,体现机动车有加速功能;定义了speedDown()方法,体现机动车有减速功能;定义了setPower(int p)方法,用于设置机动车的功率;定义了getPower()法,用于获取机动车的功率。机动车的UML图如图2.1所示。
(2)在主类User的mainO方法中用Vehicle类创建对象,并让该对象调用方法设置功率,演示加速和减速功能。
图2.1 Vehicle的UML图
//Main.java
package Car;
public class User {
public static void main(String args[]) {
Vehicle car1,car2;
car1 = new Vehicle(); //使用new 运算符和默认的构造方法创建对象car1
car2 = new Vehicle(); //使用new 运算符和默认的构造方法创建对象car2
car1.setPower(128);
car2.setPower(76);
System.out.println("car1的功率是:"+car1.getPower());
System.out.println("car2的功率是:"+car2.getPower());
car1.speedUp(80); //car1调用speedUp方法将自己的speed的值增加80
car2.speedUp(80); //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());
}
}
package Car;
public class Vehicle {
double speed;//声明double型变量speed,刻画速度
int power;//声明int型变量power,刻画功率
void speedUp(int s) {
speed += s; //将参数s的值与成员变量speed的和赋值给成员变量speed
}
void speedDown(int d) {
speed -= d; //将成员变量speed与参数d的差赋值给成员变量speed
}
void setPower(int p) {
power = p; //将参数p的值赋值给成员变量power
}
int getPower() {
return power; //返回成员变量power的值
}
double getSpeed() {
return speed;
}
}
2、编写一个Java应用程序,模拟家庭买一台电视,即家庭将电视作为自己的一个成员,通过调用一个方法将某台电视的引用传递给自已的电视成员。具体要求如下:
(1)创建TV.java、Family.java和MainClass.java等3个源文件,其中TV.java中的TV类负责创建"电视"对象,Family.java中的Family类负责创建"家庭"对象,MainClass.java是主类,负责模拟活动,属业务逻辑类,程序入口。
(2)在主类的main()方法中首先使用TV类创建一个对象haierTV,然后使用Family类再创建一个对象zhangSanFamily,并将先前TV类的实例haierTV的引用传递给zhangSanFamily对象的成员变量homeTV。
Family类组合TV类的实例的UML图如图2.2所示。
图2.2 Family组合TV类的实例的UML图
package familyandTV;
public class Mainclass {
public static void main(String args[]) {
TV haierTV = new TV();
haierTV.setChannel(5); //haierTV调用setChannel(int m),并向参数m传递5
System.out.println("haierTV的频道是"+haierTV.getChannel());
Family zhangSanFamily = new Family();
zhangSanFamily.buyTV(haierTV);//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();
}
}
package familyandTV;
public class Family {
TV homeTV;
void buyTV(TV tv) {
homeTV = tv; //将参数tv赋值给homeTV
}
void remoteControl(int m) {
homeTV.setChannel(m);
}
void seeTV() {
homeTV.showProgram(); //homeTV调用showProgram()方法
}
}
package familyandTV;
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+"频道");
}
}
}
3、编写程序模拟两个村庄共用同一口井水。编写一个Village类,该类有一个静态的int型成员变量waterAmount,用于模拟井水的水量。在主类Land的mainO方法中创建两个村庄,一个村庄改变了waterAmount的值,另一个村庄查看waterAmount的值。
package VillageClass;
public class Land {
public static void main(String args[]) {
Village.setWaterAmount(200); //用类名调用setWaterAmount(int m),并向参数传值200
int leftWater =Village.waterAmount; //用Village类的类名访问waterAmount
System.out.println("水井中有 "+leftWater+" 升水");
Village zhaoZhuang,maJiaHeZhi;
zhaoZhuang = new Village("赵庄");
maJiaHeZhi = new Village("马家河子");
zhaoZhuang.setPeopleNumber(80);
maJiaHeZhi.setPeopleNumber(120);
zhaoZhuang.drinkWater(50);//zhaoZhuang调用drinkWater(int n),并向参数传值50
leftWater = maJiaHeZhi.lookWaterAmount();//maJiaHeZhi调用lookWaterAmount()方法
String name=maJiaHeZhi.name;
System.out.println(name+"发现水井中有 "+leftWater+" 升水");
maJiaHeZhi.drinkWater(100);
leftWater = zhaoZhuang.lookWaterAmount();//zhaoZhuang调用lookWaterAmount()方法
name=zhaoZhuang.name;
System.out.println(name+"发现水井中有 "+leftWater+" 升水");
int peopleNumber = zhaoZhuang.getPeopleNumber();
System.out.println("赵庄的人口:"+peopleNumber);
peopleNumber = maJiaHeZhi.getPeopleNumber();
System.out.println("马家河子的人口:"+peopleNumber);
}
}
package VillageClass;
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;
}
}
4、求方程的根: 第一步,把SquareEquation.java放在一个包(自己定,需要符合包的命名规则)中,假设为X。
package X;
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;
}
}
import X.*;
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();
}
}
5、用类描述计算机中CPU的速度和硬盘的容量,要求Java应用程序有4个类,名字分别是PC、CPU、HardDisk和Test,其中Test是主类。
PC类与CPU类和HardDisk类关联的UML图如图2.3所示,其中,CPU类要求getSpeed()返回speed的值,要求setSpeed(int m)方法将参数m的值赋给speed;HardDisk类要求getAmount()返回amount的值,要求setAmount(int m)方法将参数m的值赋给amount;PC类要求setCPU(CPU c)将参数c的值赋给cpu,要求setHardDisk(HardDisk h)方法将参数h的值赋给HD,要求show()方法能显示CPU的速度和硬盘的容量。
图2.3 PC类与CPU类和HardDisk类关联的UML图
主类Test的要求如下:
(I) 在main()方法中创建一个CPU对象cpu,cpu将自己的speed设置为2200;
(2) 在main()方法中创建一个HardDisk对象disk,disk将自己的amount设置为200;
(3) 在main()方法中创建一个PC对象pc;
(4) pc调用setCPU(CPUc)方法,调用时实参是cpu。
(5) pc调用setHardDisk(HardDisk h)方法,调用时实参是disk。
(6)pc调用show()方法。
package Computer;
public class Test {
public static void main(String args[])
{
CPU cpu = new CPU();
cpu.setSpeed(2200);
HardDisk disk = new HardDisk();
disk.setAmount(200);
PC pc = new PC();
pc.setCPU(cpu);
pc.setHardDisk(disk);
pc.show();
}
}
package Computer;
public class PC {
CPU cpu;
HardDisk HD;
void setCPU(CPU c)
{
cpu = c;
}
void setHardDisk(HardDisk h)
{
HD = h;
}
void show()
{
System.out.println("CPU Speed is "+ cpu.getSpeed());
System.out.println("HardDisk amount is " + HD.getAmount());
}
}
package Computer;
public class HardDisk {
int amount;
void setAmount(int m)
{
amount = m;
}
int getAmount()
{
return amount;
}
}
package Computer;
public class CPU {
int speed;
void setSpeed(int m)
{
speed = m;
}
int getSpeed()
{
return speed;
}
}