仿照BigDecimal类以面向对象的方式设计有理数类。
1.给出你的有理数类的代码。
package classdesign;
import java.math.BigInteger;
public class RationalNumber {
private double rNum;
private Integer molecule;
private Integer denominator;
public double getrNum() {
return rNum;
}
public void setrNum(double rNum) {
this.rNum = rNum;
}
public int getMolecule() {
return molecule;
}
public void setMolecule(int molecule) {
this.molecule = molecule;
}
public int getDenominator() {
return denominator;
}
public void setDenominator(int denominator) {
this.denominator = denominator;
}
public RationalNumber(double newRNum) {
rNum = newRNum;
}
public RationalNumber(int molecule, int denominator) {
this.molecule = molecule;
this.denominator = denominator;
rNum = molecule*1.0/denominator;
}
public double add(double item) {
return rNum+item;
}
public double subtraction(double item) {
return rNum-item;
}
public double multiply(double item) {
return rNum*item;
}
public double division(double item) {
if(item == 0.0) {
System.out.println("error:除0错误");
return 0.0;
}
return rNum/item;
}
public void simplifyFraction() {
BigInteger bi1 = new BigInteger(molecule.toString());
BigInteger bi2 = new BigInteger(denominator.toString());
int gcd = bi1.gcd(bi2).intValue();
molecule = molecule/gcd;
denominator = denominator/gcd;
}
}
2.给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
package test;
import classdesign.RationalNumber;
public class Test {
public static void main(String[] args) {
RationalNumber rNum1 = new RationalNumber(4.8);
RationalNumber rNum2 = new RationalNumber(2.4);
RationalNumber rNum3 = new RationalNumber(2, 4);
System.out.println("测试加法");
System.out.println("4.8 + 2.4 = "+rNum1.add(rNum2.getrNum()));
System.out.println("测试减法");
System.out.println("4.8 - 2.4 = "+rNum1.subtraction(rNum2.getrNum()));
System.out.println("测试乘法");
System.out.println("4.8 * 2.4 = "+rNum1.multiply(rNum2.getrNum()));
System.out.println("测试除法");
System.out.println("4.8 / 2.4 = "+rNum1.division(rNum2.getrNum()));
System.out.println("4.8 / 0.0 = "+rNum1.division(0.0));
System.out.println("分数2/4化简之后的分数形式以及小数形式");
rNum3.simplifyFraction();
System.out.println("2/4 = "+rNum3.getMolecule()+"/"+rNum3.getDenominator()+" ; "+"2/4 = "+rNum3.getrNum());
}
}
测试结果如下:
3.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
C语言是面向过程的语言,主要是先编写好所需要的函数,然后考虑如何调用已经写好的函数;而此次设计的有理数类是先设计一个模板,其中有属性、方法,通过这个模板可以生成许多对象,每个对象代表了一个有理数实体,并能够通过自身的方法来进行操作。
4.尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
- a. 别人如何复用你的代码?
可以将编写好的有理数类包下载到个人的电脑,然后通过import语句导入有理数类,从而复用代码。 - b. 别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
是要依赖我的有理数类的属性,当这些属性修改时,也会影响他人调用我的代码。为了实现某些功能,从而引入了
private double rNum;
private Integer molecule;
private Integer denominator;
这三个属性,当这些属性被删除或者是改动时,之前的代码就无法使用了。
- c. 有理数类的public方法是否设置合适?为什么有的方法设置为private?
public方法可以供调用者使用,不需要调用者关心的其他方法就需要封装起来。一般来说,方法用private加以修饰的情况有:- 该方法仅供内部访问
- 增加安全性,限制用户仅能通过给定的方法对数据进行操作