OO设计-有理数类的设计

项目结构:

在这里插入图片描述

运行测试代码:

package number;

public class Main {
	public static void main(String[] args) {
		Rationalnumber number1 = new Rationalnumber();
		
        number1.setNumber(2);//设置number1为2;
        System.out.println("输出设置的number1:"+number1);
        
        number1.add(5);
        System.out.println("输出number1+5得到:"+number1);
        
        number1.subtract(4);
        System.out.println("输出上一步得到的数-4:"+number1);
        
        number1.multiply(3);
        System.out.println("输出上一步得到的数×3:"+number1);
        
        number1.divide(2);
        System.out.println("输出上一步得到的数/2:"+number1);
        System.out.println("以下是数字转化:");
        System.out.println();
        
        System.out.println("转化为int类型:"+number1.intValue());
        System.out.println("转化为long型转化类型:"+number1.longValue());
        System.out.println("转化为float型转化类型:"+number1.floatValue());
        System.out.println("转化为double型转化类型:"+number1.doubleValue());
        
        
        System.out.println("以下是类两个相加方法:");
        
        number1=Rationalnumber.twoadd(1, 2);
        System.out.println("1+2=:"+number1);
        
        number1=Rationalnumber.twosubtract(10, 1);
        System.out.println("10-1=:"+number1);
        
        number1=Rationalnumber.twomultiply(12, 15);
        System.out.println("12*15 =:"+number1);
        
        number1=Rationalnumber.twodivide(3, 2);
        System.out.println("3*2 =:"+number1);
        
        number1.round(2);
        System.out.println("输出上一步得到的数是否等于2:"+number1.equals(2));
        
	}

}

运行测试结果:

在这里插入图片描述

类实现代码:

package number;

public class Rationalnumber {
	private double number = 0;
	private long denominator = 1;

	public double getNumber() {
		return number;
	}

	public void setNumber(long number) {
		this.number = number;
	}
	
	//设定分母
	public void setDenominator(long denominator) {
		this.denominator = denominator;
	}

	public double getNumerator() {
		return number;
	}

	public double getDenominator() {
		return denominator;
	}
	
	//字符串输出
	public String toString() {
		return "Rationalnumber [number=" + number + "]";
	}

	//对象单个加法
	public void add(double number) {
		this.number += number;
	}

	//对象单个减法
	public void subtract(double number) {
		this.number -= number;
	}

	//对象单个乘法
	public void multiply(double number) {
		this.number *= number;
	}

	//对象单个除法
	public void divide(double number) {
		if (number == 0) {
			System.out.println("false,you can't divide by 0");
		} else {
			this.number/= number;
		}
	}

	//类两个相加方法
	public static Rationalnumber twoadd(long v1, long v2) {
		Rationalnumber b1 = new Rationalnumber();
		b1.setNumber(v1);
		Rationalnumber b2 = new Rationalnumber();
		b2.setNumber(v2);
		b1.add(b2.number);
		return b1;
	}

	//类两个相减方法
	public static Rationalnumber twosubtract(long v1, long v2) {
		Rationalnumber b1 = new Rationalnumber();
		b1.setNumber(v1);
		Rationalnumber b2 = new Rationalnumber();
		b2.setNumber(v2);
		b1.subtract(b2.number);
		return b1;
	}

	//类两个相乘方法
	public static Rationalnumber twomultiply(long v1, long v2) {
		Rationalnumber b1 = new Rationalnumber();
		b1.setNumber(v1);
		Rationalnumber b2 = new Rationalnumber();
		b2.setNumber(v2);
		b1.multiply(b2.number);
		return b1;
	}

	//类两个相除方法
	public static Rationalnumber twodivide(long v1, long v2) {
		Rationalnumber b1 = new Rationalnumber();
		b1.setNumber(v1);
		Rationalnumber b2 = new Rationalnumber();
		b2.setNumber(v2);
		b1.divide(b2.number);
		return b1;
	}

	//对象属性int型转化
	public int intValue() {
		return (int) doubleValue();
	}

	//对象属性long型转化
	public long longValue() {
		return (long) doubleValue();
	}

	//对象属性float型转化
	public float floatValue() {
		return (float) doubleValue();
	}

	//对象属性double型转化
	public double doubleValue() {
		return number * 1.0 / denominator;
	}
	
	//按一定的小数点位数输出对象属性
	public void round(int dec) {
		System.out.println(String.format("%."+dec+"f", number));
	}

	//判断对象属性与其他数值是否相等
	public boolean equals(double number1) {
		if ((number - number1) == 0)
			return true;
		else
			return false;
	}
	
	//类内部求最小公约数
	private static long gcd(double n, double d) {
		double n1 = Math.abs(n);
		double n2 = Math.abs(d);
		int gcd = 1;

		for (int k = 1; k <= n1 && k <= n2; k++) {
			if (n1 % k == 0 && n2 % k == 0)
				gcd = k;
		}
		return gcd;
	}

}

思考:

1、问:描述与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

答:在使用C语言编写有理数代码过程中,注重的更多是完成这个功能,不要求功能与功能之间的联系,而面向对象编程则更加系统,不同的功能被不同的类,模块分隔的清楚,需要使用的时候只要使用我们所需的功能即可。

2、问:别人如何复用我的代码?

答:拷贝我的代码并命名如RationalNumber的类,然后就可以在编写代码过程中需要时或者建一个新类来输出时调用RationalNumber内的方法即可。

3、问:别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?

答:依赖,当我修改我的有理数类的属性时,会对他人调用我的代码时产生影响,其中可能包括入参、返回值等方面的改动产生的影响。

4、问:有理数类的public方法是否设置合适?为什么有的方法设置为private?

答:合适,使用public有助于其他类在使用有理数类的方法时能够直接有效的调用,而有的方法可以设置为private来限于自身访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值