Java课程实验——实验3_面向对象(上)

目录

1、

2、

3、

4、

5、

6、

7、

第八个实验是选做,看了一眼,好像都是自主性内容,就偷懒一下吧 !


1、

实验题目:定义一个电视机类,实现电视机的基本功能(换台,调整音量,开关),并测试其功能。

测试类:

package s3_1;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {

        TV tv = new TV();

        System.out.println("1.开机");
        System.out.println("0.关机");
        System.out.println("请选择:");

        Scanner sc = new Scanner(System.in);
        int tvSwitch = sc.nextInt();
        tv.setTvSwitch(tvSwitch);

        while (tv.tvSwitch == 1) {
            System.out.println("1.调节频道");
            System.out.println("2.调节音量");
            System.out.println("0.关机");
            Scanner sc1 = new Scanner(System.in);
            int select = sc.nextInt();
            switch (select) {
                case 1 :
                    int channel;
                    System.out.println("请输入频道:");
                    Scanner sc2 = new Scanner(System.in);
                    channel = sc.nextInt();
                    tv.setChannel(channel);
                    break;
                case 2 :
                    int voiceChange;
                    System.out.println("请输入音量调节方式:");
                    Scanner sc3 = new Scanner(System.in);
                    voiceChange = sc.nextInt();
                    tv.setVoice(voiceChange);
                    System.out.println("现在的音量是:" + tv.voice);
                    break;
                case 0 :
                    tv.tvSwitch = 0;
                    System.out.println("关机成功");
                    break;
            }
        }
    }
}

电视机类:

public class TV {

    public int channel = 0;
    public int voice = 0;
    public int tvSwitch = 0;

    //直接输入频道
    public void setChannel(int channel) {
        if (channel >= 1) {
            this.channel = channel;
            System.out.println("现在是" + channel + "台");
        }
        else System.out.println("error");
    }

    //输入voiceChange,若为1,则声音调大一度;若为0,则声音减小一度;否则输出error
    public void setVoice(int voiceChange) {
        if (voiceChange == 1)
            if (voice <= 3) voice ++ ;
            else {
                System.out.println("音量已经达到最大");
                return;//错误写法:return 0;  或  break;
            }
        else if (voiceChange == 0) {
            if (voice <= 0) {
                System.out.println("音量已经达到最小");
                return;
            }
            else voice -- ;
        }
        else System.out.println("error");
    }

    //输入tvSwitch,若为1,则开机,若为0,则关机,否则error
    public void setTvSwitch(int tvSwitch) {
        if (tvSwitch == 1) System.out.println("开机成功");
        else if (tvSwitch == 0) System.out.println("关机成功");
        else System.out.println("error");
        this.tvSwitch = tvSwitch;//这个需要加上
    }

}

2、

实验题目: 

(1)设计一个分数类,分数的分子和分母用两个整型数表示,类中定义方法对分数进行加、减、乘、除运算;

(2)在测试类中定义分数类对象,运算并输出运算结果。

分数类:

public class Fraction {
    public int fSon;
    public int fMom;

    //求最大公约数
    public int gcd(int a, int b) {
        //保证a>b
        if (a < b) {
            int c = b;
            b = a;
            a = c;
        }

        int r = a % b;
        while (r != 0) {
            a = b;
            b = r;
            r = a % b;
        }

        if (b < 1) b = -b;//这一步骤可以除去最大公因数为负数的情况

        return b;
    }

    public void fAdd(int fSon1, int fMom1, int fSon2, int fMom2) {
        int fm = fMom1 * fMom2;
        fSon1 = fSon1 * fMom2;
        fSon2 = fSon2 * fMom1;
        int fs = fSon1 + fSon2;
        int g = gcd(fs, fm);//最大公约数
        fs /= g;
        fm /= g;
        System.out.println("两数相加的结果为;" + fs + "/" + fm);
    }

    public void fSub(int fSon1, int fMom1, int fSon2, int fMom2) {
        int fm = fMom1 * fMom2;
        fSon1 = fSon1 * fMom2;
        fSon2 = fSon2 * fMom1;
        int fs = fSon1 - fSon2;
        int g = gcd(fs, fm);//最大公约数
        System.out.println("最大公约数是" + g);
        fs /= g;
        fm /= g;
        System.out.println("两数相减的结果为;" + fs + "/" + fm);
    }

    public void fMul(int fSon1, int fMom1, int fSon2, int fMom2) {
        int fm = fMom1 * fMom2;
        fSon1 = fSon1 * fMom2;
        fSon2 = fSon2 * fMom1;
        int fs = fSon1 * fSon2;
        fm *= fm;
        int g = gcd(fs, fm);//最大公约数
        fs /= g;
        fm /= g;
        System.out.println("两数相乘的结果为;" + fs + "/" + fm);
    }

