面向对象—有理数类的设计

news2025/4/19 15:09:15

目录

1.代码呈现

1.1编写toString、equals方法

1.2测试代码

1.3有理数类的代码

2.论述题

3.有理类设计

1.代码呈现

1.1编写toString、equals方法

(1)toString方法

@Override
    public String toString(){
        if(this.v2==0){
            return "Undefined";
        }
        return this.v1 +"/"+ this.v2;
    }

(2)equals方法

 @Override
    public boolean equals(Object obj) {
        // 首先检查引用是否相同
        if (this == obj) {
            return true;
        }
        // 检查是否为同一个类的对象
        if (!(obj instanceof Rational)) {
            return false;
        }
        // 强制转换为 Rational 类型
        Rational other = (Rational) obj;
        // 检查分母是否为零,如果其中一个对象的分母为零,则它们不能相等
        if( v2 == 0 || other.v2 == 0) {
            return false;
        }
        // 计算两个有理数的交叉乘积并比较
        return (v1 * other.v2) == (other.v1 * v2);
    }

1.2测试代码

(1)在与有理数类不同包的其他类中调用有理数类

(2)测试代码与测试结果

package test01;

import Rational.Rational;

public class Rationaltest {
    public static void main(String[] args) {
        // 创建两个有理数对象
        Rational r1 = new Rational(1, 2); // 1/2
        Rational r2 = new Rational(3, 4); // 3/4

        // 创建第三个对象用于存放结果
        Rational result = new Rational(0, 1);//分母不能为0

        // 测试加法
        System.out.println("Adding 1/2 and 3/4:");
        r1.Add(r1, r2, result);
        System.out.println("Result= " + result.getV1() + "/" + result.getV2());

        // 测试乘法
        System.out.println("Multiplying 1/2 and 3/4:");
        r1.Multiply(r1, r2, result);
        System.out.println("Result= " + result.getV1() + "/" + result.getV2());
        //测试getRational
        System.out.println("getRational:");
        int e=0;
        System.out.println("e="+r1.getRational(r1,2,e));
        //toString
        System.out.println("r1 的输出结果为: ");
        System.out.println("r1 = "+r1.toString());
        //equals
        System.out.println("r1和r2的比较结果为:");
        System.out.println(r1.equals(r2));

    }
}

1.3有理数类的代码

package Rational;

public class Rational{
    //属性
   private int v1;
   private int v2;
    //构造函数
    public Rational(int v1,int v2){
        this.v1=v1;
        this.v2=v2;
    }
    //setter与getter
    public int getV1() {
        return v1;
    }
    public void setV1(int v1) {
        this.v1 = v1;
    }
    public int getV2() {
        return v2;
    }
    public void setV2(int v2) {
        this.v2 = v2;
    }
    //方法
    //add方法
    public void Add(Rational T1,Rational T2,Rational T3){
        int t;
        T3.v2 = T1.v2 * T2.v2;
        T3.v1 = T1.v1 * T2.v2 + T2.v1 * T1.v2;
        t = Gcd(T3.v2,T3.v1);
        T3.v2 /= t;
        T3.v1 /= t;
    }
    //Multiply方法
    public void Multiply(Rational T1,Rational T2,Rational T3){
        int t;
        T3.v2 = T1.v2 * T2.v2;
        T3.v1 = T1.v1 * T2.v1;
        t = Gcd(T3.v2, T3.v1);
        T3.v2 /= t;
        T3.v1 /= t;
    }
    private static int Gcd(int m,int n){
        int t;
        while(m % n != 0)
        {
            t = n;
            n = m%n;
            m = t;
        }
        return n;
    }
    public int getRational(Rational T,int i,int e){
        if(i==1){
            e=T.v1;
        }
        else{
            e=T.v2;
        }
        return e;
    }
    @Override
    public String toString(){
        if(this.v2==0){
            return "Undefined";
        }
        return this.v1 +"/"+ this.v2;
    }
    @Override
    public boolean equals(Object obj) {
        // 首先检查引用是否相同
        if (this == obj) {
            return true;
        }
        // 检查是否为同一个类的对象
        if (!(obj instanceof Rational)) {
            return false;
        }
        // 强制转换为 Rational 类型
        Rational other = (Rational) obj;
        // 检查分母是否为零,如果其中一个对象的分母为零,则它们不能相等
        if( v2 == 0 || other.v2 == 0) {
            return false;
        }
        // 计算两个有理数的交叉乘积并比较
        return (v1 * other.v2) == (other.v1 * v2);
    }
}

2.论述题

1.尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

(1)

  • 在Java中,我们利用类来封装数据和行为。我们将有理数的分子分母封装在一个类里,并通过方法(get方法)的调用来访问数据,且类里的数据都被保护起来,不允许外部直接修改。
  • 而在C语言中,通常利用结构体来存储数据,数据是公开的可以任意修改。

(2)

  • 在 Java 中,方法属于类的一部分。每个 Rational对象都有自己的方法,如加法、减法等。这些方法可以直接在对象上调用,使得代码更加直观和易于理解。
  • 在 C 语言中,方法通常是独立于数据结构的全局函数。虽然可以通过传递指向结构体的指针来操作数据,但这不如 Java 中的对象方法那样自然。

