Orientação a Objeto - Usando Objetos
Autor: Flavio Correia | Publicado: 2011-09-01T12:39:00-07:00


Orientação a Objeto&nbsp;Objetivos da seção&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Introduzir a Orientação a Objeto (OO) e o uso de objetos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Objetos do mundo real&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Comportamento dos objetos do mundo real&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Reificação e objetos de software "vivos"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Interfaces de objetos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Estado de um objeto (atributos e sua persistência)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Classificação dos objetos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Referências a objetos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Identidade de objetos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Encapsulamento&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Comportamento definido pela classe e pelos métodos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Métodos como envio de mensagens&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Tratamento de erros com exceções




Introdução à Orientação a Objeto (OO)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Pode-se pensar sobre o mundo real como uma coleção de&nbsp;objetos&nbsp;relacionados&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exemplos de objetos do mundo bancário:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Contas correntes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Contas de poupança&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Clientes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Caixas&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Agências&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Cheques&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Extratos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Objetos podem ser agrupados em&nbsp;classes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Conta corrente&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Conta de poupança&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Cliente&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Caixa&nbsp; &nbsp; &nbsp; &nbsp;Agência&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Cheque&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Extratos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe que existem várias Contas correntes de uma mesma classe "Conta corrente"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A diferença entre classe e objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"Classe" é um gabarito (como a planta de uma casa)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"Objeto" é a concretização do gabarito (casas feitas a partir da mesma planta)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Objetos de uma certa classe têm&nbsp;atributos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Uma Conta tem um número, um saldo, um histórico de transações&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Um Cliente tem um nome, um endereço&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Um Cheque tem um valor&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Objetos de uma mesma classe têm um mesmo&nbsp;comportamento&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Clientes entram numa agência&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Clientes fazem depósitos e saques&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Clientes emitem cheques&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Certos objetos&nbsp;não têm comportamento&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Contas não são vivas: não "fazem" nada&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Objetos podem estar&nbsp;relacionados&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Um cliente possui várias Contas&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Podemos usar objetos ao fazer software também&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Há várias vantagens de fazer isso&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;É um pouco difícil entender todas as vantagens de OO agora&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Mencionemos apenas duas:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;É&nbsp;mais fácil conversar com o cliente&nbsp;que pediu o software se falarmos com objetos que existem no mundo dele (o mundo do software fica mais perto do mundo real)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O software feito com OO pode ser feito com&nbsp;maior qualidade&nbsp;e pode ser mais fácil de escrever e, principalmente,&nbsp;alterar&nbsp;no futuro&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Esses pontos não ficarão claros na disciplina de Programação 2 mas certamente o ficarão adiante no curso

