JAVA学习 第三章作业

1.程序填空题:
定义一个抽象类Person,其中有一个公共的抽象方法showInfo()。然后定义此抽象类的一个子类Student,包括的成员变量有姓名、学号、班级和年龄,且此类中包括两个构造方法。在下列代码中的数字标示行填入合适的一行代码。

在这里插入图片描述

package Javawork;


abstract class Person {
    public abstract void showInfo();
}

class Student extends Person {
    String stuName;
    String stuID;
    String stuClass;
    int age;
    //接收姓名和学号两个参数的构造方法
    Student(String stuName,String stuID){
        this.stuName = stuName;
        this.stuID = stuID;
    }
    //接收四个参数的构造方法
    Student(String stuName,String stuID,String stuClass,int age){
        this(stuName,stuID);
        //构造函数里面也可以调用构造函数
        this.stuClass = stuClass;
        this.age = age;
    }
    //实现抽象方法,方法体为打印出学生的姓名、学号、班级

    public void showInfo() {
        System.out.println("Student's name:"+stuID);
        System.out.println("Student's ID:"+stuName);
        System.out.println("Student's Class:"+stuClass);
        System.out.println("Student's age:"+age);
    }
}

这道题比较简单,就不进行测试了.

2.编程实现下图中的任一图形(为简化起见:内外图形中心重合、且上下左右对称)。
要求:
1。设计所选定的图形类(可以继承于矩形类或圆形类), 对任意给定的可以构成所选图形的边长和半径,计算其有色部分的面积和周长;
2. 如果给定的内部半径或正方形边长超过外围图形允许的最大值(假设内部图形距外边框最窄处不得少于10),则要进行异常处理:提示内部图形尺寸过大。
3. 当给定的边长、半径符合要求时,选择某种颜色绘制出来(提示:可以在Applet中绘制)。

package Javawork;

import javax.swing.*;

import static java.lang.Math.PI;//圆周率
import static java.lang.Math.pow;

import java.awt.*;
import java.util.Scanner;

public class Ex3_homework_02 {

    public static void main(String[] args) {
        int h, w, r;//高,宽,半径
        Scanner scanner = new Scanner(System.in);
        h = scanner.nextInt();
        w = scanner.nextInt();
        r = scanner.nextInt();
        //Applet在JAVA9的时候就已经被淘汰弃用了,这里使用swing
        JFrame jFrame = new JFrame();
        JPanel jPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                RCBox rcBox = new RCBox(h, w, r);
                rcBox.drawPicture(g);
            }
        };
        jFrame.setContentPane(jPanel);
        jFrame.setSize(600, 300);
        jFrame.setLocationRelativeTo(null);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setVisible(true);

    }


}
//基本图形抽象类
abstract class Gbase {
    double area;
    double perimeter;

    public abstract void area();

    public abstract void perimeter();
}
//矩形类
class Rectangle extends Gbase {

    int height;
    int width;

    Rectangle(int length, int width) {
        this.height = length;
        this.width = width;
        area();
        perimeter();
    }

    @Override
    public void area() {
        area = height * width;
    }

    @Override
    public void perimeter() {
        perimeter = 2 * (height + width);
    }
}
//圆类
class Circle extends Gbase {
    int radius;

    Circle(int radius) {
        this.radius = radius;
        area();
        perimeter();
    }

    @Override
    public void area() {
        area = pow(radius, 2) * PI;
    }

    @Override
    public void perimeter() {
        perimeter = 2 * PI * radius;
    }
}
//目标类,外图形为矩形,内图形为圆形
class RCBox {
    Circle circle;
    Rectangle rectangle;
    double area;
    double perimeter;

    RCBox(int outterHeighth, int outterWidth
            , int innerRadius) {
        rectangle = new Rectangle(outterHeighth, outterWidth);
        circle = new Circle(innerRadius);
        this.area = rectangle.area - circle.area;
        this.perimeter = rectangle.perimeter + circle.perimeter;

    }

    public void drawPicture(Graphics g) {
        double min = rectangle.height > rectangle.width ? rectangle.height : rectangle.width;
        if (min / 2 - circle.radius < 10) {
            g.setColor(Color.blue);
            g.drawString("内部图形太大!", 0, 10);
        } else {
            g.setColor(Color.blue);
            g.setFont(new Font("宋体",Font.BOLD,20));//宋体,加粗,字体大小20
            g.drawString("有色区域面积为:" + area, rectangle.width, 20);
            g.drawString("有色区域周长为:" + perimeter, rectangle.width, 40);
            g.fillRect(0, 0, rectangle.width
                    , rectangle.height);
            g.setColor(Color.white);
            g.fillOval(rectangle.width / 2 - circle.radius, rectangle.height / 2 - circle.radius, 2 * circle.radius, 2 * circle.radius);
            //这个函数用于画椭圆,长短轴相等的椭圆就是圆了
        }

    }
}

