一、类与对象
- 题目要求:
使用this调用已有的有参构造函数,width与length分别为5和6。
为Rectangle类覆盖toString。按照width=实际宽度值,length=实际长度值的格式输出
public Rectangle(){
this(5,6);
}
public Rectangle(int width, int length) {
this.width = width;
this.length = length;
}
public String toString(){
return "width=" + width + ",length=" + length;
}
- 设计一个矩形类Rectangle (20分)
设计一个名为Rectangle的类表示矩形。这个类包括: 两个名为width和height的double型数据域,它们分别表示矩形的宽和高。width和height的默认值都为1. 一个无参构造方法。 一个为width和height指定值的矩形构造方法。 一个名为getArea()的方法返回这个矩形的面积。 一个名为getPerimeter()的方法返回这个矩形的周长。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double w = input.nextDouble();
double h = input.nextDouble();
Rectangle myRectangle = new Rectangle(w, h);
System.out.println(myRectangle.getArea());
System.out.println(myRectangle.getPerimeter());
input.close();
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4966df591333a0c2fb19e9d2e805942e.png#pic_center)
class Rectangle{
double width = 1,height = 1;
public Rectangle() {}
public Rectangle(double width,double height) {
this.width = width;
this.height = height;
}
public double getArea() {
return width*height;
}
public double getPerimeter() {
return (width+height)*2;
}
}
- Book类的设计 (20分)
阅读测试程序,设计一个Book类。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1b9746c1b7edb94f4bcd1a26d16df61b.png#pic_center)
裁判测试程序样例:
import java.util.*;
public class Main {
public static void main(String[] args) {
List <Book>books=new ArrayList<Book>();
Scanner in=new Scanner(System.in);
for(int i=0;i<5;i++)
{ String str=in.nextLine();
String []data=str.split(",");
Book book=new Book(data[0],Integer.parseInt(data[1]),data[2],Integer.parseInt(data[3]));
books.add(book);
}
System.out.println(totalprice(books));
}
public static int totalprice(List <Book>books)
{ int result=0;
for(int i=0;i<books.size();i++){result+=books.get(i).getPrice();}
return result;
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/16b071526e855c65075b85749813a71a.png#pic_center)
class Book{
private String name,author;
private int price,date;
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public int getDate() {
return date;
}
public int getPrice() {
return price;
}
public void setName(String name) {
this.name = name;
}
public void setAuthor(String author) {
this.author = author;
}
public void setDate(int date) {
this.date = date;
}
public void setPrice(int price) {
this.price = price;
}
public Book(String name, int price,String author, int date) {
this.name = name;
this.author = author;
this.date = date;
this.price = price;
}
}
- 重写父类方法equals (20分)
在类Student中重写Object类的equals方法。使Student对象学号(id)相同时判定为同一对象。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/532622644447f34f174cc2d6c79f89f3.png#pic_center)
裁判测试程序样例:
import java.util.Scanner;
class Student {
int id;
String name;
int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Student s1 = new Student(sc.nextInt(),sc.next(),sc.nextInt());
Student s2 = new Student(sc.nextInt(),sc.next(),sc.nextInt());
System.out.println(s1.equals(s2));
sc.close();
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/43f0de406dc907b01ebfa4cdf217548d.png#pic_center)
@Override
public boolean equals(Object obj) {
Student std = (Student) obj;
if(this.id == std.id) {
return true;
}else
return false;
}
- 设计一个BankAccount类 (20分)
设计一个BankAccount类,这个类包括:
(1)一个int型的balance表时账户余额。
(2)一个无参构造方法,将账户余额初始化为0。
(3)一个带一个参数的构造方法,将账户余额初始化为该输入的参数。
(4)一个getBlance()方法,返回账户余额。
(5)一个withdraw()方法:带一个amount参数,并从账户余额中提取amount指定的款额。
(6)一个deposit()方法:带一个amount参数,并将amount指定的款额存储到该银行账户上。
设计一个Main类进行测试,分别输入账户余额、提取额度以及存款额度,并分别输出账户余额。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6f9b253e140e8a470faca91667058f64.png#pic_center)
import java.io.ObjectInputStream.GetField;
import java.util.Scanner;
class BankAccount{
int balance;
public int getBalance() {
return balance;
}
public BankAccount() {
this.balance = 0;
}
public BankAccount(int balance) {
this.balance = balance;
}
public int withdraw(int amount) {
return balance-=amount;
}
public int deposit(int amount) {
return balance+=amount;
}
}
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int balance,amount1,amount2;
balance = input.nextInt();
int balance1 = balance;
amount1 = input.nextInt();
amount2 = input.nextInt();
BankAccount bankAccount = new BankAccount(balance);
int result1 = bankAccount.withdraw(amount1);
int result2 = bankAccount.deposit(amount2);
System.out.println(balance1 + "\n" + result1 + "\n" + result2);
}
}
二、继承与多态
- 根据派生类写出基类(Java) (10分)
裁判测试程序样例中展示的是一段定义基类People、派生类Student以及测试两个类的相关Java代码,其中缺失了部分代码,请补充完整,以保证测试程序正常运行。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e03423ac5ec24971a8f3688f7258a446.png#pic_center)
裁判测试程序样例:
注意:真正的测试程序中使用的数据可能与样例测试程序中不同,但仅按照样例中的格式调用相关方法(函数)。
class People{
protected String id;
protected String name;
}
class Student extends People{
protected String sid;
protected int score;
public Student() {
name = "Pintia Student";
}
public Student(String id, String name, String sid, int score) {
super(id, name);
this.sid = sid;
this.score = score;
}
public void say() {
System.out.println("I'm a student. My name is " + this.name + ".");
}
}
public class Main {
public static void main(String[] args) {
Student zs = new Student();
zs.setId("370211X");
zs.setName("Zhang San");
zs.say();
System.out.println(zs.getId() + " , " + zs.getName());
Student ls = new Student("330106","Li Si","20183001007",98);
ls.say();
System.out.println(ls.getId() + " : " + ls.getName());
People ww = new Student();
ww.setName("Wang Wu");
ww.say();
People zl = new People("370202", "Zhao Liu");
zl.say();
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/748310b5f85840e1a76382af8e4a9189.png#pic_center)
public People(String id,String name) {
this.id = id;
this.name = name;
}
public People() {
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void say() {
System.out.println("I'm a person! My name is " + getName() + ".");
}
- 从抽象类shape类扩展出一个圆形类Circle (10分)
请从下列的抽象类shape类扩展出一个圆形类Circle,这个类圆形的半径radius作为私有成员,类中应包含初始化半径的构造方法。
裁判测试程序样例:
import java.util.Scanner;
import java.text.DecimalFormat;
abstract class shape {
public abstract double getArea( );
public abstract double getPerimeter( );
}
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
DecimalFormat d = new DecimalFormat("#.####");
double r = input.nextDouble( );
shape c = new Circle(r);
System.out.println(d.format(c.getArea()));
System.out.println(d.format(c.getPerimeter()));
input.close();
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3f9c2d904758f8ded710a8c9fca0c5de.png#pic_center)
class Circle extends shape{
private double radius;
final double PI = 3.1415926535;
public double getRadius() {
return radius;
}
public Circle(double radius) {
this.radius = radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * PI * radius;
}
}
- 图书和音像租赁 (10分)
图书和音像店提供出租服务,包括图书和DVD的出租。图书包括书名(String,一个词表示)和价格(double),DVD包括片名(String,一个词表示)。它们都是按天出租,但租金计算方式却不同,图书的日租金为图书价格的1%,DVD的日租金为固定的1元。构造图书和DVD类的继承体系,它们均继承自Media类,且提供方法getDailyRent()返回日租金,构造音像店类MediaShop,提供静态函数double calculateRent(Media[] medias, int days)。 在main函数中构造了Media数组,包含图书和DVD的对象,调用calculateRent方法得到并输出租金,保留小数点两位
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/76e33f537ecef667dad82a1f324bb588.png#pic_center)
裁判测试程序样例:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Media[] ms = new Media[n];
for (int i=0; i<n; i++) {
String type = sc.next();
if (type.equals("book")) {
ms[i] = new Book(sc.next(), sc.nextDouble());
}else {
ms[i] = new DVD(sc.next());
}
}
double rent = MediaShop.calculateRent(ms, sc.nextInt());
System.out.printf("%.2f", rent);
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ec8a7046bbfb12534c9bf096476a358e.png#pic_center)
class Book extends Media{
String name;
double price;
Book(String name,double price) {
this.name = name;
this.price = price;
}
@Override
public double getDailyRent() {
return price*0.01;
}
}
class Media{
public double getDailyRent() {
return 0;
}
}
class MediaShop{
public static double calculateRent(Media[] medias,int days) {
double sum = 0;
for (int i = 0; i < medias.length; i++) {
sum += medias[i].getDailyRent()*days;
}
return sum;
}
}
class DVD extends Media{
String name;
public DVD(String name) {
this.name = name;
}
@Override
public double getDailyRent() {
return 1;
}
}
- 设计一个Triangle类继承自GeometricObject类 (10分)
设计一个名为Triangle的类来扩展GeometricObject类。该类包括:
■ 三个名为side1、side2和side3的double数据域表示这个三角形的三条边,它们的默认值是1.0。
■ 一个无参构造方法创建默认的三角形。
■ 一个能创建带制定side1、side2和side3的三角形的构造方法。
■ 所有三个数据域的访问器方法。
■ 一个名为getArea()的方法返回这个三角形的面积。
■ 一个名为getPerimeter()的方法返回这个三角形的周长。
■ 一个名为toString()的方法返回这个三角形的字符串描述。
toString()方法的实现如下所示:
return “Triangle: side1 = " + side1 + " side2 = " + side2 +” side3 = " + side3;
编写一个测试程序,提示用户输入三角形的三条边、颜色以及一个Boolean值表明该三角形是否填充。程序应该使用输入创建一个具有这些边并设置color和filled属性的三角形。程序应该显示面积、周长以及边长。
系统会自动提交Main类和GeometricObject类。
裁判测试程序样例:
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double side1 = input.nextDouble();
double side2 = input.nextDouble();
double side3 = input.nextDouble();
Triangle triangle = new Triangle(side1, side2, side3);
String color = input.next();
triangle.setColor(color);
boolean filled = input.nextBoolean();
triangle.setFilled(filled);
System.out.println("The area is " + triangle.getArea());
System.out.println("The perimeter is "
+ triangle.getPerimeter());
System.out.println(triangle);
}
}
class GeometricObject {
private String color = "white";
private boolean filled;
private java.util.Date dateCreated;
public GeometricObject() {
dateCreated = new java.util.Date();
}
public GeometricObject(String color, boolean filled) {
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public boolean isFilled() {
return filled;
}
public void setFilled(boolean filled) {
this.filled = filled;
}
public java.util.Date getDateCreated() {
return dateCreated;
}
@Override
public String toString() {
return "created on " + dateCreated + "\ncolor: " + color + "and filled: " + filled;
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d34439a1f541a2c79246c80a781b9839.png#pic_center)
class Triangle extends GeometricObject{
private double side1 = 1.0,side2 = 1.0,side3 = 1.0;
public Triangle() {
}
public Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public double getSide1() {
return side1;
}
public double getSide2() {
return side2;
}
public double getSide3() {
return side3;
}
public void setSide1(double side1) {
this.side1 = side1;
}
public void setSide2(double side2) {
this.side2 = side2;
}
public void setSide3(double side3) {
this.side3 = side3;
}
public double getArea() {
double p = (side1 + side2 + side3) / 2;
return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
}
public double getPerimeter() {
return side1 + side2 + side3;
}
@Override
public String toString() {
return "Triangle: side1=" + side1 + " side2=" + side2 +" side3=" + side3;
}
}