java——有理數類
問題列表:
1.仿照BigDecimal類以面向物件的方式設計有理數類。
給出你的完整的有理數類的程式碼.
給出你的測試程式碼。要在與有理數類不同包的其他類中呼叫有理數類。
類名、變數名命名需符合Java規範。
2.嘗試回答與c語言的有理數程式碼相比較,為什麼你設計的類更加面向物件?
3.嘗試從程式碼複用的角度來描述你設計的有理數類。從幾個方面討論。
(1)別人如何複用你的程式碼?
(2)別人的程式碼是否依賴你的有理數類的內部屬性?當你的有理數類的屬性修改時,是否會影響他人呼叫你有理數類的程式碼?
(3)有理數類的public方法是否設定合適?為什麼有的方法設定為private?
(4)你的類裡面有static屬性或方法嗎?如果有,為什麼要設定為static的?
一、有理數類設計程式碼:
package com.company; public class Rational { private int numerator; // 分子 private int denominator; // 分母 public Rational(int n, int d) { this.numerator = n; this.denominator = d; } // 建構函式 public int getNumerator() { return numerator; } // 獲取分子 public int getDenominator() { return denominator; } // 獲取分母
四則運算
public Rational add(Rational secondRational) { int n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator(); int d = denominator * secondRational.getDenominator(); return new Rational(n, d); } // 加法 public Rational subtract(Rational secondRational) { int n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator(); int d = denominator * secondRational.getDenominator(); return new Rational(n, d); } // 減法 public Rational multiply(Rational secondRational) { int n = numerator * secondRational.getNumerator(); int d = denominator * secondRational.getDenominator(); return new Rational(n, d); } // 乘法 public Rational divide(Rational secondRational) { int n = numerator * secondRational.denominator; int d = denominator * secondRational.numerator; return new Rational(n, d); } // 除法
比較大小
public int compare(Rational r2) {
long n = this.numerator * r2.denominator - this.denominator * r2.numerator;
if (n > 0)
System.out.println("r1>r2");
else if (n < 0)
System.out.println("r1<r2");
else
System.out.println("r1==r2");
return 0;
} // 比較大小
返回字串
public String toString() {
if (denominator == 1)
return numerator + "";
else
return numerator + "/" + denominator;
} // 返回字串
有理數型別轉化為其他型別
public int intValue() {
return (int) doubleValue1();
} // 將Rational轉為int型
public long longValue() {
return (long) doubleValue1();
} // 將Rational轉為long型
public float floatValue() {
return (float) doubleValue1();
} // 將Rational轉為float型
public double doubleValue1() {
return numerator * 1.0 / denominator;
} // 將Rational轉為double型
}
二、不同包下呼叫有理數類程式碼:
package test;
import com.company.*;
public class Main {
public static void main(String[] args) {
Rational test1 = new Rational(-1, 5);
Rational test2 = new Rational(4, 7);
System.out.println("test1 + test2 = " + test1.add(test2));
System.out.println("test1 - test2 = " + test1.subtract(test2));
System.out.println("test1 * test2 = " + test1.multiply(test2));
System.out.println("test1 / test2 = " + test1.divide(test2));
System.out.println("將test1轉為int型:" + test1.intValue());
System.out.println("將test1轉為long型:" + test1.longValue());
System.out.println("將test2轉為float型:" + test2.floatValue());
System.out.println("將test2轉為double型:" + test2.doubleValue1());
System.out.println("將test2轉為toString型:" + test2.toString());
test1.compare(test2);
}
}
測試截圖如下:
1.與c語言的有理數程式碼相比較,為什麼你設計的類更加面向物件?
答:因為設計的類的方法和屬性是針對它本身特性來考慮的,面向物件;而C語言更多通過函式呼叫,面向過程。
2.從程式碼複用的角度來描述你設計的有理數類。從幾個方面討論.
(1)別人如何複用你的程式碼?
答:java中的包 (package)”機制能夠實現程式碼的複用,故匯入包含有編寫好的有理數類的包即可。
(2)別人的程式碼是否依賴你的有理數類的內部屬性?當你的有理數類的屬性修改時,是否會影響他人呼叫你有理數類的程式碼?
答:別人的程式碼會依賴於我的有理數類的屬性,因為別人在與我的有理數類不同包的其他類中呼叫了我的有理數類;由於我的有理數類的屬性使用private進行了封裝,所以當我的有理數類的屬性修改時,不會影響他人呼叫我的有理數程式碼。
(3)有理數類的public方法是否設定合適?為什麼有的方法設定為private?
答:有理數類的public方法設定合理,方便呼叫,包中的其他類都可以呼叫。
如有理數的屬性設為private,這正是有理數的不能輕易改變的程式碼部分。比如一些產品屬性是不便使用客戶修改的這種情況,就需要設定private。同時設為private也更好的保證程式碼的安全性。
(4)你的類裡面有static屬性或方法嗎?如果有,為什麼要設定為static的?
答:無。