【java笔记】 5 接口使用举例

news2024/9/27 8:51:00

在这里插入图片描述

// 导入Swing库中的消息对话框组件
import javax.swing.*;

// 定义一个Circle类,该类实现了ShapeInterface接口
public class Circle implements ShapeInterface {
// 定义一个私有变量radius来保存圆的半径
private double radius;

// 默认构造函数,初始化一个半径为0的圆
public Circle() {
    setRadius(0);
}

// 带参数的构造函数,初始化一个具有指定半径的圆
public Circle(double r) {
    setRadius(r);
}

// 设置半径的方法,确保半径总是非负数
public void setRadius(double r) {
    // 如果输入的半径为负数,则取其绝对值
    this.radius = r < 0 ? -r : r;
}

// 计算并返回圆的面积
public double area() {
    // 使用圆面积公式π * r^2
    return Math.PI * radius * radius;
}

// 计算并返回圆的体积,由于圆是二维的,这里总是返回0
public double volume() {
    return 0;
}

// 返回形状的名字,这里返回的是一个代表圆的字符
public String getName() {
    // 这里返回的是一个字符 "Բ",可能需要根据实际情况修改为更合适的名字
    return "Բ";
}

// 主函数,程序的入口
public static void main(String[] args) {
    // 创建一个半径为22的圆实例
    Circle circle = new Circle(22);

    // 初始化一个空字符串用于构建输出信息
    String output = "\n";

    // 构建输出信息字符串
    output += circle.getName() + "\n"
            + circle.toString() + "\n面积=" + circle.area()
            + "\n体积=" + circle.volume();

    // 显示一个包含输出信息的消息对话框
    // 标题应该是中文的 "圆的信息",这里需要修正乱码问题
    JOptionPane.showMessageDialog(
            null, output, "圆的信息",
            JOptionPane.INFORMATION_MESSAGE);
}

}

// 定义一个ShapeInterface接口,所有实现此接口的类都必须提供以下方法
public interface ShapeInterface {
// 计算并返回形状的面积
public double area();

// 计算并返回形状的体积(对于二维形状,可以返回0)
public double volume();

// 返回形状的名字
public String getName();

}

设计思路

这段代码的主要目的是定义一个圆的类 Circle,该类实现了 ShapeInterface 接口,提供了计算面积和体积的方法,并且能够显示圆的信息。

接口 ShapeInterface

首先,我们定义了一个接口 ShapeInterface,它包含了三个方法:

  1. area():计算形状的面积。
  2. volume():计算形状的体积(对于二维形状,这个方法通常返回0)。
  3. getName():返回形状的名称。

Circle

接着,我们定义了一个具体的类 Circle,它实现了上述接口。

属性
  • private double radius:用于存储圆的半径。
构造函数
  • public Circle():默认构造函数,初始化一个半径为0的圆。
  • public Circle(double r):带参数的构造函数,初始化一个具有指定半径的圆。
方法实现
  • public void setRadius(double r):设置圆的半径,并确保半径总是非负数。
  • public double area():根据圆的半径计算并返回圆的面积。
  • public double volume():对于圆这样的二维形状,体积概念不适用,因此这个方法总是返回0。
  • public String getName():返回圆的名称。在这个例子中返回了一个字符 “Բ”,实际应用中应该返回更具描述性的名称。
主函数 main
  • public static void main(String[] args):这是程序的入口点。在这个方法中,创建了一个半径为22的圆实例,并构建了一个字符串 output 来展示圆的相关信息。
  • 使用 JOptionPane.showMessageDialog 显示一个包含圆的信息的消息对话框。

分析与改进

代码分析
  1. 接口定义ShapeInterface 提供了通用的几何形状方法,使得不同的形状可以遵循相同的行为模式。
  2. 类定义Circle 实现了 ShapeInterface 接口,并且添加了必要的属性和逻辑来描述圆的特征。
  3. 构造函数:构造函数确保可以创建不同半径的圆实例,并且默认构造函数初始化一个半径为0的圆。
  4. 方法实现setRadius 方法保证半径非负;area 方法计算圆的面积;volume 方法对于圆没有实际意义,返回0;getName 方法返回圆的名称。
