目录
题目需求
编写一个名为Octagon的类,表示八边形。假设八边形八条边的边长都相等。它的面积可以使用下面的公式计算:
面积 = (2 + 4 / sqrt(2)) * 边长 * 边长
请实现Octagon类,其实现了Comparable和Cloneable接口。
1 有一个私有变量double side ,表示八边形的边长。
2 构造函数Octagon(double side),初始化side。
3 为side添加getter和setter方法。
4 double getPerimeter()方法,计算周长。
5 double getArea()方法,计算面积。
6 实现Comparable接口的方法 public int compareTo(Octagon o);
如果当前对象的边长比参数o的边长大,返回1,小则返回-1,相等返回0。
7 实现Cloneable接口的方法 protected Object clone()
编写一个测试程序,根据用户输入的浮点数作为边长,创建一个Octagon对象,然后显示它的面积和周长。使用clone方法创建一个新对象,并使用CompareTo方法比较这两个对象。
此题提交时将会附加裁判测试程序到被提交的Java程序末尾。
方法接口定义:
double getPerimeter(); double getArea(); 实现Comparable接口的方法 public int compareTo(Octagon o); 实现Cloneable接口的方法 protected Object clone();
###程序框架:
程序按以下框架进行设计后提交:
class Octagon implements Comparable<Octagon>,Cloneable{ …… @Override public int compareTo(Octagon o){ …… } @Override protected Object clone() { return this; } }
裁判测试程序样例:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Octagon a1 = new Octagon(input.nextDouble()); System.out.printf("Area is %.2f\n", a1.getArea()); System.out.println("Perimeter is " + a1.getPerimeter()); Octagon a2 = (Octagon) a1.clone(); System.out.println("Compare the methods " + a1.compareTo(a2)); } } /* 请在这里填写答案 */
输入样例:
5
输出样例:
Area is 120.71 Perimeter is 40.0 Compare the methods 0
接口(interface)
在Java中,我们用interface关键字来声明接口
什么是接口
- 在面向对象编程(OOP)中,接口是一种抽象类型,它定义了类或对象应该具有的方法和属性,但不包含具体的实现。类或对象可以实现(implement)接口,从而保证它们具有接口定义的行为,但实现细节可以各不相同。
- 接口的使用有助于提高代码的可维护性和可扩展性,因为它们定义了组件之间的清晰界限,并且降低了代码耦合度,使得各个组件可以独立开发、测试和修改。
接口的特点
接口是绝对抽象的类,这意味着:
- 接口不能被实例化
- 其中的方法必须全为抽象方法(这意味着其中的每个方法都必须被实现)
- 接口中没有构造方法
- 接口没有成员变量,其必须为final和static修饰的变量
接口的实现
- 类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
- 类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
完整代码
import java.util.Scanner;
class Octagon implements Comparable<Octagon>, Cloneable {
private double side; // 八边形的边长
// 构造函数,初始化边长
public Octagon(double side) {
this.side = side;
}
// 获取边长
public double getSide() {
return side;
}
// 设置边长
public void setSide(double side) {
this.side = side;
}
// 计算周长
public double getPerimeter() {
return 8 * side;
}
// 计算面积
public double getArea() {
return (2 + 4 / Math.sqrt(2)) * side * side;
}
// 实现Comparable接口的方法,比较边长大小
@Override
public int compareTo(Octagon o) {
if (this.side > o.getSide()) {
return 1; // 当前对象边长大于参数对象边长,返回1
} else if (this.side < o.getSide()) {
return -1; // 当前对象边长小于参数对象边长,返回-1
} else {
return 0; // 边长相等,返回0
}
}
// 实现Cloneable接口的方法,克隆对象
@Override
protected Object clone() {
try {
return super.clone(); // 调用父类的clone方法进行克隆
} catch (CloneNotSupportedException e) {
return null; // 处理克隆异常
}
}
}
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Octagon a1 = new Octagon(input.nextDouble()); // 创建Octagon对象,接收用户输入的边长
System.out.printf("Area is %.2f\n", a1.getArea()); // 输出面积
System.out.println("Perimeter is " + a1.getPerimeter()); // 输出周长
Octagon a2 = (Octagon) a1.clone(); // 克隆一个Octagon对象
System.out.println("Compare the methods " + a1.compareTo(a2)); // 比较两个对象的边长大小
}
}
后言
接口让程序的构建方便了许多,我们可以利用接口,事先架构好需要实现的方法,由于接口中每个方法都必须被实现的特性,当进行项目的具体实现时就不会丢三落四。同样的,接口也是实现多继承的方式,是实现多态的重要手段之一。
本篇博文就到这里了,博主也是初次接触接口,是个刚上路的小白,如有错误,还请海涵