Определите класс RealNumber (число без мнимой части) и определите методы в ComplexNumber, которые позволяют все вышеупомянутые операции со смесями RealNumbers и ComplexNumbers. Прокомментируйте и проверьте, как указано выше.
/**
 * @author Ivan Zelenkov
 * @version 1.0
 * @since Feb 11, 2021
 *
 * A class which defines complex numbers
 */
public class ComplexNumber{
    // The instance variables a and b representing the real parts of the complex number
    private float a;
    private float b;

    /**
     * Create a complex number by float variables a and b
     * @param a real number 1, 12.38, -0.8625, 3/4, sqrt(2), 1998
     * @param b imaginary number sqrt(-1)
     */
    public ComplexNumber(float a, float b){
        this.a = a;
        this.b = b;
    }

    /**
     * Addition method
     * @param otherNumber object of ComplexNumber, contain two numbers of type float
     * @return complex number after adding
     */
    public ComplexNumber add(ComplexNumber otherNumber){
        ComplexNumber newComplex;
        // formula (a + c) + (b + d)
        // newA means the first part of the complex number
        float newA = a + otherNumber.getA();
        // newB means the second part of the complex number
        float newB = b + otherNumber.getB();
        // assign the result of newA and newB to the newComplex object
        newComplex = new ComplexNumber(newA, newB);
        // returns the complex number
        return newComplex;
    }

    /**
     * Subtraction method
     * @param otherNumber object of ComplexNumber, contain two numbers of type float
     * @return complex number after subtracting
     */
    public ComplexNumber subtract(ComplexNumber otherNumber) {
        ComplexNumber newComplex;
        // formula to get a complex number (a - c) + (b - d)
        float newA = a - otherNumber.getA();
        float newB = b - otherNumber.getB();
        newComplex = new ComplexNumber(newA, newB);
        return newComplex;
    }

    /**
     * Multiplication method
     * @param otherNumber object of ComplexNumber, contain two numbers of type float
     * @return complex number after multiplication
     */
    public ComplexNumber multiply(ComplexNumber otherNumber) {
        ComplexNumber newComplex;
        // formula to get a complex number (a*c + b*d) + (b*c + a*d)
        float newA = (a * otherNumber.getA() - b * otherNumber.getB());
        float newB = (b * otherNumber.getA() + a * otherNumber.getB());
        newComplex = new ComplexNumber(newA, newB);
        return newComplex;
    }

    /**
     * Division method
     * @param otherNumber object of ComplexNumber, contain two numbers of type float
     * @return complex number after dividing
     */
    public ComplexNumber divide(ComplexNumber otherNumber) {
        ComplexNumber newComplex;
        // formula to get a complex number (a*c + b*d)/(c^2 + d^2) + (b*c + a*d)/(c^2+d^2)
        float newA = ((a * otherNumber.getA() + b * otherNumber.getB())/(otherNumber.getA()*otherNumber.getA() + otherNumber.getB()*otherNumber.getB()));
        float newB = ((b * otherNumber.getA() - a * otherNumber.getB())/(otherNumber.getA()*otherNumber.getA() + otherNumber.getB()*otherNumber.getB()));
        newComplex = new ComplexNumber(newA, newB);
        return newComplex;
    }

    /**
     * Return a representation of the float a
     * @return a representation of the float a
     */
    public float getA() {
        return a;
    }

    /**
     * Return a representation of the float b
     * @return a representation of the float b
     */
    public float getB() {
        return b;
    }

    /**
     * Override method, to check if the object is an instance of ComplexNumber class
     * {@inheritDoc}
     * @return boolean result if the object instance of ComplexNumber class
     */
    @Override
    public boolean equals(Object o) {
        // the object must equals () to itself
        if (this == o) return true;
        // if object is not instance of ComplexNumber class, method will return false
        if (!(o instanceof ComplexNumber)) return false;
        ComplexNumber that = (ComplexNumber) o;
        // function call to compare two float values
        return Float.compare(that.getA(), getA()) == 0 &&
                Float.compare(that.getB(), getB()) == 0;
    }

    /**
     * Return a string representing the complex number in formatted style
     *
     * @return return a string representing the complex number.
     */
    @Override
    public String toString() {
        // return a formatted string and at the end add i to represent complex number
        return String.format("%.1f + %.1fi", a, b);
    }
Тестер
import static org.junit.Assert.*;
import org.junit.*;

/**
 * Class tests addition, subtraction, multiplication, division to get a complex number
 */
public class ComplexNumberTest {

    /**
     * @param number1-10 objects of ComplexNumber class, which will contain two arguments of type float
     * @param sum1-10 objects that will accept the result of a mathematical calculation between two objects
     */
    ComplexNumber number1, number2, number3, number4, number5, number6, number7, number8, number9, number10;
    ComplexNumber sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8, sum9, sum10;

    /**
     * Method setup two float numbers as arguments into object of ComplexNumber class
     */
    @Before
    public void setup() {
        number1 = new ComplexNumber(10, 3);
        number2 = new ComplexNumber(9, 8);
        number3 = new ComplexNumber(5, -7);
        number4 = new ComplexNumber(4, -3);
        number5 = new ComplexNumber(0, 0);
        number6 = new ComplexNumber(1, -10);
        number7 = new ComplexNumber(-11, -11);
        number8 = new ComplexNumber(2, 7.7f);
        number9 = new ComplexNumber(-8, 5);
        number10 = new ComplexNumber(0, -5);
    }