主函数

主函数创建了一个半径为22的圆实例,并展示了圆的信息。使用 JOptionPane 可以方便地在GUI环境中显示信息。

改进建议
  1. getName() 方法:建议返回更具描述性的名称,例如 “Circle” 或者 “圆形”。
  2. 消息对话框标题:将 "��\" 替换为正确的中文标题,例如 "圆的信息"
  3. 输出信息格式化:可以考虑使用更清晰的格式来展示输出信息,比如使用 String.format 方法来格式化字符串。

改进后的 main 方法示例

public static void main(String[] args) {
    Circle circle = new Circle(22);

    // 构建输出信息字符串
    String output = String.format("\n形状名称:%s\n面积:%.2f\n体积:%.2f",
            circle.getName(), circle.area(), circle.volume());

    // 显示一个包含输出信息的消息对话框
    JOptionPane.showMessageDialog(
        null, output, "圆的信息",
        JOptionPane.INFORMATION_MESSAGE);
}

总结

通过以上分析,我们可以看到这段代码实现了一个简单的几何形状类 Circle,并且通过继承接口 ShapeInterface 来保持代码的可扩展性和一致性。改进后的代码提高了可读性和用户体验,使得输出信息更加清晰明了。

扩展设计思路

多个形状的支持

既然已经有了 ShapeInterface 接口,我们可以考虑支持更多的形状。例如,可以定义 RectangleTriangle 等类,并让它们实现 ShapeInterface 接口。这将使程序变得更加通用,并且可以通过接口实现多态性。

抽象类或基类

为了减少代码重复,可以考虑创建一个抽象类 AbstractShape,它实现 ShapeInterface 接口,并提供一些通用的方法或属性,如 getName()。然后,所有的具体形状类(如 CircleRectangle 等)都可以继承自这个抽象类。

GUI 支持

目前的程序只是简单地显示了一个消息对话框,显示了形状的信息。如果要构建一个完整的图形用户界面(GUI)应用程序,可以考虑使用 Swing 或 JavaFX 来创建一个窗口,允许用户选择形状类型、输入尺寸等,并动态显示形状的属性。

示例:添加 Rectangle 类

让我们添加一个矩形类 Rectangle 并让它实现 ShapeInterface 接口:

public class Rectangle implements ShapeInterface {
    private double width;
    private double height;

    public Rectangle() {
        this.width = 0;
        this.height = 0;
    }

    public Rectangle(double w, double h) {
        setWidth(w);
        setHeight(h);
    }

    public void setWidth(double w) {
        this.width = w > 0 ? w : 0; // 确保宽度非负
    }

    public void setHeight(double h) {
        this.height = h > 0 ? h : 0; // 确保高度非负
    }

    @Override
    public double area() {
        return width * height;
    }

    @Override
    public double volume() {
        return 0; // 矩形是二维的,所以体积为0
    }

    @Override
    public String getName() {
        return "Rectangle"; // 返回矩形的名称
    }
}

示例:使用 JavaFX 构建 GUI

