一、概念
接口是抽象方法的集合,是一种统一的操作标准,可以理解为现实生活中的USB接口。
一个类通过继承接口的方式,从而来继承接口的抽象方法。接口的编写方式与类相似,但接口并不是类。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
二、实例
任务:
编写一个能求解多种平面图形(矩形、梯形、圆形、三角形)面积与周长的程序。要求:
(1)程序运行时,用户能选择图形类型;
(2)用户选择图形类型后,程序提示输入确定该图形面积和周长的必要属性值;
(3)用户输入属性值后,程序能自动显示求解结果。
(4)求解完了一种图形周长面积后,程序再次返回(1),使用户能重新选择图形类型,也可以选择退出程序;
构造:
设计一个菜单类,展示平面图形的操作界面。用户可以通过输入序号选择要计算的图形。
设计一个接口,分别定义图形初始数据输入、判断能否构成图形、计算图形周长、计算图形面积 共 4 个抽象方法。
设计矩形、梯形、圆形、三角形等图形的类,依次继承并实现接口的抽象方法。
UML图:
代码:
Menu.java(菜单类)
import java.util.Scanner;
public class Menu {
/**
* 显示图形计算器界面
* */
public static void showMenu(){
System.out.println("\n=====欢迎使用图形计算器======");
System.out.println("1 -- 矩形");
System.out.println("2 -- 梯形");
System.out.println("3 -- 三角形");
System.out.println("4 -- 圆形");
System.out.println("=========================");
}
/**
* @Description 选择图形序号
*/
public static int chooseMenu(){
System.out.print("请输入你需要计算的图形序号:");
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
while (i<=0 || i>4){
System.out.println("输入范围错误,请重新输入!");
i = sc.nextInt();
}
return i;
}
/**
* 主函数
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Plugin plugin = new Plugin();
do {
Menu.showMenu();
switch (Menu.chooseMenu()) {
case 1:
Graphics graphics = new Rectangular();
plugin.plugin(graphics);
break;
case 2:
graphics = new Trapezoidal();
plugin.plugin(graphics);
break;
case 3:
graphics = new Triangle();
plugin.plugin(graphics);
break;
case 4:
graphics = new Round();
plugin.plugin(graphics);
break;
default:
System.out.println("输入错误,请重新输入!");
}
System.out.println("\n是否结束?\n结束请输0,否则请输入任意数:");
} while (CatchError.catchInt("","\t[警告]请输入一个整数!\n") != 0);
}
}
class Plugin {
public void plugin(Graphics graphics){
graphics.graphicsInput();
if(graphics.graphicsJudge()) {
System.out.println("周长为" + graphics.calculatePerimeter());
System.out.println("面积为" + graphics.calculateArea());
}
else
System.out.println("输入的条件不能构成图形!");
}
}
Graphics.java(接口)
public interface Graphics {
/**
* @Description 图形条件输入
* */
void graphicsInput();
/**
* @Description 判断能否构成图形,能够构成返回true,否则返回false
* */
boolean graphicsJudge();
/**
* @Description 计算图形面积,返回计算结果
* */
double calculateArea();
/**
* @Description 计算图形周长,返回计算结果
* */
double calculatePerimeter();
}
Rectangular.java(矩形类)
/**
* @author 鷾
* @Description 计算矩形的周长和面积
*/
public class Rectangular implements Graphics{
/** 长度 */
private double length;
/** 宽度 */
private double height;
/**
* @Description 判断能否构成图形
* */
public boolean graphicsJudge(){
return true;
}
/**
* @Description 输入长方形的信息
* */
public void graphicsInput(){
System.out.print("输入长度:");
length = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入长度:");
System.out.print("输入宽度:");
height = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入宽度:");
}
/**
* @Description 计算面积
* */
public double calculateArea(){
return length*height;
}
/**
* @Description 计算周长
* */
public double calculatePerimeter(){
return 2*(length+height);
}
}
Trapezoidal.java(梯形类)
/**
* @author 鷾
* @Description 计算梯形的周长和面积
*/
public class Trapezoidal implements Graphics{
/** 梯形下底 */
private double bottom;
/** 梯形上底 */
private double top;
/** 梯形高 */
private double height;
/** 梯形右斜边 */
private double rightEdge;
/** 梯形左斜边 */
private double leftEdge;
/**
* @Description 判断能否构成图形
* */
public boolean graphicsJudge(){
return true;
}
/**
* @Description 输入梯形的信息
* */
public void graphicsInput(){
System.out.print("输入下底的长度:");
bottom = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入下底的长度:");
System.out.print("输入上底的长度:");
top = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入上底的长度:");
System.out.print("输入高:");
height = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入高:");
System.out.print("输入右斜边的长度:");
rightEdge = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n右斜边的长度:");
System.out.print("输入左斜边的长度:");
leftEdge = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入左斜边的长度:");
}
/**
* @Description 计算面积
* */
public double calculateArea(){
return (top+bottom)*height/2;
}
/**
* @Description 计算周长
* */
public double calculatePerimeter(){
return bottom+top+rightEdge+leftEdge;
}
}
Triangle.java(三角形类)
/**
* @author 鷾
* @Description 计算三角形的周长和面积
*/
public class Triangle implements Graphics{
/** 三角形的边a */
private double a;
/** 三角形的边b */
private double b;
/** 三角形的边c */
private double c;
/**
* @Description 判断三角形是否成立
* */
public boolean judge() {
return a + b > c && b + c > a && a + c > b;
}
/**
* @Description 判断能否构成图形
* */
public boolean graphicsJudge(){
return judge();
}
/**
* @Description 输入三角形的信息
* */
public void graphicsInput(){
System.out.println("依次输入三条边的长度:");
a = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入第一条边的长度:");
b = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入第二条边的长度:");
c = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入第三条边的长度:");
}
/**
* @Description 计算面积
* */
public double calculateArea(){
double s = (a + b + c) / 2f;
return (float) Math.sqrt(s * (s - a) * (s - b) * (s - c));
}
/**
* @Description 计算周长
* */
public double calculatePerimeter(){
return a + b + c;
}
}
Round.java(圆形类)
/**
* @author 鷾
* @Description 计算圆形的周长和面积
*/
public class Round implements Graphics{
/** 半径 */
private double r;
/**
* @Description 判断能否构成图形
* */
public boolean graphicsJudge(){
return true;
}
/**
* @Description 输入圆形的信息
* */
public void graphicsInput(){
System.out.print("输入半径的长度:");
r = CatchError.catchDouble("","\t[警告]请输入一个整数或者小数!\n输入半径:");
}
/**
* @Description 计算面积
* */
public double calculateArea(){
return Math.PI*r*r;
}
/**
* @Description 计算周长
* */
public double calculatePerimeter(){
return 2*Math.PI*r;
}
}
CatchError.java(用于对输入的内容进行类型判断)
import java.util.Scanner;
public class CatchError {
/**
* @param promptMessage 输入提示信息
* @param errMessage 错误提示信息
* @return 输入的浮点型
* @Description 对输入浮点型进行判断
* */
public static double catchDouble(String promptMessage, String errMessage) {
Scanner sc = new Scanner(System.in);
System.out.print(promptMessage);
while(true) {
try {
return sc.nextDouble();
} catch (Exception var3) {
System.out.print(errMessage);
sc.nextLine();
}
}
}
/**
* @param promptMessage 输入提示信息
* @param errMessage 错误提示信息
* @return 输入的整型
* @Description 对输入整型进行判断
* */
public static int catchInt(String promptMessage, String errMessage) {
Scanner sc = new Scanner(System.in);
System.out.print(promptMessage);
while(true) {
try {
return sc.nextInt();
} catch (Exception var3) {
System.out.print(errMessage);
sc.nextLine();
}
}
}
/**
* @param promptMessage 输入提示信息
* @param errMessage 错误提示信息
* @return 输入的字符串
* @Description 对输入字符串进行判断
* */
public static String catchString(String promptMessage, String errMessage) {
Scanner sc = new Scanner(System.in);
System.out.print(promptMessage);
while(true) {
try {
return sc.next();
} catch (Exception var4) {
System.out.print(errMessage);
sc.nextLine();
}
}
}
}