(3)

  • Java 支持继承,允许从现有类派生新类(利用extends关键字)。子类可以复用父类的行为并添加新的特性。
  • C 语言没有内置的继承机制。虽然可以通过包含结构体或其他技巧来模拟继承,但这种做法并不像 Java 中那么直接和强大。

2. 尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。

2.1别人如何复用你的代码? 

(1)通过注释了解类的属性和方法,必要时在JDK文档中查找类的功能

(2)通过代码测试检测代码是否可以正常运行

2.2别人的代码是否依赖你的有理数类的内部属性?当你升级了你的有理数类,将其的属性名改变时。是否会影响他人以前编写的调用你有理数类的代码(假设他将使用了你升级后有理数类)?

(1)封装是面向对象编程的一个核心原则,它确保了对象的内部状态对外部是不可见的,并且只能通过定义好的方法来访问和修改。

(2)私有化(private)Rational类的属性且提供公共的方法(getV1()和getV2())访问。

(3)ational 类遵循了良好的封装原则,并且外部代码只通过公共接口(如 getter 和 setter 方法、运算方法等)来访问和操作 Rational 对象,那么更改类的内部属性名不会影响外部代码。这是因为外部代码并不直接依赖于这些内部属性。

2.3有理数类的public方法是否设置合适?为什么有的方法设置为private?

(1)Rational类中的public方法有:构造函数,setter与getter方法,运算方法(add,multiply),toString(),equals()。

公共方法是类对外提供的接口,用户可以通过这些方法与对象进行交互。

(2)Rational类中的private方法有:Gcd()。

私有方法是类的内部实现细节,外部代码无法直接调用这些方法。将类中的辅助方法(Gcd())设为私有方法。避免外部代码直接调用他们,有利于保护内部的状态。

2.4你的类里面有static属性或方法吗?如果有,为什么要设置为static的?

类中的工具方法(提供辅助的方法),如Rational类中的Gcd()。设置为static那么方法可以通过类名直接调用,而不需要创建类的实例。

//求最大公约数
private static int Gcd(int m,int n){
        int t;
        while(m % n != 0)
        {
            t = n;
            n = m%n;
            m = t;
        }
        return n;
    }

3.有理类设计

在设计面向对象的有理数类时,我深刻体会到了面向对象编程的精髓,也发现了自己在设计过程中的一些不足。

有理数类的设计需要考虑数据的封装、方法的实现以及异常处理等多个方面。通过将分子和分母封装为私有成员变量,并提供公共的构造函数和方法,我成功实现了有理数的基本运算,如加法、减法、乘法和除法。同时,我也为有理数类添加了化简功能,确保结果总是以最简形式表示。

然而,在设计过程中,我也遇到了一些问题。例如,我没有充分考虑到分母为零的情况,导致程序在运行时可能会出现异常。此外,在实现有理数的比较方法时,我最初没有考虑到浮点数精度问题,导致比较结果可能不准确。通过不断调试和优化,我逐步解决了这些问题,并加深了对面向对象编程的理解。

这次设计让我认识到,面向对象编程不仅仅是代码的封装,更是一种思维方式。我们需要从对象的角度去思考问题,将问题分解为一个个类和对象,并通过合理的方法和属性来实现功能。同时,我也意识到在设计过程中要充分考虑各种边界情况和异常情况,以提高程序的健壮性和可靠性。

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

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

相关文章

408数据结构绪论刷题001

答案:D 解析: • A选项:数据元素是组成数据对象的基本单位 ,它只是数据的基本个体,不能完整定义数据结构,所以A选项错误。 • B选项:数据对象是性质相同的数据元素的集合,仅仅描述…

Leetcode 3359. 查找最大元素不超过 K 的有序子矩阵【Plus题】

1.题目基本信息 1.1.题目描述 给定一个大小为 m x n 的二维矩阵 grid。同时给定一个 非负整数 k。 返回满足下列条件的 grid 的子矩阵数量: 子矩阵中最大的元素 小于等于 k。 子矩阵的每一行都以 非递增 顺序排序。 矩阵的子矩阵 (x1, y1, x2, y2) 是通过选择…

文件系统 软硬连接

🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、理解文件系统 🌠磁盘结构 二、软硬连接 🌟软硬链接 🌠软链接: 🌠硬链接: 🌟理解软硬链接的应…

计算机视觉——JPEG AI 标准发布了图像压缩新突破与数字图像取证的挑战及应对策略

概述 今年2月,经过多年旨在利用机器学习技术开发一种更小、更易于传输和存储且不损失感知质量的图像编解码器的研究后,JPEG AI国际标准正式发布。 来自JPEG AI官方发布流,峰值信噪比(PSNR)与JPEG AI的机器学习增强方法…

Oracle 19c部署之数据库软件安装(二)