如果您想构建一个简单的 GUI 应用程序来选择形状并显示相关信息,可以使用 JavaFX。下面是一个简化的示例,演示如何创建一个基本的 JavaFX 应用程序:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ShapeApp extends Application {

    private ShapeInterface shape;

    @Override
    public void start(Stage primaryStage) {
        Label radiusLabel = new Label("半径:");
        TextField radiusField = new TextField();
        Button createButton = new Button("创建圆");

        createButton.setOnAction(e -> {
            try {
                double radius = Double.parseDouble(radiusField.getText());
                shape = new Circle(radius);
                showShapeInfo();
            } catch (NumberFormatException ex) {
                System.out.println("请输入有效的数字");
            }
        });

        VBox layout = new VBox(radiusLabel, radiusField, createButton);
        Scene scene = new Scene(layout, 200, 250);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void showShapeInfo() {
        System.out.println("形状名称: " + shape.getName());
        System.out.println("面积: " + shape.area());
        System.out.println("体积: " + shape.volume());
    }

    public static void main(String[] args) {
        launch(args);
    }
}

在这个示例中,我们创建了一个简单的 JavaFX 应用程序,允许用户输入圆的半径,并创建一个 Circle 对象。当用户点击“创建圆”按钮时,会创建一个圆对象,并在控制台中显示圆的信息。

总结

通过这些扩展,我们可以看到,从简单的控制台应用程序到具有图形用户界面的完整应用程序,逐步增加了功能并改善了用户体验。同时,通过接口和抽象类,代码的可维护性和扩展性也得到了提高。未来还可以继续添加更多功能,如支持更多的形状类型、增加图形绘制能力等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十一章 Java多线程--阻塞队列--PriorityBlockingQueue

目录 一、PriorityBlockingQueue基础概念 主要特点 常用方法 使用示例 二、PriorityBlockingQueue深入了解 1 PriorityBlockingQueue介绍 2 二叉堆结构介绍 3 PriorityBlockingQueue核心属性 4 PriorityBlockingQueue的写入操作 4.1 offer基本流程 4.2 offer扩容操作…

【伺服】Servo入坑学习记录①

前言 这是一个自我摸索的过程&#xff0c;如果有什么良好的、或严厉的批评和建议&#xff0c;恳请指教&#xff0c; 万分感谢经典控制理论中&#xff0c;有几个重要的概念和工具&#xff0c;用于分析和设计控制系统。以下是对 传递函数、伯德图、奈奎斯特图、稳定裕度 和 带宽 …

【Elasticsearch】-文本向量化

由于使用了QAnything 本地知识库应答平台 内部已集成Embedding 文本向量化服务&#xff0c;因此不在单独部署。 基于 transformers 如果需要单独部署&#xff0c;可以参看 BCEmbedding/README_zh.md at master netease-youdao/BCEmbedding GitHub 从启动脚本中可以看出&am…

脚手架是什么?详细版+通俗易懂版!!!!!!

脚手架&#xff08;Scaffolding&#xff09;在软件开发领域&#xff0c;特别是在前端开发和全栈开发环境中&#xff0c;是一个术语&#xff0c;用来描述一个辅助工具或框架&#xff0c;它旨在帮助开发者快速搭建项目的基础结构和开发环境。这些基础结构可能包括项目的目录结构、…

Android Input系统原理一

1. getevent 命令使用 getevent -h getevent -lrt-t 表示事件发生时间 -l label event types and names in plain text 表示把event事件类型名字打出来 -r 显示一下接受事件速率130|console:/ # getevent -lrt could n…

aloam框架laserMapping.cpp源码解读

一、详细源码解读 #include <math.h> #include <vector> #include <aloam_velodyne/common.h> #include <nav_msgs/Odometry.h> #include <nav_msgs/Path.h> #include <geometry_msgs/PoseStamped.h> #include <pcl_conversions/pcl_c…

动手学深度学习8.7. 通过时间反向传播-笔记练习(PyTorch)

本节课程地址&#xff1a;本节无视频 本节教材地址&#xff1a;8.7. 通过时间反向传播 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptrons>bptt.ipynb 通过时间反向传播 到目前为止&…

[通义灵码] IDE 插件实现企业知识库问答

在2024杭州云栖大会上&#xff0c;随着通义大模型能力的全面提升&#xff0c;阿里云通义灵码迎来重磅升级&#xff0c;从一年前只能完成基础的辅助编程任务&#xff0c;进化到几句话就能完成需求理解、任务拆解、代码编写、修改BUG、测试等开发任务&#xff0c;最快几分钟可从0…

XSS | DOM 型 XSS 攻击

关注这个漏洞的其他相关笔记&#xff1a;XSS 漏洞 - 学习手册-CSDN博客 0x01&#xff1a;DOM 型 XSS —— 理论篇 DOM 全称 Document Object Model&#xff0c;使用 DOM 可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。 DOM 型 XSS 是一种特殊类型的反射型 XSS&…

系统实现悬浮窗-菜单-悬浮按钮功能

文章目录 需求&#xff1a;系统实现悬浮窗菜单功能或悬浮小球定制功能实际手机产品效果悬浮窗作用 一、实际应用场景二、应用上面实现功能思路Demo演示效果部分源码分析Service层View层View初始化view 添加到窗体悬浮球拖动重点代码&#xff1a; 三、系统上面实现功能思路系统服…

秒懂Linux之信号

目录 信号的基本概念 信号的处理方式 默认动作 自定义处理信号 忽略该信号 信号的产生方式 kill命令 键盘组合键 系统调用 软件条件 异常 信号产生的深层理解 core的功能 信号的阻塞 内核中的表示 sigset_t 信号集操作函数 sigprocmask sigpending …

do while循环

/while(条件) {满足条件执行的代码&#xff0c;循环体 } /* do 做 */ while (false) { Console.WriteLine(" while循环执行了"); } do { //循环体逻辑 Console.WriteLine("dowhile循环执行了"); } while (true); Console.ReadLine(); /* w…

数据库索引:最左匹配原则——提升数据库的查询性能

数据库索引&#xff1a;最左匹配原则——提升数据库的查询性能 1、核心要点2、实例3、建议 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在数据库优化中&#xff0c;组合索引的使用深受最左匹配原则的影响。这一原则是提升查询效率的关键…

详细分析Nginx中的proxy_pass 末尾斜杠

目录 前言1. 基本知识2. Demo 前言 对于Nginx的讲解&#xff0c;更多推荐阅读&#xff1a; Nginx配置静态网页访问&#xff08;图文界面&#xff09;Nginx将https重定向为http进行访问的配置&#xff08;附Demo&#xff09;Nginx从入门到精通&#xff08;全&#xff09;详细分…

[Java EE] TCP 协议

Author&#xff1a;MTingle major:人工智能 Build your hopes like a tower! 文章目录 文章目录​​​​​​​ 一. TCP 协议 二. TCP 特性 1. 确认应答(ack) 2. 超时重传 3. 连接管理 三次握手 四次挥手 TCP状态 4 滑动窗口 5. 流量控制 6.拥塞控制 7. 延时应答 8.捎带应答 9…

前端性能初探

前端监控 提升稳定性&#xff0c;更快的发现异常&#xff0c;定位异常&#xff0c;解决异常&#xff0c;js错误&#xff0c;接口异常&#xff0c;资源异常&#xff0c;白屏等。 关注用户体验&#xff0c;建立性能规范&#xff0c;长期关注优化&#xff0c;页面性能&#xff0c…

TopOn对话游戏魔客:2024移动游戏广告应如何突破?

TopOn对话游戏魔客&#xff1a;2024移动游戏广告应如何突破&#xff1f; 近年来&#xff0c;游戏广告投放的成本日益走高&#xff0c;ROI如何回正&#xff0c;素材如何创新等问题困扰着每一个广告主。在隐私政策的实施下&#xff0c;广告投放难度也在不断升级。 据data.ai发布…

MK米客方德SD NAND参考设计

一、电路设计 参考电路&#xff1a; R1~R5 (10K-100 kΩ)是上拉电阻&#xff0c;当SD NAND处于高阻抗模式时&#xff0c;保护CMD和DAT线免受总线浮动。 即使主机使用SD NAND SD模式下的1位模式&#xff0c;主机也应通过上拉电阻上拉所有的DATO-3线。 R6&#xff08;RCLK&…

解决图片放大模糊

首先需要了解设备像素和CSS像素&#xff0c;CSS像素 是 Web 开发中的逻辑像素&#xff0c;设计者根据这些像素来布局页面。设备像素 是设备屏幕上的实际像素点数。 DPR 是 设备像素 和 CSS像素 的比率&#xff0c;所以进行缩放后&#xff0c;也需要对图片尺寸进行处理&#xf…

【HarmonyOS】鸿蒙自定义TabLayout示例

【HarmonyOS】自定义TabLayout代码示例&#xff0c;通过 Scroll 锚点 Tab 布局&#xff0c;滚动条会自动滚动使选中的标签居中显示。 class MyTabItem {label: string "";positionX: number -1; // 当前位置width: number -1; // 当前宽度constructor(label: stri…