![结果展示](https://img-blog.csdnimg.cn/20200323102038722.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JnbGt0,size_16,color_FFFFFF,t_70在这里插入图片描述
遇到的一些问题:

  • 圆形如何置于中心,画圆函数我个人看做是和画矩形的函数是一样画的,所以置于中心,用下图计算出圆的起始点坐标即可;
    计算坐标
  • 关于drawstring方法;可以看到代码的第一个drawstring的纵轴坐标是不为0,当将纵轴坐标改为0以后,会发现文字显示不全,查阅后,个人的理解为,drawstring方法的坐标为字的下方起始位置(把单个字看成一个矩形,这个坐标设置的是这个矩形左下方的坐标).想要验证也很简单,可以通过改变字体大小自行查看效果.

3.定义一个抽象的商品类,其中包含3个数据成员:商品号、商品名、商品价格,定义三个分别用来获取商品名、获取价格、修改价格的成员方法,一个抽象的输出数据成员的方法showInfo(),构造方法自行定义。请注意用适当的访问控制符和非访问控制符对属性和方法进行修饰。
在此基础上,定义继承于商品类的一个食品子类和一个玩具子类,除具有商品类的属性之外,食品类还应该包含生产日期、保质期、主要成分等信息,并定义一个设置保质期的方法;玩具类还应该包含型号、材料、安全级别等信息,并定义一个设置安全级别的方法;食品子类和玩具子类均需要实现其父类中的showInfo()方法,以输出类的完整信息。构造方法自行定义。
此外,要求编写一个测试程序,用恰当的测试数据创建食品类和玩具类对象,并调用有关方法,检验其运行结果是否正常。

package Ex3;

abstract class Commodity {
    protected String comId;
    protected String comName;
    protected double comPrice;

    public abstract void showInfo();

    public void setComPrice(double comPrice) {
        this.comPrice = comPrice;
    }

    public String getComName() {
        System.out.println("商品名称:" + comName);
        return comName;
    }

    public double getComPrice() {
        System.out.println("商品价格:" + comPrice + "元");
        return comPrice;
    }
}

商品抽象类

package Ex3;


import java.text.SimpleDateFormat;
import java.util.Date;

public class Grocery extends Commodity {
    private Date gdate;//日期或许也可以使用字符串
    private int glife;
    private String gcomposition;

    public void setGlife(int glife) {
        this.glife = glife;
    }


    public Grocery(String comId, String comName, double price,
            int glife, String gcomposition) {
        this.comId = comId;
        this.comName = comName;
        this.comPrice = price;
        this.gdate = new Date();//获取当前日期
        this.glife = glife;
        this.gcomposition = gcomposition;

    }

    @Override
    public void showInfo() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        System.out.println("食品编号:" + comId);
        System.out.println("食品名称:" + sdf.format(gdate));
        System.out.println("食品价格:" + comPrice + "元");
        System.out.println("食品生产日期:" + comName);//
        System.out.println("食品保质期:" + glife + "个月");
        System.out.println("食品主要成分:" + gcomposition);
    }
}

食品类

package Ex3;

public class Toy extends Commodity {
    private String tmodule;
    private String tmaterial;
    private int sercurity_level;

    public Toy(String comId, String comName, double price,
               String tmodule, String tmaterial, int sercurity_level) {
        this.comId = comId;
        this.comName = comName;
        this.comPrice = price;
        this.tmodule = tmodule;
        this.tmaterial = tmaterial;
        this.sercurity_level = sercurity_level;
    }

    public void setSercurity_level(int sercurity_level) {
        this.sercurity_level = sercurity_level;
    }

    @Override
    public void showInfo() {
        System.out.println("玩具编号:" + comId);
        System.out.println("玩具名称:" + comName);
        System.out.println("玩具价格:" + comPrice + "元");
        System.out.println("玩具型号:" + tmodule);
        System.out.println("玩具材料:" + tmaterial);
        System.out.println("玩具安全级别:" + sercurity_level + "级");
    }
}

玩具类

三个类分别放在Ex3包内.

package Javastudy;


import Ex3.Grocery;
import Ex3.Toy;

public class Ex3_homework_03_test {
    public static void main(String[] args) {
        Grocery grocery = new Grocery("00001","辣条",
                0.5,12,"大豆、辣椒");
        grocery.showInfo();
        System.out.println("------------------------------------------");
        grocery.getComName();
        grocery.getComPrice();
        grocery.setGlife(24);
        grocery.setComPrice(0.8);
        System.out.println("------------------------------------------");
        grocery.showInfo();

        System.out.println("------------------------------------------");

        Toy toy = new Toy("00002","神光棒",1000
                ,"迪迦变身器","Led灯,塑料",1);
        toy.showInfo();
        toy.setSercurity_level(2);
        System.out.println("------------------------------------------");
        toy.showInfo();
    }
}


测试类

食品编号:00001
食品名称:2020年03月23日 10:55:25
食品价格:0.5元
食品生产日期:辣条
食品保质期:12个月
食品主要成分:大豆、辣椒
------------------------------------------
商品名称:辣条
商品价格:0.5元
------------------------------------------
食品编号:00001
食品名称:2020年03月23日 10:55:25
食品价格:0.8元
食品生产日期:辣条
食品保质期:24个月
食品主要成分:大豆、辣椒
------------------------------------------
玩具编号:00002
玩具名称:神光棒
玩具价格:1000.0元
玩具型号:迪迦变身器
玩具材料:Led灯,塑料
玩具安全级别:1级
------------------------------------------
玩具编号:00002
玩具名称:神光棒
玩具价格:1000.0元
玩具型号:迪迦变身器
玩具材料:Led灯,塑料
玩具安全级别:2级

测试结果

遇到的问题

  • 这个作业应该想考察访问修饰符.为了让类封装得更好,尽量不要让类内的成员变量暴露出来,所以抽象类用protected,因为子类还需要用,而实现类就用private修饰成员变量.在我一开始写代码测试的时候,发现测试类还是可以访问到抽象类的成员变量,后来查阅知道,protected修饰的成员变量,包内的类都可以访问.我写作业的代码都放在一个包里面了,所以测试类仍然可以访问.把测试类和实现类分开就好

以上就是JAVA第三章作业的代码,由于个人能力原因以及没有观看配套视频,或许实现代码思路有所出入甚至出现错误,如果有相关纰漏,欢迎评论指出,共同学习,共同进步!

猜你喜欢

转载自blog.csdn.net/rglkt/article/details/105042264