在完成了Oracle Linux 9的初始化配置之后,我们准备安装Oracle 19c数据库软件。 Oracle数据库支持两种主要的安装方式:图形化安装和静默安装。这两种方法各有优缺点,选择哪种取决于你的具体需求、环境配置以及个人偏好。 图形化安装 图形化安…

在Vmware15(虚拟机免费) 中安装纯净win10详细过程

一、软件备选 1. VMware15.5.1 网盘下载地址 链接: https://pan.baidu.com/s/1y6GLJ2MG-1tomWblt3otsg?pwdim8e 提取码: im8e 2. windows镜像下载 去官网下载ios包 链接:https://www.microsoft.com/zh-cn/software-download/windows10 二、在VMware15.5.1下安装w…

[Spark]深入解密Spark SQL源码:Catalyst框架如何优雅地解析你的SQL

本文内容组织形式 总结具体例子执行语句解析层优化层物理计划层执行层 猜你喜欢PS 总结 先写个总结,接下来会分别产出各个部分的源码解析,Spark SQL主要分为以下五个执行部分。 具体例子 接下来举个具体的例子来说明 执行语句 SELECT name, age FR…

基于Flask的漏洞挖掘知识库系统设计与实现

基于Flask的漏洞挖掘知识库系统设计与实现 一、系统架构设计 1.1 整体架构 本系统采用经典的三层Web架构,通过Mermaid图展示的组件交互流程清晰呈现了以下核心模块: 前端展示层:基于Bootstrap5构建响应式界面业务逻辑层:Flask…

ECharts散点图-散点图8,附视频讲解与代码下载

引言: ECharts散点图是一种常见的数据可视化图表类型,它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图,包括图表效果预览、视频讲解及代码下载,让你轻松掌握…

Langchain-构建向量数据库和检索器

向量数据库安装 pip install langchain-chroma 文档》向量存储》向量数据库。 和0416 提示词工程相同。 初始化 import osfrom langchain_chroma import Chroma from langchain_community.chat_message_histories import ChatMessageHistory from langchain_core.documents im…

首席人工智能官(Chief Artificial Intelligence Officer,CAIO)的详细解析

以下是**首席人工智能官(Chief Artificial Intelligence Officer,CAIO)**的详细解析: 1. 职责与核心职能 制定AI战略 制定公司AI技术的长期战略,明确AI在业务中的应用场景和优先级,推动AI与核心业务的深度…

2025华中杯数学建模B题完整分析论文(共42页)(含模型、数据、可运行代码)

2025华中杯大学生数学建模B题完整分析论文 目录 一、问题重述 二、问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1解析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.1.4问题1求解结果(仅供参考&am…

游戏引擎学习第231天

设定当天的主题 我们现在到了一个很少出现在直播中的阶段,但今天是那种需要解释计算机科学基础概念的日子。因此,今天我们将讨论这个内容,今天的重点是“大O表示法”(Order Notation),我将用黑板来解释这些…

Linux网络编程实战:从字节序到UDP协议栈的深度解析与开发指南

网路通信的三大要素:协议,端口和IP 知识点1【字节序】 多字节在主机中的存放数据 把多字节看成一个整体存储的顺序。 为什么我们在文件中没有这个概念呢? 因为文件是字节流(流指针),流是以一个字节为操…

赋能能源 | 智慧数据,构建更高效智能的储能管理系统

行业背景 随着新能源产业的快速发展,大规模储能系统在电力调峰、调频及可再生能源消纳等领域的重要性日益凸显。 储能电站作为核心基础设施,其能量管理系统(EMS)需要处理海量实时数据,包括电池状态、功率变化、环境监…

【音视频】音视频FLV合成实战

FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流,并将它们编码和封装输出到输出⽂件,输出格式是根据⽂件扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作: avformat_write_header : 写⽂件…

猪行为视频数据集

猪行为数据集包含 23 天(超过 6 周)的日间猪行为视频,这些视频由近乎架空的摄像机拍摄。视频已配准颜色和深度信息。数据以每秒 6 帧的速度捕获,并以 1800 帧(5 分钟)为一批次进行存储。大多数帧显示 8 头猪。 这里可以看到颜色和深度图像的示例: 喂食器位于图片底部中…

【网络技术_域名解析DNS】一、DNS 基础剖析及其原理

一、DNS 在互联网架构中的基石地位​ 当我们在浏览器地址栏输入www.baidu.com按下回车键的瞬间,一场跨越全球的 “数字寻址游戏” 便悄然启动。DNS(Domain Name System)作为互联网的核心基础设施,承担着将人类易读的域名转换为机…

Java学习小册:Java并发容器与原子类

在Java并发编程中,并发容器和原子类是管理共享数据的重要工具。它们提供了线程安全的数据结构和原子操作,确保在多线程环境下数据的一致性和操作的正确性。本文将深入探讨Java中的并发容器和原子类,包括它们的基本概念、使用方法、关键类及其…

摄影跟拍预定|基于java+vue的摄影跟拍预定管理系统(源码+数据库+文档)

摄影跟拍预定管理系统 目录 基于SprinBootvue的摄影跟拍预定管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3摄影师功能模块 4用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…