3.1-OO设计-有理数的设计

3.1-OO设计-有理数的设计

博客内容:仿照BigDecimal类以面向对象的方式设计有理数类。

1.给出你的有理数类的代码。
我的有理数类代码:
package javaRationalNumber;

public class RationalNumber {
	private  double rationNumber;
	
	public double getRationNumber() {
		return rationNumber;
	}

	public void setRationNumber(double rationNumber) {
		this.rationNumber = rationNumber;
	}

	public void add(Double addNum) {
		rationNumber = rationNumber + addNum;
		System.out.println(toStr());
	}//加运算
	
	public void sub(Double subNum) {
		rationNumber = rationNumber - subNum;
		System.out.println(toStr());
	}//减运算
	
	public void mul(Double mulNum) {
		rationNumber = rationNumber * mulNum;
		System.out.println(toStr());
	}//乘运算
	
	public void div(Double divNum) {
		rationNumber = rationNumber / divNum;
		System.out.println(toStr());
	}//除运算
	
	public void rem(Double remNum) {
		rationNumber = rationNumber%remNum;
		System.out.println(toStr());
	}//求余运算
	
	public void sqrt() {
		System.out.println(Math.sqrt(rationNumber));
	}//有理数的开方
	
	public void pow(int n) {
		double num = rationNumber;
		for(int i=0;i < n;i++) {
			rationNumber *= num;
		}
		System.out.println(toStr());
	}//有理数的n次方
	
	public void com(Double comNum) {
		if(rationNumber > comNum) 
			System.out.println(rationNumber+" > "+comNum);
		else if(rationNumber < comNum)
			System.out.println(rationNumber+" < "+comNum);
		else 
			System.out.println(rationNumber+" = "+comNum);
	}//作比较
	
	public void round(int dec) {
		System.out.println(String.format("%."+dec+"f", rationNumber));
	}//小数的四舍五入
	
	private String toStr() {
		String str = ""+rationNumber;
		return str;
	}//Double转String类型
	
	private int toInt() {
		int num = (int) rationNumber;
		return num;
	}//Double转Int类型
	
	private float toFloat() {
		float num = (float) rationNumber;
		return num;
	}//Double转float类型
	

	
}

2.给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
测试代码:
package javaRationalNumber;

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		double number = scanner.nextDouble();
		double nextNumber = scanner.nextDouble();
		
		RationalNumber firstNumber = new RationalNumber();
		
		firstNumber.setRationNumber(number);
        
		System.out.println("输入的数是:"+firstNumber.getRationNumber());//测试输入的值是否正确
		firstNumber.add(nextNumber);			//计算number+nextNumber
		firstNumber.sub(nextNumber);			//计算number-nextNumber
		firstNumber.mul(nextNumber);			//计算number*nextNumber
		firstNumber.div(nextNumber);			//计算number/nextNumber
		firstNumber.rem(nextNumber);			//计算number%nextNumber
		firstNumber.sqrt();						//计算number的开方结果
		firstNumber.pow((int)nextNumber);		//计算number的nextNumber次方的结果
		firstNumber.com(nextNumber);			//将number与nextNumber作比较
		firstNumber.round((int)nextNumber);		//将number四舍五入为小数点后nextNumber位小数
		
		scanner.close();						//关闭对象scanner
	}
}

测试结果:

1)number + nextNumber

2)number - nextNumber

3)number * nextNumber

4)number / nextNumber

5)计算number % nextNumber

6)计算number的开方结果 (这里因为只需要输入number一个参数,所以后面输入的0没有实际作用)

7)计算number 的 nextNumber 次方的结果(number^nextNumber)

8)将number与nextNumber作比较

9)将number四舍五入为小数点后nextNumber位小数

3.类名、变量名命名需符合Java规范。

该代码普遍使驼峰命名法命名。

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

C语言完全面向过程,而我的代码具有例如封装、继承这些Java的核心特征,是面向对象的经典特征,且可重用性高,可扩展性强,所以会区别于C语言的有理数代码,会更倾向于面向对象。

5.尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
  1. 别人如何复用你的代码?

    此代码的服用方法为组合,他人可以在新类中创建RationalNumber类的对象,通过该对象来调用已有类中的非private的属性和方法。

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

    他人的代码会依赖有理数类的属性,当我对有理数的属性修改时,也会影响到他人调用有理数类的代码。

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

    需要根据需要来进行方法的访问级别。有一些方法需要设置为private,这样的话,这一方法就只能在这一类中使用,对于别的类来说相当于是隐藏不可见的,可以保护该方法中的赋值不被外界干扰,保护了子类。

posted @ 2020-10-03 21:56  勤政  阅读(181)  评论(0编辑  收藏  举报