1. 与C语言有理数代码相比,该Java类更面向对象的原因
(1)封装性:Java类将有理数的分子numerator和分母denominator设为private,仅通过public方法对外暴露功能,隐藏了内部实现细节;而C语言通常通过结构体直接暴露成员变量,调用者可直接修改,不符合封装思想。
(2)方法与数据绑定:Java类将有理数的操作作为类的成员方法,与分子、分母绑定,调用时通过对象直接操作;C语言中操作函数与结构体分离,数据与行为是独立的。
(3)面向对象特性集成:Java类支持继承、多态等面向对象特性,而C语言需通过结构体+函数指针模拟,实现复杂且不直观。
2. 从代码复用角度分析有理数类
2.1 别人如何复用你的代码?
(1)直接实例化对象:通过new Rational(numerator, denominator)创建有理数对象,使用类提供的add、multiply等方法进行运算。
(2)调用公共方法:通过getNumerator、getDenominator获取属性值,通过toString进行字符串转换,通过equals比较对象是否相等。
(3)扩展功能:若需新增操作(如减法、除法),可基于现有类继承扩展,或直接在外部代码中调用现有方法组合实现。
2.2 别人的代码是否依赖你的有理数类的内部属性?当你升级了你的有理数类,将其的属性名改变时。是否会影响他人以前编写的调用你有理数类的代码(假设他将使用了你升级后有理数类)?
别人的代码不依赖内部属性:因为类的属性被声明为private,外部无法直接访问,只能通过public的getter方法获取。升级时属性名改变不影响外部代码:只要getter方法的名称和返回值不变,即使内部属性名修改,外部调用代码无需修改。
2.3 有理数类的public方法是否设置合适?为什么有的方法设置为private?
public方法设置合理:
(1)构造方法Rational(int, int):允许外部创建实例,同时内部处理了分母为0、符号统一、约分等逻辑,保证对象合法性。
(2)运算方法add、multiply:提供核心功能,满足有理数基本运算需求。
(3)getter方法:安全暴露属性值,避免直接访问私有变量。
(4)toString、equals:提供对象的字符串表示和相等性判断。
private方法的原因:gcd方法是内部辅助方法,仅用于构造方法中约分,无需对外暴露。将其设为private可避免外部错误调用。
2.4 你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
没有。
3. 可选:简单说明你的设计的有理数类是否是不可变类?如果想要设计成不可变类,主要从哪几个方面着手?
当前有理数类是不可变类,因为:
(1)numerator和denominator被声明为private且无setter方法,无法被外部修改。
(2)所有运算方法均返回新的Rational对象,而非修改当前对象的属性。
着手点:
- 私有属性且无setter方法;
- 所有方法不修改自身属性,而是返回新对象;
- 类声明为final;