    public void fDiv(int fSon1, int fMom1, int fSon2, int fMom2) {
        int fm = fMom1 * fMom2;
        fSon1 = fSon1 * fMom2;
        fSon2 = fSon2 * fMom1;
        int g = gcd(fSon1, fSon2);//最大公约数
        fSon1 /= g;
        fSon2 /= g;
        System.out.println("两数相除的结果为;" + fSon1 + "/" + fSon2);
    }
}

测试类: 

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {

        Fraction fraction = new Fraction();

        System.out.println("请输入第一个分数的分子:");
        Scanner sc1 = new Scanner(System.in);
        int fSon1 = sc1.nextInt();

        System.out.println("请输入第一个分数的分母:");
        Scanner sc2 = new Scanner(System.in);
        int fMom1 = sc2.nextInt();

        System.out.println("请输入第二个分数的分子:");
        Scanner sc3 = new Scanner(System.in);
        int fSon2 = sc3.nextInt();

        System.out.println("请输入第二个分数的分母:");
        Scanner sc4 = new Scanner(System.in);
        int fMom2 = sc4.nextInt();

        fraction.fAdd(fSon1, fMom1, fSon2, fMom2);
        fraction.fSub(fSon1, fMom1, fSon2, fMom2);
        fraction.fMul(fSon1, fMom1, fSon2, fMom2);
        fraction.fDiv(fSon1, fMom1, fSon2, fMom2);

    }
}

3、

实验题目:

(1)定义一个手机类,定义若干属性,方法和构造方法;

(2)定义测试类,其中定义多个手机类对象,并设置不同的初始值;

(3)调用手机类的相关方法,测试该类的功能。

手机类:

public class Phone {

    private String brand;//品牌
    private int price;//价格

    public Phone() {

    }

    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
    }

    public void printPhone() {
        System.out.println(this.brand + "品牌的手机价格为:" + this.price);
    }

    public String getBrand() {
        return brand;
    }

    public int getPrice() {
        return price;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Phone p1 = new Phone("iPhone 12", 6799);
        Phone p2 = new Phone("iPhone 13", 7000);

        p1.printPhone();
        p2.printPhone();

    }
}

4、

实验题目:

定义一个类,其中定义三个方法,分别求两个整数最大值、三个整数最大值和三个小数最大值,并测试其效果。

Number类:

public class Number {

    public int first(int a, int b) {
        return a >= b ? a : b;
    }

    public int second(int a, int b, int c) {
        return (a >= b ? a : b) >= c ? (a >= b ? a : b) : c;
    }

    public double third(double a, double b, double c) {
        return (a >= b ? a : b) >= c ? (a >= b ? a : b) : c;
    }
}

测试类: 

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Number n = new Number();
        System.out.println("请输入三个整数:");
        //只需要定义一个Scanner就行
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();

        System.out.println("请输入三个小数:");
        double a1 = sc.nextDouble();
        double b1 = sc.nextDouble();
        double c1 = sc.nextDouble();

        System.out.println("两个整数的最大值:" + n.first(a, b));
        System.out.println("三个整数的最大值:" + n.second(a, b, c));
        System.out.println("三个小数的最大值:" + n.third(a1, b1, c1));
    }
}

5、

实验题目:

(1)定义一个类,包含x、y两个属性,一个add方法实现对两个属性的加法运算,即x、y分别加上10和20,并定义该类的构造方法;

(2)通过定义add方法的重载,联系两种形参的传递方式(基本类型和引用类型);

(3)定义测试类,测试该类的重载方法的效果,总结两种参数传递的区别。

public class Test {
    public static void main(String[] args) {

        Number n = new Number();
        Number n2 = new Number(3, 34);
        Number n3 = new Number(3,34);
        Number n4 = new Number(3, 34);

        int x = 3, y = 34;

        n.add(x, y);
        System.out.println("add之后的x和y:" + x + "," + y);//值传递,不改变实参
        n2.add(n2);
        System.out.println("第二次add之后的x和y:" + n2.x + "," + n2.y);//引用传递的是地址,改变实参
        n3.add(n4);
        System.out.println("n3的值:" + n3.x + "," + n3.y);
        System.out.println("第三次add之后的x和y:" + n4.x + "," + n4.y);
    }
}
public class Number {
    int x;
    int y;

    public Number() {

    }

    public Number(int x, int y) {
        this.x = x;
        this.y = y;
    }
    //基本类型(值类型)传递参数
    public void add(int x, int y) {
        x += 10;
        y += 20;
    }

    //引用类型传参
    public void add(Number n) {
        n.x += 10;
        n.y += 20;
    }
}

不难看出,在引用传递参数中,只有被传进的对象的x和y才会发生改变(如n4),而调用add方法的n3的x和y并不发生改变。 

6、

实验题目:

(1)设计一个学生类Student,包含至少两个成员变量,其中包含一个类变量,定义构造方法和一个类方法,输出该类的成员变量的值(注意类变量和实例变量的访问方式区别);

