Larback - Retornando conhecimento

Meu software nunca tem bugs. Ele apenas desenvolve alguns comportamentos aleatórios.

Classes aninhadas

Abaixo, um exemplo do uso de classes aninhadas e polimorfismo. O exemplo foi explicado em sala, mas havendo qualquer dúvida, fiquem à vontade para utilizar o fórum.
/* Temos uma classe Conta cujos métodos de saque e depósito tem comportamentos
* diferentes dependendo de a conta ter saldo positivo ou negativo. Caso o
* saldo seja positivo, no depósito a conta deve descontar 2% do valor.
* Caso negativo, no depósito deve-se descontar 5%. Quando o saldo for
* inferior ao limite especial da conta, o saque deve ser
* impossibilitado com o lançamento de uma exceção.
* Exemplo adaptado de: http://blog.caelum.com.br/classes-aninhadas-o-que-sao-e-quando-usar/
*/

public class Conta {
private double saldo;
private EstadoDaConta estado;
private static final double limite=-2000;

public Conta(double saldoInicial){
this.saldo = saldoInicial;
atualizaEstado();
}

private void atualizaEstado() {
this.estado = saldo >= 0 ? new Positivo() : new Negativo();
}

public void deposita(double valor) {
this.estado.deposita(valor);
atualizaEstado();
}

public void saca(double valor) {
this.estado.saca(valor);
atualizaEstado();
}
public double getSaldo(){
return saldo;
}

private interface EstadoDaConta {
void saca(double valor);
void deposita(double valor);
}

private class Positivo implements EstadoDaConta {
public void deposita(double valor) {
saldo += valor * 0.98;
}

public void saca(double valor) {
if ((saldo-valor)<Conta.limite)
throw new IllegalStateException();
else
saldo-=valor;
}
}

private class Negativo implements EstadoDaConta {
public void deposita(double valor) {
saldo += valor * 0.95;
}

public void saca(double valor) {
if ((saldo-valor)<Conta.limite)
throw new IllegalStateException();
else
saldo-=valor;
}
}
}
import javax.swing.JOptionPane;

public class UsaConta {

public static void main(String[] args) {
double saldoInicial =
Double.parseDouble(JOptionPane.showInputDialog(
"Qual seu saldo inicial"));
Conta cc = new Conta(saldoInicial);

int opc=0;
do {
try {
opc = Integer.parseInt(JOptionPane.showInputDialog(
"O que você deseja:\n1-Ver Saldo\n2-Depositar"+
"\n3-Sacar\n\n4-Sair"));
if (opc==1)
JOptionPane.showMessageDialog(null,"Saldo: R$ "+cc.getSaldo());

if (opc==2){
double v =Double.parseDouble(JOptionPane.showInputDialog("Valor?"));
cc.deposita(v);
}
if (opc==3){
try {
double v =Double.parseDouble(JOptionPane.showInputDialog("Valor?"));
cc.saca(v);
} catch(IllegalStateException ill){
JOptionPane.showMessageDialog(null,"Saldo insuficiente");
}
}
}catch (Exception ex){
JOptionPane.showMessageDialog(null,"Opção inválida.");
}
} while (opc!=4);
}

}