实验二 类与对象

一、实验目的

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类创建对象,并让该对象调用方法设置功率,演示加速和减速功能。

机动车Java实验 java机动车实验总结_成员变量

图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所示。

机动车Java实验 java机动车实验总结_机动车Java实验_02

图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的速度和硬盘的容量。

机动车Java实验 java机动车实验总结_java_03

图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;
    }
}