(2)定义测试类,实例化一个Student对象,然后调用该对象的相关方法,观察并分析类方法与实例方法的区别,总结静态变量和方法使用的注意事项。

可以看出,在静态(类)方法中不能访问非静态成员变量,只能访问静态变量。因为非静态成员变量必须通过实例化对象才能赋值,而静态成员变量则可以在不创建对象的情况下,通过类名来进行访问。而非静态(实例)方法,则可以访问两个变量(即:静态成员变量和非静态成员变量都可以访问)

而且, 静态成员变量可理解为一块公共的内存区域,无论是通过类名改变其值,还是通过对象名改变其值,其值都会发生永久改变。而非静态成员变量,只能通过对象名对其值进行改变,其值永远只属于其对象,而对于其他对象不会受到影响。

类变量可以直接用类名访问,也可以用对象访问
实例变量和方法只能用对象访问和调用
静态变量为同一类所有对象共享,使用其中一个对象调用后的值将会被其他对象继续使用

public class Student {
    public String number;
    public static int age;

    public Student() {

    }

    public Student(String number, int age) {
        this.number = number;
        this.age = age;
    }

    public void show1() {
        System.out.println("该学生的学号为:" + number + ",该学生的年龄为:" + age);
    }

    public static void show2() {
        System.out.println("该学生的年龄为" + age);
    }
}

public class Test {
    public static void main(String[] args) {
        //未创建对象,就可以访问静态变量(类变量)age
        Student.age = 18;
        Student.show2();

        //创建对象后访问非静态变量number
        Student stu = new Student("234256", 19);
        stu.show1();
        stu.show2();
        System.out.println("第一次用类名调用静态方法:");
        Student.show2();
        System.out.println("第二次用类名调用静态方法,但是通过对象对age值进行过修改:");
        stu.age = 33;
        Student.show2();
    }
}

 

7、

实验题目:

(1)设计一个雇员类,属性包括:编号、姓名、年龄、职务、部门、出勤人数;方法包括:构造方法、输出信息的方法、签到方法;

(2)创建雇员类对象,统计雇员的出勤人数。

注意考虑属性和方法的访问权限,方法的功能,及main方法中如何实现要求统计的信息。

雇员类: 

import java.util.Scanner;

public class Employee {
    public String[] number = new String[1024];
    public String[] name = new String[1024];
    public String[] age = new String[1024];
    public String[] pos = new String[1024];
    public String[] dep = new String[1024];
    public int attendance = 0;//出勤人数
    int n = 0;//应到人数
    public Employee() {
        //无参构造,不初始化
    }


    public void information() {
        System.out.println("应到:" + n);
        System.out.println("出勤人数为:" + attendance);
        System.out.println("出勤人员信息:");
        for (int i = 0; i < attendance; i ++ ) {
            System.out.println("编号:" + number[i]);
            System.out.println("姓名:" + name[i]);
            System.out.println("年龄:" + age[i]);
            System.out.println("职务:" + pos[i]);
            System.out.println("部门:" + dep[i]);
        }
    }

    //签到函数
    public void sign() {
        System.out.println("请输入员工总人数:");
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (int i = 0; i < n; i ++ ){
            System.out.println("请输入编号:");
            number[i] = sc.next();
            System.out.println("请输入姓名:");
            name[i] = sc.next();
            System.out.println("请输入年龄:");
            age[i] = sc.next();
            System.out.println("请输入职务:");
            pos[i] = sc.next();
            System.out.println("请输入部门:");
            dep[i] = sc.next();
            attendance ++ ;
            System.out.println("你是否是最后一个签到的人,若是,则输入0,否则输入1:");
            int j = 0;
            j = sc.nextInt();
            if (j == 0) break;
        }
    }


}

测试类: 

public class Test {
    public static void main(String[] args) {
        Employee e = new Employee();
        System.out.println("开始签到:");
        e.sign();
        System.out.println("签到完成!");
        e.information();
    }
}

控制台输入:

开始签到:
请输入员工总人数:
3
请输入编号:
2001
请输入姓名:
张三
请输入年龄:
34
请输入职务:
java后端
请输入部门:
技术部
你是否是最后一个签到的人,若是,则输入0,否则输入1:
1
请输入编号:
2002
请输入姓名:
李四
请输入年龄:
33
请输入职务:
web前端
请输入部门:
技术部
你是否是最后一个签到的人,若是,则输入0,否则输入1:
0

控制台输出:
签到完成!
应到:3
出勤人数为:2
出勤人员信息:
编号:2001
姓名:张三
年龄:34
职务:java后端
部门:技术部
编号:2002
姓名:李四
年龄:33
职务:web前端
部门:技术部

进程已结束,退出代码为 0

 

第八个实验是选做,看了一眼,好像都是自主性内容,就偷懒一下吧 !

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值