O Mundo de Software Simulando o Mundo Real&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A princípio, o mundo de software será semelhante ao mundo real&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Classes, objetos e atributos que existem no mundo real normalmente existem no mundo de software que quer tratar do mundo real&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Portanto, software (aplicações) que lidam com o mundo bancário:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Trataria das classes Agência, Conta, Cliente, etc.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Teria objetos como no mundo real&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Esses objetos teriam os mesmos atributos do mundo real&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O que foi falado acima não é estritamente verdade porque o mundo de software é um&nbsp;modelo&nbsp;do mundo real e só trata das coisas importantes para o business que utilizará o software&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exemplo: Clientes têm um tamanho de sapato mas o software não incluirá este atributo na classe Cliente&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Apesar de nem sempre ser verdade, é um bom ponto de partida&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Porém, há diferenças grandes quando pensamos no&nbsp;comportamento&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Há dois grandes motivos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Primeiro motivo: não vamos modelar todo o comportamento dos objetos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exemplo: Clientes tomam café no mundo real mas provavelmente não no software·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Segundo motivo: os comportamentos frequentemente são assumidos por objetos diferentes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exemplo: No mundo real, quem faz um depósito? Um Cliente&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;No software, qual classe assumiria a&nbsp;responsabilidade&nbsp;de fazer um depósito?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A classe Conta&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Por que isso????&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A primeira grande regra de programação Orientada a Objeto é a seguinte:
"Comportamentos são associados aos objetos que possuem os atributos afetados pelo comportamento"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Um depósito afeta duas coisas, do ponto de vista de um sistema bancário:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O saldo de uma conta&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O histórico de transações feitas a uma conta&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Como se pode ver, o depósito afeta apenas atributos de uma Conta&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Portanto, a responsabilidade de implementar este comportamento será atribuída à Conta e não ao Cliente, embora, no mundo físico, seja o Cliente que faz o depósito&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A primeira grande regra acima tem outros nomes:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"Colocar as responsabilidades com os dados"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Padrão de Projeto Expert&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Quem faz algo é quem é o expert nos dados envolvidos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Resultado: no mundo de software, objetos são "vivos" não passivos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;No mundo real, a Conta é passiva, não viva&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;No mundo de software, a Conta faz várias coisas que afetam seus atributos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Saque&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Depósito&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Informar seu saldo&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;etc.&nbsp; Instanciação e Uso de Objetos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Nesta seção, queremos aprender a&nbsp;usar&nbsp;objetos e não a criá-los ainda&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Problema a resolver: modelar Contas bancárias simples e fazer algumas manipulações&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Usaremos uma classe chamada ContaSimples que já existe na biblioteca de classes escritas pelo professor&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Esta biblioteca se chama p1.aplic.banco e serve para escrever aplicações simples do mundo bancário&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Adiante nesta disciplina, veremos a implementação dessas classes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A solução está no arquivo&nbsp;Banco1.java/* * Movimentação simples de uma conta bancária */&nbsp;// Precisaremos usar classes já prontas no programa// Aqui, estamos trazendo essas classes para "dentro" do nosso programaimport p1.aplic.banco.*;&nbsp; // para poder manusear contas bancárias&nbsp;// Programa Banco1public class Banco1 {&nbsp; // O programa sempre tem um "método" main que é onde começa a execução&nbsp; public static void main(String args[]) {&nbsp;&nbsp;&nbsp; // Abra uma conta de número 1 para João com CPF 309140605-06&nbsp;&nbsp;&nbsp; // A conta será "referenciada" com a variável umaConta&nbsp;&nbsp;&nbsp; ContaSimples umaConta = new ContaSimples("Joao", "30914060506", 1);&nbsp;&nbsp;&nbsp; // Nesta conta, deposite R$1000,00&nbsp;&nbsp;&nbsp; umaConta.depositar(1000.0);&nbsp;&nbsp;&nbsp;&nbsp; // Imprima o saldo da conta de João&nbsp;&nbsp;&nbsp; double saldo = umaConta.getSaldo();&nbsp;&nbsp;&nbsp; System.out.print("Saldo da conta de Joao antes do saque: ");&nbsp;&nbsp;&nbsp; System.out.println(saldo);&nbsp;&nbsp;&nbsp;&nbsp; // Saque R$300,00 desta conta&nbsp;&nbsp;&nbsp; umaConta.sacar(300.0);&nbsp;&nbsp;&nbsp; // Imprima o objeto umaConta&nbsp;&nbsp;&nbsp; System.out.println(umaConta);&nbsp;&nbsp;&nbsp; // Imprima o saldo da conta de João&nbsp;&nbsp;&nbsp; System.out.println("Saldo da conta de Joao depois do saque: " +&nbsp;&nbsp;&nbsp; umaConta.getSaldo());&nbsp; } // fim do método main} // fim da classe Banco1·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Saída do programa:Saldo da conta de Joao antes do saque: 1000.0ContaSimples numero 1, titular Joao, data 01/06/2001, saldo R$700,00Saldo da conta de Joao depois do saque: 700.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A linha com "import" é usada para dizer ao compilador Java que estaremos usando classes do "pacote" p1.aplic.banco&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Um objeto é criado com a palavra&nbsp;new, especificando sua classe&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Diz-se "chamamos o&nbsp;construtor&nbsp;da classe"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A operação também se chama&nbsp;instanciar&nbsp;o objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;No caso da classe ContaSimples, o construtor tem 3 parâmetros que são o valor de certos atributos do objeto (nome do titular, CPF do titular, número da conta)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe que não temos classe Cliente para representar o titular da conta&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A conta em si assume os atributos do titular&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A variável umaConta é do tipo da classe ContaSimples e armazena uma&nbsp;referência&nbsp;ao objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;É como se o objeto fosse uma pipa e a referência fosse uma linha amarrada à pipa&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;É semelhante a ponteiros em outras linguagens
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Um objeto&nbsp;existe&nbsp;enquanto houver pelo menos uma referência a ele&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Depois que não houver mais referências, o objeto some (que nem a pipa sem linha!)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;No programa, estamos vendo chamadas a 3 comportamentos do objeto umaConta&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;depositar(...)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sacar(...)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getSaldo()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;toString()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A sintaxe umaConta.depositar(1000.0) significa que estamos chamado o&nbsp;método&nbsp;depositar() do objeto umaConta&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Um método é como um sub-programa, subrotina ou função de outras linguagens&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Também se fala que estamos&nbsp;enviando a mensagem&nbsp;"depositar" para o objeto "umaConta"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Certos métodos podem ter parâmetros e outros não&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Podemos imprimir um objeto como um todo!System.out.println(umaConta);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Isso é equivalente a chamar:System.out.println(umaConta.toString());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;... porque toda classe tem um método toString que retorna uma representação do objeto e dos seus atributos como String&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Pergunta: qual é o String retornado por umaConta.toString()?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A partir deste String, você pode identificar um provável atributo de uma ContaSimples que não vimos até agora nem informamos no construtor?Encapsulamento&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Muito importante: conseguimos usar objetos da classe ContaSimples sem saber nada sobre como ContaSimples está escrita em Java!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Isso se chama&nbsp;Ocultação de Informação&nbsp;e é muito importante na programação&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;É a forma básica de lidar com a complexidade dos programas&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Também podemos dizer que a Classe ContaSimples&nbsp;encapsula&nbsp;dados e comportamento em cima desses dados&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Os dados são os atributos escondidos de nós (saldo, histórico de transações, dados do titular, ...)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O comportamento são os métodos que podemos chamar para manipular o objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Só podemos "mexer" com o objeto através de seus métodos
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Portanto, vê-se que classes como ContaSimples têm comportamento&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Mais precisamente, os objetos dessa classe é que têm comportamento definido pela classe&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Podemos ver uma definição mais completa do comportamento da classe ContaSimples&nbsp;aqui
Próximo Programa: Identidade de Objetos·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pense sobre a implementação do seguinte programa, dado em pseudo-códigoPrograma Banco2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Abra uma conta de número 1 para João com CPF 309140605-06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nesta conta, deposite R$1000,00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Abra uma conta de número 2 para Ana com CPF 123456789-01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transfira R$400,00 da conta de João para a conta de Ana&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Imprima o saldo da conta de João&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Imprima o saldo da conta de Ana·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A solução está no arquivo&nbsp;Banco2.java/* * Movimentação simples de duas contas bancárias */&nbsp;import p1.aplic.banco.*;&nbsp; // para poder manusear contas bancárias&nbsp;public class Banco2 {&nbsp; public static void main(String args[]) {&nbsp;&nbsp;&nbsp; // Abra uma conta de número 1 para João com CPF 309140605-06&nbsp;&nbsp;&nbsp; // A conta será "referenciada" com a variável umaConta&nbsp;&nbsp;&nbsp; ContaSimples umaConta = new ContaSimples("Joao", "30914060506", 1);&nbsp;&nbsp;&nbsp; // Nesta conta, deposite R$1000,00&nbsp;&nbsp;&nbsp; umaConta.depositar(1000.0);&nbsp;&nbsp;&nbsp;&nbsp; // Abra uma conta de número 2 para Ana com CPF 123456789-01&nbsp;&nbsp;&nbsp; // A conta será "referenciada" com a variável outraConta&nbsp;&nbsp;&nbsp; ContaSimples outraConta = new ContaSimples("Ana", "12345678901", 2);&nbsp;&nbsp;&nbsp; // Transfira R$400,00 da conta de João para a conta de Ana&nbsp;&nbsp;&nbsp; umaConta.transferir(outraConta, 400.0);&nbsp;&nbsp;&nbsp;&nbsp; // Imprima o saldo da conta de João&nbsp;&nbsp;&nbsp; double saldo = umaConta.getSaldo();&nbsp;&nbsp;&nbsp; System.out.print("Saldo da conta de Joao: ");&nbsp;&nbsp;&nbsp; System.out.println(saldo);&nbsp;&nbsp;&nbsp;&nbsp; // Imprima o saldo da conta de Ana&nbsp;&nbsp;&nbsp; System.out.println("Saldo da conta de Ana: " + outraConta.getSaldo());&nbsp;&nbsp;&nbsp; // Imprima o saldo da conta de Ana, novamente, com outro método&nbsp;&nbsp;&nbsp; System.out.println("Saldo da conta de Ana: " + outraConta.getSaldoMonetário());&nbsp;&nbsp;&nbsp;&nbsp; // Impressao dos objetos&nbsp;&nbsp;&nbsp; System.out.println("Situacao da primeira conta: ");&nbsp;&nbsp;&nbsp; System.out.println(umaConta);&nbsp;&nbsp;&nbsp; System.out.println("Situacao da segunda conta: ");&nbsp;&nbsp;&nbsp; System.out.println(outraConta);&nbsp; } // fim do método main} // fim da classe Banco2·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Saída do programa:Saldo da conta de Joao: 600.0Saldo da conta de Ana: 400.0Saldo da conta de Ana: R$400,00Situacao da primeira conta:ContaSimples numero 1, titular Joao, data 01/06/2001, saldo R$600,00Situacao da segunda conta:ContaSimples numero 2, titular Ana, data 01/06/2001, saldo R$400,00&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Este exemplo mostra o conceito de&nbsp;identidade de objetos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Os objetos cujas referências são umaConta e outraConta são dois objetos diferentes (com identidade diferente) embora sejam da mesma classe (do mesmo molde)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Mesmo que todos os atributos dos dois objetos fosse iguais, eles teriam identidade diferente&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Seriam objetos diferentes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Eles seriam armazenados em lugares diferentes da memória&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A referência é essencialmente o endereço de memória do objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe que, no programa, uma referência a um objeto pode ser passada como parâmetro de um método como qualquer outro valor&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Identifique isso no programa Banco2Próximo Programa: Várias Classes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Nos programas acima, o titular das contas bancárias não aparece como objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Suspeitamos de sua existência porque falamos do nome e CPF do titular&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;No próximo programa, trataremos o titular de uma conta de forma explícita como objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A solução está no arquivo&nbsp;Banco4.java/* * Uso de objetos de várias classes, entrada de dados */&nbsp;import p1.aplic.banco.*;import p1.aplic.geral.*;&nbsp; // para mexer com a classe Pessoaimport p1.io.*;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // para fazer entrada de dados&nbsp;public class Banco4 {&nbsp; public static void main(String args[]) {&nbsp;&nbsp;&nbsp; // declaração de variáveis de 2 classes (tipos) diferentes&nbsp;&nbsp;&nbsp; // no fim, teremos 4 objetos de 2 classes&nbsp;&nbsp;&nbsp; Pessoa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oTitular1, oTitular2;&nbsp;&nbsp;&nbsp; ContaSimples&nbsp; umaConta, outraConta;&nbsp;&nbsp;&nbsp;&nbsp; // tempo de vida: os objetos ainda nao existem&nbsp;&nbsp;&nbsp; // a seguinte linha daria erro:&nbsp;&nbsp;&nbsp; // umaConta.depositar(1000.0);&nbsp;&nbsp;&nbsp;&nbsp; // cria dois objetos Pessoa com nome e CPF&nbsp;&nbsp;&nbsp; oTitular1 = new Pessoa("Joao", "30914060506");&nbsp;&nbsp;&nbsp; oTitular2 = new Pessoa("Ana", "12345678901");&nbsp;&nbsp;&nbsp;&nbsp; // cria as duas contas&nbsp;&nbsp;&nbsp; // Observe que ContaSimples pode ser criada com um titular&nbsp;&nbsp;&nbsp; // do tipo Pessoa em vez de dar nome e CPF separadamente&nbsp;&nbsp;&nbsp; umaConta = new ContaSimples(oTitular1, 1);&nbsp;&nbsp;&nbsp; outraConta = new ContaSimples(oTitular2, 2);&nbsp;&nbsp;&nbsp;&nbsp; // Vamos ver quanto vamos depositar&nbsp;&nbsp;&nbsp; double valorADepositar = Entrada.in.lerdouble("Entre com o valor a depositar: ");&nbsp;&nbsp;&nbsp; System.out.println("Vou depositar " + valorADepositar);&nbsp;&nbsp;&nbsp; umaConta.depositar(valorADepositar);&nbsp;&nbsp;&nbsp;&nbsp; // Vamos ver quanto vamos transferir&nbsp;&nbsp;&nbsp; double valorATransferir = Entrada.in.lerdouble("Entre com o valor a transferir: ");&nbsp;&nbsp;&nbsp; System.out.println("Vou transferir " + valorATransferir);&nbsp;&nbsp;&nbsp; umaConta.transferir(outraConta, valorATransferir);&nbsp;&nbsp;&nbsp;&nbsp; // Fecha a agencia e guarda toda a informação em arquivo&nbsp;&nbsp;&nbsp; Agencia.fecharCaixa();&nbsp;&nbsp;&nbsp; System.out.println("OK. Caixa fechado.");&nbsp; } // main} // Banco4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A saída do programa:Entre com o valor a depositar: 1000Vou depositar 1000.0Entre com o valor a transferir: 34Vou transferir 34.0OK. Caixa fechado.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe as múltiplas importações&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;criação de 4 objetos, de 2 classes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Quais são as 4 referências&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Quais são as 2 classes?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A declaração de uma referência não significa que ela "aponte" para um objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Precisa instanciar o objeto primeiro&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe o construtor de ContaSimples&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;É diferente da chamadas que vimos até agora&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nome e cpf não mais passados no construtor da ContaSimples, mas no construtor da Pessoa&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Neste programa, passamos uma Pessoa como titular e não passamos nome e CPF&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Isso se chama&nbsp;overload&nbsp;de métodos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Dois métodos com o mesmo nome mas com parâmetros diferentes são métodos completamente diferentes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;É semelhante ao overload do operador binário +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe a chamada ao novo transferir() de ContaSimples&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Veja o que este método faz&nbsp;aqui&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Finalmente, tem um método estranho chamado&nbsp;método de classe&nbsp;&nbsp;&nbsp; Agencia.fecharCaixa();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Não há referência a um objeto chamado Agencia&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Na realidade, Agencia é o nome de uma classe e o método Agencia.fecharAgencia() é um método que pertence à classe em si e não aos objetos da classe Agencia&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Isso foi feito para simplificar a situação para termos uma única agência&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Num programa real, a Agencia teria que ser instanciada como qualquer objeto&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Você pode ver o que o métodos&nbsp;fecharCaixa() faz aqui&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Como você vai ver, trata-se de salvar os dados das contas, transações, saldos, etc. em arquivo&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Chamamos isso de&nbsp;persistência&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Faremos uso disso no próximo programaPróximo Programa: Acesso a Dados Persistentes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Como manipular contas bancárias que já existem?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Usaremos um método da classe Agencia para achar uma conta cujo número sabemos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A solução está no arquivo&nbsp;Banco5.java/* * Persistência */&nbsp;import p1.aplic.banco.*;import p1.aplic.geral.*;&nbsp; // para mexer com a classe Dataimport p1.io.*;&nbsp;public class Banco5 {&nbsp; public static void main(String args[]) {&nbsp;&nbsp;&nbsp; // declaração de variáveis de 3 classes (tipos) diferentes&nbsp;&nbsp;&nbsp; // no fim, teremos 4 objetos de 3 classes&nbsp;&nbsp;&nbsp; ContaSimples&nbsp; umaConta;&nbsp;&nbsp;&nbsp; Extrato&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; umExtrato;&nbsp;&nbsp;&nbsp; Data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hoje, ontem;&nbsp;&nbsp;&nbsp;&nbsp; // localiza a conta de número 1&nbsp;&nbsp;&nbsp; // (ela já foi criada e armazenada anteriormente)&nbsp;&nbsp;&nbsp; // O "cast" (ContaSimples) será explicado em outro momento&nbsp;&nbsp;&nbsp; // O motivo é que localizarConta retorna um objeto do tipo Conta&nbsp;&nbsp;&nbsp; // que representa uma conta bancária genérica e não apenas uma ContaSimples&nbsp;&nbsp;&nbsp; umaConta = (ContaSimples)Agencia.localizarConta(1);&nbsp;&nbsp;&nbsp;&nbsp; // Vamos fazer um saque&nbsp;&nbsp;&nbsp; System.out.println("Voce tem " + umaConta.getSaldoMonetário() + " na conta");&nbsp;&nbsp;&nbsp; double valor = Entrada.in.lerdouble("Quanto voce quer sacar? ");&nbsp;&nbsp;&nbsp; umaConta.sacar(valor);&nbsp;&nbsp;&nbsp;&nbsp; // Vamos tirar um extrato de conta entre ontem e hoje&nbsp;&nbsp;&nbsp; hoje = new Data();&nbsp;&nbsp; // hoje representa a data de hoje&nbsp;&nbsp;&nbsp; ontem = new Data();&nbsp; // ontem ainda representa hoje&nbsp;&nbsp;&nbsp; ontem.somarDia(-1);&nbsp; // agora, temos a data de ontem&nbsp;&nbsp; &nbsp;umExtrato = umaConta.criarExtrato(ontem, hoje);&nbsp;&nbsp;&nbsp; // Imprime o extrato&nbsp;&nbsp;&nbsp; System.out.println(umExtrato.formatar());&nbsp;&nbsp;&nbsp; System.out.println("Saldo: " + umaConta.getSaldoMonetário());&nbsp;&nbsp;&nbsp;&nbsp; // Vamos atualizar as informações persistentes&nbsp;&nbsp;&nbsp; Agencia.fecharCaixa();&nbsp; } // main} // Banco5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A saída do programa:Voce tem R$966,00 na contaQuanto voce quer sacar? 53Extrato de conta entre 31/05/2001 16:35 e 01/06/2001 16:35Data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Debito Credito&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Valor Descricao01/06/2001 16:18&nbsp;&nbsp;&nbsp;&nbsp; 0000000 0000001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R$1000,00 deposito01/06/2001 16:18&nbsp;&nbsp;&nbsp;&nbsp; 0000001 0000002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R$34,00 transferencia para conta 201/06/2001 16:35&nbsp;&nbsp;&nbsp;&nbsp; 0000001 0000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R$53,00 saque&nbsp;Saldo: R$913,00&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe as várias classes usadas&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Quais são?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe como as referências são inicializadas&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O objeto "umaConta" não é criado com new mas recebido como retorno do método localizarConta() da classe Agencia&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A classe Agencia achou este objeto num arquivo (salvo no programa Banco4)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe com que facilidade manipulamos e usamos datas para tirar um extrato&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Na OO,&nbsp;tudo vira um objeto, até datas, extratos, etc.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Estamos fazendo coisas até complexas sem dificuldade&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Porque&nbsp;abstrações adequadas&nbsp;(classes) já existem para modelar um mundo&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exercício: gere um extrato em formato HTML&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Dica: ver a documentação da classe&nbsp;ExtratoPróximo Programa: um Exemplo Usando while e switch&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A solução está no arquivo&nbsp;Banco8.java/* * Laço: leitura/processamento (até um marcador final) */&nbsp;import p1.aplic.banco.*;import p1.aplic.geral.*;// para mexer com a classe Pessoaimport p1.io.*;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // para fazer entrada de dados&nbsp;public class Banco8 {&nbsp; public static void main(String args[]) {&nbsp;&nbsp;&nbsp; final int DEPOSITAR = 1;&nbsp;&nbsp;&nbsp; final int SACAR = 2;&nbsp;&nbsp;&nbsp; final int SALDO = 3;&nbsp;&nbsp;&nbsp; final int SAIR = 4;&nbsp;&nbsp;&nbsp; // o caractere de fim de linha pode ser diferente de um sistema para outro&nbsp;&nbsp;&nbsp; // exemplo: "\r\n" no MSDOS/Windows, "\n" no UNIX, "\r" no MacIntosh. etc.&nbsp;&nbsp;&nbsp; final String fimDeLinha = System.getProperty("line.separator");&nbsp;&nbsp;&nbsp; final String prompt = "Digite a opcao desejada:" + fimDeLinha +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEPOSITAR + ". Depositar" + fimDeLinha +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SACAR + ". Sacar" + fimDeLinha +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SALDO + ". Saldo" + fimDeLinha +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAIR + ". Sair" + fimDeLinha +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Opcao: ";&nbsp;&nbsp;&nbsp; if(args.length != 3) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Sintaxe: java Banco8 titular cpf numeroDaConta");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(1);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; ContaSimples aConta = new ContaSimples(args[0], args[1], Integer.parseInt(args[2]));&nbsp;&nbsp;&nbsp;&nbsp; int opção = Entrada.in.lerInt(prompt);&nbsp;&nbsp;&nbsp; while(opção != SAIR) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(opção) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DEPOSITAR:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double valorADepositar = Entrada.in.lerdouble("Entre com o valor a depositar: ");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aConta.depositar(valorADepositar);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case SACAR:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double valorASacar = Entrada.in.lerdouble("Entre com o valor a sacar: ");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aConta.sacar(valorASacar);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case SALDO:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Saldo: " + aConta.getSaldoMonetário());&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Opcao " + opção + " desconhecida");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // leia novamente para voltar ao início do laço&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opção = Entrada.in.lerInt(prompt);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; System.out.println("Saldo final: " + aConta.getSaldoMonetário());&nbsp; } // main} // Banco8·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A saída do programa:C:\...\p2\html\src&gt;java -classpath .;packagep1\p1.jar Banco8 joao 12345678901 4Digite a opcao desejada:1. Depositar2. Sacar3. Saldo4. SairOpcao: 1Entre com o valor a depositar: 34Digite a opcao desejada:1. Depositar2. Sacar3. Saldo4. SairOpcao: 2Entre com o valor a sacar: 567Digite a opcao desejada:1. Depositar2. Sacar3. Saldo4. SairOpcao: 3Saldo: R$34,00Digite a opcao desejada:1. Depositar2. Sacar3. Saldo4. SairOpcao: 2Entre com o valor a sacar: 30Digite a opcao desejada:1. Depositar2. Sacar3. Saldo4. SairOpcao: 3Saldo: R$4,00Digite a opcao desejada:1. Depositar2. Sacar3. Saldo4. SairOpcao: 4Saldo final: R$4,00&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe a declaração de constantes com a palavra final&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Nunca&nbsp;usar&nbsp;números mágicos&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A inicialização de fimDeLinha é um macete para ter&nbsp;portabilidade&nbsp;do programa&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O programa deve executar corretamente em vários ambientes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\r significa "RETURN" e \n significa "NEWLINE"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Observe como aConta é criada a partir de argumentos de linha de comando&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Integer.parseInt(String) converte um String a um inteiro (int)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O comando switch implementa uma decisão múltipla&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Às vezes, pode ser mais legível do que uma sequência de if-elsePróximo Programa: Tratamento de Erros com Exceção·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Primeiro um joginho de cartas·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A solução está no arquivo&nbsp;Cartas4.java/* * Laço: Número conhecido de vezes */&nbsp;import p1.aplic.cartas.*;import p1.io.*;&nbsp;public class Cartas4 {&nbsp; public static void main(String[] args) {&nbsp;&nbsp;&nbsp;&nbsp; int rodadas = Entrada.in.lerInt("Quantas rodadas quer jogar?");&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;int suasVitórias = 0;&nbsp;&nbsp;&nbsp; int minhasVitórias = 0;&nbsp;&nbsp;&nbsp; Baralho baralho = new Baralho();&nbsp;&nbsp;&nbsp; baralho.baralhar();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i &lt; rodadas; i++) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Carta suaCarta = baralho.pegaCarta();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("Sua carta: " + suaCarta + "; ");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Carta minhaCarta = baralho.pegaCarta();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("Minha carta: " + minhaCarta + "; ");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(suaCarta.compareTo(minhaCarta) &gt; 0) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Voce ganha.");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; suasVitórias++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if(suaCarta.compareTo(minhaCarta) &lt; 0) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Eu ganho.");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minhasVitórias++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Empate.");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; } // for&nbsp;&nbsp;&nbsp; System.out.println("Voce ganhou " + suasVitórias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " vezes, eu ganhei " + minhasVitórias + " vezes, "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + (rodadas-suasVitórias-minhasVitórias) + " empates.");&nbsp; } // main} // Cartas4·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Saída do programa:Quantas rodadas quer jogar?26Sua carta: VALETE de OUROS; Minha carta: DOIS de COPAS; Voce ganha.Sua carta: NOVE de ESPADAS; Minha carta: OITO de OUROS; Voce ganha.Sua carta: NOVE de PAUS; Minha carta: DOIS de ESPADAS; Voce ganha.Sua carta: REI de ESPADAS; Minha carta: REI de OUROS; Empate.Sua carta: DAMA de OUROS; Minha carta: SETE de COPAS; Voce ganha.Sua carta: SEIS de ESPADAS; Minha carta: VALETE de PAUS; Eu ganho.Sua carta: DOIS de OUROS; Minha carta: TRES de COPAS; Eu ganho.Sua carta: DAMA de COPAS; Minha carta: CINCO de ESPADAS; Voce ganha.Sua carta: SETE de PAUS; Minha carta: DAMA de ESPADAS; Eu ganho.Sua carta: QUATRO de COPAS; Minha carta: AS de OUROS; Voce ganha.Sua carta: DEZ de OUROS; Minha carta: QUATRO de OUROS; Voce ganha.Sua carta: AS de ESPADAS; Minha carta: NOVE de COPAS; Eu ganho.Sua carta: CINCO de COPAS; Minha carta: REI de PAUS; Eu ganho.Sua carta: SETE de ESPADAS; Minha carta: QUATRO de PAUS; Voce ganha.Sua carta: TRES de ESPADAS; Minha carta: DOIS de PAUS; Voce ganha.Sua carta: AS de PAUS; Minha carta: OITO de ESPADAS; Eu ganho.Sua carta: CINCO de PAUS; Minha carta: NOVE de OUROS; Eu ganho.Sua carta: TRES de OUROS; Minha carta: AS de COPAS; Voce ganha.Sua carta: REI de COPAS; Minha carta: DEZ de PAUS; Voce ganha.Sua carta: SEIS de PAUS; Minha carta: DEZ de ESPADAS; Eu ganho.Sua carta: TRES de PAUS; Minha carta: DEZ de COPAS; Eu ganho.Sua carta: OITO de COPAS; Minha carta: OITO de PAUS; Empate.Sua carta: SEIS de OUROS; Minha carta: SEIS de COPAS; Empate.Sua carta: VALETE de COPAS; Minha carta: VALETE de ESPADAS; Empate.Sua carta: SETE de OUROS; Minha carta: DAMA de PAUS; Eu ganho.Sua carta: QUATRO de ESPADAS; Minha carta: CINCO de OUROS; Eu ganho.Voce ganhou 11 vezes, eu ganhei 11 vezes, 4 empates.·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mais um joginho de cartas que faz a mesma coisa·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A solução está no arquivo&nbsp;Cartas7.java/* * Leitura em laço, com tratamento de erro */&nbsp;import p1.aplic.cartas.*;import p1.io.*;import p1.util.*;&nbsp;public class Cartas7 {&nbsp; public static void main(String[] args) {&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; rodadas = 0;&nbsp;&nbsp;&nbsp; String&nbsp; resposta;&nbsp;&nbsp;&nbsp; boolean respostaOK = false;&nbsp;&nbsp;&nbsp;&nbsp; while(!respostaOK) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resposta = Entrada.in.lerLinha("Quantas rodadas quer jogar?");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(resposta == null) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fim de entrada&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rodadas = Integer.parseInt(resposta);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rodadas &lt;= 0 ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Forneca um numero positivo, por favor.");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; respostaOK = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; // MaiorCarta é um jogo onde quem detém a maior carta ganha a rodada&nbsp;&nbsp;&nbsp; new MaiorCarta().joga(rodadas);&nbsp; } // main} // Cartas7&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O jogo está sendo feito com um objeto da classe MaiorCarta&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O que ocorre se quisermos jogar tantas rodadas que o baralho fique vazio?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Veja o que ocorre:Quantas rodadas quer jogar?27Sua carta: DOIS de PAUS Minha carta: CINCO de ESPADAS Eu ganho.Sua carta: REI de ESPADAS Minha carta: AS de PAUS Voce ganha.Sua carta: VALETE de ESPADAS Minha carta: DEZ de PAUS Voce ganha.Sua carta: AS de ESPADAS Minha carta: SEIS de ESPADAS Eu ganho.Sua carta: SETE de ESPADAS Minha carta: OITO de OUROS Eu ganho.Sua carta: REI de PAUS Minha carta: DAMA de ESPADAS Voce ganha.Sua carta: OITO de ESPADAS Minha carta: SETE de PAUS Voce ganha.Sua carta: OITO de COPAS Minha carta: DAMA de COPAS Eu ganho.Sua carta: NOVE de PAUS Minha carta: DAMA de OUROS Eu ganho.Sua carta: QUATRO de ESPADAS Minha carta: TRES de COPAS Voce ganha.Sua carta: NOVE de OUROS Minha carta: DAMA de PAUS Eu ganho.Sua carta: NOVE de COPAS Minha carta: AS de OUROS Voce ganha.Sua carta: SETE de COPAS Minha carta: NOVE de ESPADAS Eu ganho.Sua carta: DOIS de OUROS Minha carta: CINCO de OUROS Eu ganho.Sua carta: AS de COPAS Minha carta: DEZ de ESPADAS Eu ganho.Sua carta: OITO de PAUS Minha carta: QUATRO de COPAS Voce ganha.Sua carta: SEIS de COPAS Minha carta: DEZ de OUROS Eu ganho.Sua carta: REI de OUROS Minha carta: TRES de PAUS Voce ganha.Sua carta: CINCO de PAUS Minha carta: SETE de OUROS Eu ganho.Sua carta: QUATRO de OUROS Minha carta: VALETE de COPAS Eu ganho.Sua carta: TRES de ESPADAS Minha carta: DEZ de COPAS Eu ganho.Sua carta: VALETE de OUROS Minha carta: VALETE de PAUS Empate.Sua carta: SEIS de OUROS Minha carta: REI de COPAS Eu ganho.Sua carta: QUATRO de PAUS Minha carta: SEIS de PAUS Eu ganho.Sua carta: DOIS de ESPADAS Minha carta: DOIS de COPAS Empate.Sua carta: CINCO de COPAS Minha carta: TRES de OUROS Voce ganha.Sua carta: null Minha carta: null Exception in thread "main" java.lang.NullPointerException&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at p1.aplic.cartas.MaiorCarta.joga(MaiorCarta.java:61)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at Cartas7.main(Cartas7.java:30)·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O programa pipoca na cara do usuário! (e isso é&nbsp;feio!)·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Temos disponível uma outra classe, MaiorCartaSegura2, que&nbsp;lança uma exceção&nbsp;quando o baralho fica vazio·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Podemos usar essa classe para fazer um jogo mais agradável para o usuário, tratando condições de erro·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A solução está no arquivo Cartas12.java/* * Para uso em exemplo de exceções */&nbsp;import p1.aplic.cartas.*;import p1.io.*;&nbsp;public class Cartas12 {&nbsp; public static void main(String[] args) {&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; rodadas = 0;&nbsp;&nbsp;&nbsp; String&nbsp; resposta;&nbsp;&nbsp;&nbsp; boolean respostaOK = false;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;while(!respostaOK) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resposta = Entrada.in.lerLinha("Quantas rodadas quer jogar?");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(resposta == null) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fim de entrada&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rodadas = Integer.parseInt(resposta);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rodadas &lt;= 0 ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Forneca um numero positivo, por favor.");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; respostaOK = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;// MaiorCartaSegura2 é um jogo onde quem detém a maior carta ganha a rodada&nbsp;&nbsp;&nbsp; try {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new MaiorCartaSegura2().joga(rodadas);&nbsp;&nbsp;&nbsp; } catch(Exception e) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());&nbsp;&nbsp;&nbsp; }&nbsp; } // main} // Cartas12·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A saída do programa:Quantas rodadas quer jogar?27Sua carta: CINCO de PAUS Minha carta: VALETE de ESPADAS Eu ganho.Sua carta: QUATRO de COPAS Minha carta: AS de ESPADAS Voce ganha.Sua carta: DOIS de OUROS Minha carta: SETE de PAUS Eu ganho.Sua carta: SEIS de COPAS Minha carta: OITO de ESPADAS Eu ganho.Sua carta: TRES de OUROS Minha carta: QUATRO de ESPADAS Eu ganho.Sua carta: QUATRO de PAUS Minha carta: DEZ de PAUS Eu ganho.Sua carta: DAMA de PAUS Minha carta: TRES de COPAS Voce ganha.Sua carta: VALETE de COPAS Minha carta: AS de PAUS Voce ganha.Sua carta: DEZ de ESPADAS Minha carta: SETE de ESPADAS Voce ganha.Sua carta: SEIS de OUROS Minha carta: AS de COPAS Voce ganha.Sua carta: REI de PAUS Minha carta: NOVE de OUROS Voce ganha.Sua carta: DAMA de COPAS Minha carta: SEIS de PAUS Voce ganha.Sua carta: CINCO de COPAS Minha carta: QUATRO de OUROS Voce ganha.Sua carta: CINCO de ESPADAS Minha carta: REI de ESPADAS Eu ganho.Sua carta: CINCO de OUROS Minha carta: AS de OUROS Voce ganha.Sua carta: OITO de OUROS Minha carta: DEZ de COPAS Eu ganho.Sua carta: NOVE de PAUS Minha carta: VALETE de OUROS Eu ganho.Sua carta: NOVE de COPAS Minha carta: DOIS de ESPADAS Voce ganha.Sua carta: TRES de ESPADAS Minha carta: DEZ de OUROS Eu ganho.Sua carta: DAMA de OUROS Minha carta: DOIS de PAUS Voce ganha.Sua carta: SEIS de ESPADAS Minha carta: DOIS de COPAS Voce ganha.Sua carta: NOVE de ESPADAS Minha carta: DAMA de ESPADAS Eu ganho.Sua carta: OITO de PAUS Minha carta: SETE de OUROS Voce ganha.Sua carta: SETE de COPAS Minha carta: TRES de PAUS Voce ganha.Sua carta: REI de OUROS Minha carta: REI de COPAS Empate.Sua carta: OITO de COPAS Minha carta: VALETE de PAUS Eu ganho.Baralho esta vazio&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Ficou bem mais bonito!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Uma&nbsp;exceção&nbsp;é um objeto que retorna de um método mas de forma mais "violenta" que um&nbsp;returnnormal&nbsp; &nbsp;O retorno especial (que significa um erro) deve ser capturado com&nbsp;try { ...} catch()&nbsp;como mostra o programa acima&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A exceção em si é um objeto da classe&nbsp;Exception&nbsp;que tem o método&nbsp;getMessage()&nbsp;que retorna um string indicando o erro que houve&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;O programa captura a exceção&nbsp;