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