目录
1. 给出你的完整的有理数类的代码。尝试在该类中编写toString、equals方法。
2. 给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
4. 尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
5. 尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
5.2 别人的代码是否依赖你的有理数类的内部属性?当你升级了你的有理数类,将其的属性名改变时。是否会影响他人以前编写的调用你有理数类的代码(假设他将使用了你升级后有理数类)?
5.3 有理数类的public方法是否设置合适?为什么有的方法设置为private?
5.4你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
1. 给出你的完整的有理数类的代码。尝试在该类中编写toString、equals方法。
// Rational.java
package rationalnumbers;
public class Rational {
private int fenzi; // 分子
private int fenmu; // 分母
public Rational(int fenzi, int fenmu) {
if (fenmu == 0) {
throw new IllegalArgumentException("分母不能为0");
}
this.fenzi = fenzi;
this.fenmu = fenmu;
reduce();
}
private void reduce() {
int gcd = gcd(fenzi, fenmu);
this.fenzi /= gcd;
this.fenmu /= gcd;
if (this.fenmu < 0) {
this.fenzi = -this.fenzi;
this.fenmu = -this.fenmu;
}
}
private int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
public String toString() {
return fenzi + "/" + fenmu;
}
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Rational rational = (Rational) obj;
return fenzi == rational.fenzi && fenmu == rational.fenmu;
}
public Rational add(Rational other) {
int newFenzi = this.fenzi * other.fenmu + other.fenzi * this.fenmu;
int newFenmu = this.fenmu * other.fenmu;
return new Rational(newFenzi, newFenmu);
}
public Rational multiply(Rational other) {
int newFenzi = this.fenzi * other.fenzi;
int newFenmu = this.fenmu * other.fenmu;
return new Rational(newFenzi, newFenmu);
}
public int getFenzi() {
return fenzi;
}
public int getFenmu() {
return fenmu;
}
}
2. 给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
package rationalnumbers;
import rationalnumbers.Rational;
public class Main {
public static void main(String[] args) {
Rational r1 = new Rational(1, 2);
Rational r2 = new Rational(1, 3);
Rational sum = r1.add(r2);
Rational product = r1.multiply(r2);
System.out.println("Sum: " + sum);
System.out.println("Product: " + product);
}
}
4. 尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
因为它封装了有理数的数据和操作,提供了一个清晰的接口,并且隐藏了实现细节。这使得
Rational
类更容易维护和扩展。
5. 尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
5.1 别人如何复用你的代码?
可以通过导入
Rational
类并创建其实例来复用代码。他们可以调用Rational
类的公共方法,如add
、multiply
、toString
和equals
。
5.2 别人的代码是否依赖你的有理数类的内部属性?当你升级了你的有理数类,将其的属性名改变时。是否会影响他人以前编写的调用你有理数类的代码(假设他将使用了你升级后有理数类)?
由于
Rational
类的内部属性是私有的(private),其他代码不直接依赖于这些属性。因此,即使属性名发生变化,也不会影响其他代码。
5.3 有理数类的public方法是否设置合适?为什么有的方法设置为private?
Rational
类的公共方法设置为提供必要的操作,如加法、乘法、字符串表示和相等性检查。私有方法(如reduce
和gcd
)用于实现细节,因此设置为私有。
5.4你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
Rational
类没有静态属性或方法,因为每个有理数实例都是独立的,不需要类级别的共享数据。