dúvida sobre o funcionamento do código

[b]Create a class called Complex for performing arithmetic with complex numbers. Write a driver program to test your class.

Complex numbers have the form

realPart + imaginaryPart * i

where i is : raiz quadrada de -1

Use floating-point variables to represent the private data of the class. Provide a constructor method that enables an object of this class to be initialized when it is declared. Provide a no-argument constructor with default values in case no initializers are provided. Provide public methods for each of the following:

Addition of two Complex numbers: The real parts are added together and the imaginary parts are added together.
Subtraction of two Complex numbers: The real part of the right operand is subtracted from the real part of the left operand and the imaginary part of the right operand is subtracted from the imaginary part of the left operand.
Printing Complex numbers in the form (a, b), where a is the real part and b is the imaginary part.
[/b]

[code]// Exercise 8.2 Solution
// Complex.java
// Definition of class Complex

public class Complex {
private double real;
private double imaginary;

// Initialize both parts to 0
public Complex() { this( 0.0, 0.0 ); }

// Initialize real part to r and imaginary part to 0
public Complex( double r ) { this( r, 0.0 ); }

// Initialize real part to r and imaginary part to i
public Complex( double r, double i )
{
real = r;
imaginary = i;
}

// Add two Complex numbers
public Complex add( Complex right )
{
return new Complex( real + right.real,
imaginary + right.imaginary );
}

// Subtract two Complex numbers
public Complex subtract( Complex right )
{
return new Complex( real - right.real,
imaginary - right.imaginary );
}

// Return String representation of a Complex number
public String toString()
{ return “(” + real + ", " + imaginary + “)”; }
}
Primeira dúvida é sobre esse sobre o this—> quando ele faz this()
// Exercise 8.2: ComplexTest.java
// Test the Complex number class
import javax.swing.*;

public class ComplexTest {
public static void main( String args[] )
{
Complex a, b;
a = new Complex( 9.9, 7.7 );
b = new Complex( 1.2, 3.1 );

  String result = "a = " + a;
  result += "\nb = " + b;
  result += "\na + b = " + a.add( b );
  result += "\na - b = " + a.subtract( b );

  JOptionPane.showMessageDialog(
        null, result, "Complex Test",
        JOptionPane.INFORMATION_MESSAGE );
  System.exit( 0 );

}
}
[/code]

Primeira dúvida é -->sobre o uso do this —> quando ele faz public Complex() { this( 0.0, 0.0 );} isso é igual a ---> public Complex() {real = 0.0; imaginary = 0.0 ); } ??????

Segunda dúvida é —>O metodo add como ele funciona , por exemplo como ele sabe que o valor de real = 9.9(ou seja valor real do objeto a) e não o ultimo valor que foi passado quando ele criou o objeto b

o valor de right.real eu entendi que ele pega o valor real do objeto b uma vez que ele é passado como parâmetro na classe ComplexTest okay entendido

Terceira dúvida é ----> Ultima duvida, se vocês debugarem o código verão que ele funciona da seguinte forma : 1- o objeto é criado através de uma instrução new com os valores passados como parâmetro, então o construtor é chamado e inicializa esses valores nos atributos privados da classe o comando retorna à classe ComplexTest e faz o mesmo processo para o obejto b 2- pulando para a chamada do método add e vi que ele calcula as somas das partes real e imaginaria dos dois objetos e então retorna esse valor para o construtor novamente , por que isso acontece ??? e por que depois que a linha de execução sai do construtor ele volta novamente para a primeira linha do método add ???

Agradeço a ajuda por que uma vez entendendo isso acredito que todo o processo de criação de objetos e chamadas de métodos estarão claros na minha cabeça após isso

Olá, Felip,

Suas dúvidas são bem básicas. Sugiro dar uma estudada em algum tutorial ou lívro brásico e procurar pelos seguintes tópicos:
O que é classe e qual q diferença entre classe e objeto?
O que são os construtores de uma classe e como funcionam?
Qual a diferença entre um construtor e um método?

Vou tentar responder alguma coisa aqui mas pesquise e estude mais:

Primeira dúvida:
Ao usar

this( 0.0, 0.0 );

Você na verdade está chamando o construtor que possui em sua assinatura, dois parâmetros double. Ou seja, quando você instancia um objeto da classe usando o construtor padrão (sem parâmetros)

Complex objetoQualquer = new Complex()

O construtor está cascateando para o outro construtor passando 0.0 e 0.0 como parâmetros. Ou seja, é como se vc fizesse isto:

Complex objetoQualquer = new Complex(0.0, 0.0)

Segunda dúvida
Não entendi direito sua pergunta mais vou tentar explicar o que o método add faz.
Veja que o método add não é “static”, ou seja, para chamar este método, você vai ter que já ter um objeto instanciado, não dá pra chamar diretamente na classe.
Este método recebe como parâmetro, um outro objeto Complex e soma a parte real (que é um atributo do objeto) do objeto onde vc está chamando o método add, com a parte real do objeto que está sendo passado como parâmetro. O mesmo ele faz com a parte imaginária. Os resultados desta soma ele usa para construir um terceiro objeto Complex.
Ex.:

Complex esteObjeto = new Complex(1.0, 2.0);
Complex outroObjeto = new Complex(5.0, 7.0);
Complex terceiroObeto = esteObjeto.add(outroObjeto);

Neste caso, terceiroObeto passa a ter os valores 6.0 e 9.0 respectivamente como partes real e imaginaria.

Terceira dúvida

Leia a resposta da segunda dúvida e pense com calma. Observe que dentro do método add, um terceiro objeto é criado e, portanto, é chamado o seu construtor.