    /**
     * Method add arguments of two objects among themselves.
     * Each object contains two arguments of type float and assign the result to the sum(1-10) object
     * After that, the result of the complex number is checked for validity.
     */
    @Test
    public void testAdd() {
        try {
            sum1 = number1.add(number2);
            sum2 = number2.add(number3);
            sum3 = number3.add(number4);
            sum4 = number4.add(number5);
            sum5 = number1.add(number5);
            sum6 = number5.add(number6);
            sum7 = number6.add(number7);
            sum8 = number7.add(number8);
            sum9 = number8.add(number9);
            sum10 = number9.add(number10);
            assertEquals("19.0 + 11.0i", sum1.toString());
            assertEquals("14.0 + 1.0i", sum2.toString());
            assertEquals("9.0 + -10.0i", sum3.toString());
            assertEquals("4.0 + -3.0i", sum4.toString());
            assertEquals("10.0 + 3.0i", sum5.toString());
            assertEquals("1.0 + -10.0i", sum6.toString());
            assertEquals("-10.0 + -21.0i", sum7.toString());
            assertEquals("-9.0 + -3.3i", sum8.toString());
            assertEquals("-6.0 + 12.7i", sum9.toString());
            assertEquals("-8.0 + 0.0i", sum10.toString());
        } catch (ArithmeticException e) {
            System.out.println("Subtracting complex numbers is wrong!");
        }
    }

    /**
     * Method subtract arguments of two objects among themselves.
     * Each object contains two arguments of type float and assign the result to the sum(1-10) object
     * After that, the result of the complex number is checked for validity.
     */
    @Test
    public void testSubtract() {
        try {
            sum1 = number1.subtract(number2);
            sum2 = number2.subtract(number3);
            sum3 = number3.subtract(number4);
            sum4 = number4.subtract(number5);
            sum5 = number1.subtract(number5);
            sum6 = number5.subtract(number6);
            sum7 = number6.subtract(number7);
            sum8 = number7.subtract(number8);
            sum9 = number8.subtract(number9);
            sum10 = number9.subtract(number10);
            assertEquals("1.0 + -5.0i", sum1.toString());
            assertEquals("4.0 + 15.0i", sum2.toString());
            assertEquals("1.0 + -4.0i", sum3.toString());
            assertEquals("4.0 + -3.0i", sum4.toString());
            assertEquals("10.0 + 3.0i", sum5.toString());
            assertEquals("-1.0 + 10.0i", sum6.toString());
            assertEquals("12.0 + 1.0i", sum7.toString());
            assertEquals("-13.0 + -18.7i", sum8.toString());
            assertEquals("10.0 + 2.7i", sum9.toString());
            assertEquals("-8.0 + 10.0i", sum10.toString());
        } catch (ArithmeticException e) {
            System.out.println("Adding complex numbers is wrong");
        }
    }

    /**
     * Method multiply arguments of two objects among themselves.
     * Each object contains two arguments of type float and assign the result to the sum(1-10) object
     * After that, the result of the complex number is checked for validity.
     */
    @Test
    public void testMultiply() {
        try {
            sum1 = number1.multiply(number2);
            sum2 = number2.multiply(number3);
            sum3 = number3.multiply(number4);
            sum4 = number4.multiply(number5);
            sum5 = number1.multiply(number5);
            sum6 = number5.multiply(number6);
            sum7 = number6.multiply(number7);
            sum8 = number7.multiply(number8);
            sum9 = number8.multiply(number9);
            sum10 = number9.multiply(number10);
            assertEquals("66.0 + 107.0i", sum1.toString());
            assertEquals("101.0 + -23.0i", sum2.toString());
            assertEquals("-1.0 + -43.0i", sum3.toString());
            assertEquals("0.0 + 0.0i", sum4.toString());
            assertEquals("0.0 + 0.0i", sum5.toString());
            assertEquals("0.0 + 0.0i", sum6.toString());
            assertEquals("-121.0 + 99.0i", sum7.toString());
            assertEquals("62.7 + -106.7i", sum8.toString());
            assertEquals("-54.5 + -51.6i", sum9.toString());
            assertEquals("25.0 + 40.0i", sum10.toString());
        } catch (ArithmeticException e) {
            System.out.println("Multiplication of complex numbers is wrong");
        }
    }

    /**
     * Method divide arguments of two objects among themselves.
     * Each object contains two arguments of type float an assign the result to the sum(1-10) object.
     * After that, the result of the complex number is checked for validity.
     *
     */
    @Test
    public void testDivide() {
        try {
            sum1 = number1.divide(number2);
            sum2 = number2.divide(number3);
            sum3 = number3.divide(number4);
            sum4 = number4.divide(number5);
            sum5 = number1.divide(number5);
            sum6 = number5.divide(number6);
            sum7 = number6.divide(number7);
            sum8 = number7.divide(number8);
            sum9 = number8.divide(number9);
            sum10 = number9.divide(number10);
            assertEquals("0.8 + -0.4i", sum1.toString());
            assertEquals("-0.1 + 1.4i", sum2.toString());
            assertEquals("1.6 + -0.5i", sum3.toString());
            assertEquals("NaN + NaNi", sum4.toString());
            assertEquals("NaN + NaNi", sum5.toString());
            assertEquals("0.0 + 0.0i", sum6.toString());
            assertEquals("0.4 + 0.5i", sum7.toString());
            assertEquals("-1.7 + 1.0i", sum8.toString());
            assertEquals("0.3 + -0.8i", sum9.toString());
            assertEquals("-1.0 + -1.6i", sum10.toString());
        } catch (ArithmeticException e) {
            System.out.println("Division of complex numbers is wrong");
        }
    }

}