sto studiando un libro che tratta JAVA e sono ad un capitolo che spiega la creazione delle classi, ma non ho capito molto bene come funziona tale creazione. Di seguito posto il codice degli esempi del libro e vorrei che qualcuno me li spieghi (se può!).


Primo esempio (creazione di una classe per la gestione di account bancari e relativi servizi):

codice:
import java.text.NumberFormat;

public class Account
{
private NumberFormat fmt = NumberFormat.getCurrencyInstance();

private final double RATE = 0.045; // tasso d'interesse del 4.5%

private long acctNumber;
private double balance;
private String name;

// Si definisce il nome del propietario del conto corrente, il numero del conto e il saldo iniziale

public Account (String owner, long account, double initial)
{
name = owner; // nome propietario
acctNumber = account; // numero conto
balance = initial; // saldo iniziale
}

// operazione di deposito dopo il quale restituisce il nuovo saldo

public double deposit (double amount)
{
   if (amount < 0) // se il valore del versamento è negativo
   {
     System.out.println ();
     System.out.println ("Attenzione, avete inserito un valore non valido, riprovate!");
     System.out.println (acctNumber + " " + fmt.format(amount));
   }
   else
     balance = balance + amount;   // saldo iniziale + versamento

   return balance;
   }
   
// operazione di prelievo alla fine della quale viene visualizzato il nuovo saldo

public double withdraw (double amount, double fee)
{
amount += fee;

if (amount < 0) // condizione negativa di prelievo dato che non vi sono soldi nel conto

{
System.out.println ();
System.out.println ("Attenzione! Prelievo non disponibile. Saldo insufficiente!");
System.out.println ("Numero conto: " + acctNumber);
System.out.println ("Importo richiesto: " + fmt.format(amount));
}
else
   if (amount > balance) // il prelievo supera il saldo
   {
   System.out.println ();
   System.out.println ("Attenzione " + name + ": l'importo immesso supera il saldo!");
   System.out.println ("Numero conto: " + acctNumber);
   System.out.println ("Importo richiesto: " + fmt.format(amount));
   System.out.println ("Disppnibile: " + fmt.format(balance));
   }
   else
      balance -= amount;
   
   return balance;
}

// calcolo degli interessi

public double addInterest ()
{
   balance += (balance*RATE); // il totale è uguale alla somma del totale iniziale + il prodotto tra saldo iniziale + 4,5%
   return balance; // mostra il saldo finale comprensivo degli interessi
}

// visualizza il saldo corrente
public double getBalance ()
{
return balance;
}

// visualizza il numero di conto
public double getAccountNumber ()
{
return acctNumber;
}

// visualizza la descrizione testuale del conto corrente
public String toString ()
{
return (acctNumber + "\t" + name + "\t" + fmt.format(balance));
}
}

Secondo esempio (gestione di operazioni tra numeri razionali):
codice:
public class Rational
{
private int numerator, denominator;

// inizializza il numero verificando che il denominatore sia diverso da 0 e assegnando un segno solo al numeratore
public Rational (int numer, int denom)
{
if (denom == 0)
denom = 1;
// memorizza il segno al numeratore
if (denom < 0)
{
numer = numer * -1;
denom = denom * -1;
}
numerator = numer;
denominator = denom;

reduce();
}
// Somma il numero razionale corrente a quello passato come parametro. Il denominatore come è calcolato moltiplicando i singoli denominatori
public Rational add (Rational op2)
{
int commonDenominator = denominator * op2.getDenominator();
int numerator1 = numerator * op2.getDenominator();
int numerator2 = op2.getNumerator() * denominator;
int sum = numerator1 + numerator2;

return new Rational (sum, commonDenominator);
}
// Sottrae il numero razionale passato come parametro da quello corrente
public Rational substract (Rational op2)
{
int commonDenominator = denominator * op2.getDenominator();
int numerator1 = numerator * op2.getDenominator();
int numerator2 = op2.getNumerator() * denominator;
int difference = numerator1 - numerator2;

return new Rational (difference, commonDenominator);
}
// moltiplica il numero razzioanle corrente con quello passato come parametro
public Rational multiply (Rational op2)
{
int numer = numerator * op2.getNumerator();
int denom = denominator * op2.getDenominator();

return new Rational (numer, denom);
}
// divide il numero razionale corrente con quello passato come parametro per quello corrente moltiplicandolo per il reciproco del parametro
public Rational divide (Rational op2)
{
return multiply (op2.reciprocal());
}
// restituisce il reciproco del numero razionale corrente
public Rational reciprocal ()
{
return new Rational (denominator, numerator);
}

// restiuscie ni numeratore del numero razionale corrente
public int getNumerator ()
{
return numerator;
}
// restituisce il denominatore del numero razionale corrente
public int getDenominator ()
{
return denominator;
}
// Determina se il numeratore del numero razionale corrente è uguale a quello passato come parametro. Suppone che entrambi siano ridotti
public boolean equals (Rational op2)
{
return (numerator == op2.getNumerator() &&
        denominator == op2.getDenominator()  );
}
// visualizza il numero razzionale corrente in forma testuale
public String toString ()
{
String result;
if (numerator == 0)
   result = "0";
else
   if (denominator == 1)
      result = numerator + "";
   else
      result = numerator + "/" + denominator;
      
return result;
}
// riduce il numero razioanle corrente dividendo numeratore e donominatore per il loro massimo comun divisore
private void reduce ()
{
int common;

common = gdc (Math.abs(numerator), denominator);
numerator = numerator / common;
}
// clacola e visualizza il massimo comune divisore dei due parametri interi. Usa l'algoritmo di Euclide
private int gdc (int num1, int num2)
{
while (num1 != num2)
   if (num1 > num2)
      num1 = num1 - num2;
   else
      num2 = num2 - num1;
      
return num1;
}
}

vi ringrazio in anticipo, il vostro aiuto si rivelerà sicuramente prezioso!