8
Linguagens de Programação
PUC
1
Linguagens de Programação
PUC
8
Linguagens de Programação
PUC
1
Linguagens de Programação
ESPM
2
Linguagens de Programação
ESPM
1
Linguagens de Programação
UMG
1
Linguagens de Programação
IFF
8
Linguagens de Programação
IFF
1
Linguagens de Programação
IFF
51
Linguagens de Programação
MULTIVIX
Texto de pré-visualização
Objetos e Classes Roland Teodorowitsch Fundamentos de Programação Escola Politécnica PUCRS 17 de junho de 2023 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 1 101 Introdução Introdução Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 2 101 Introdução Objetivos Entender os conceitos de classes objetos e encapsulamento Implementar variáveis métodos e construtores de instância Ser capaz de projetar implementar e testar classes Entender o compartamento de referências a objetos variáveis estáticas e métodos estáticos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 3 101 Introdução Conteúdos Programação Orientada a Objetos Implementando uma Classe Simples Construtores Exemplos Passos para Implementar uma Classe Testando uma Classe Padrões para Dados de Objetos Referências a Objetos Variáveis e Métodos Estáticos Sumário Tópicos Complementares Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 4 101 Programação Orientada a Objetos Programação Orientada a Objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 5 101 Programação Orientada a Objetos Programação Orientada a Objetos Até agora foram apresentadas técnicas de programação estruturada Quebrar tarefas em subtarefas Escrever métodos reusáveis para tratar tarefas A partir de agora serão estudados objetos e classes Para construir programas maiores e mais complexos Para modelar objetos que são usados no mundo real Classes e Objetos Uma classe descreve objetos com um comportamento comum Por exemplo a classe Carro descreve todos os veículos de passageiros que tem determinada capacidade e formato Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 6 101 Programação Orientada a Objetos Objetos e Programas Programas Java são feitos por objetos que interagem uns com os outros Cada objeto é baseado em uma classe Uma classe descreve um conjunto de objetos o mesmo comportamento Cada classe define um conjunto específico de métodos para ser usado com os seus objetos Por exemplo a classe String provê métodos tais como length e charAt Estes métodos foram definidos na classe String e podem ser usados por qualquer objeto desta classe String boasVindas Sejam bemvindos int tamanho boasVindaslength char caract1 boasVindascharAt0 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 7 101 Programação Orientada a Objetos Diagrama de Classes Dados Privados Cada objeto tem seus próprios dados privados que outros objetos não podem acessar diretamente Métodos da interface pública provêm acesso a dados privados enquanto escondem detalhes de implementação Isto é chamado de encapsulamento Interface Pública Cada objeto tem um conjunto de métodos disponível para ser usado por outros objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 8 101 Programação Orientada a Objetos Tipos Abstratos de Dados Abstração é uma visão ou representação de uma entidade que inclui apenas os seus atributos mais importantes segundo determinado ponto de vista Em Computação usase a abstração para atenuar a complexidade de problemas Um Tipo Abstrato de Dados TAD é uma estrutura sintática que define um tipo para determinada entidade de forma que quem o usa não necessite conhecer os detalhes da sua implementação armazenamento interno de dados ou implementação de operações suportadas TADs são importantes para garantir encapsulamento Encapsulamento é uma técnica que agrupa elementos relacionados entre si tipos variáveis métodos etc em um módulo escondendo do usuário seus detalhes internos o que garante abstração O encapsulamento define quais partes de um objeto serão visíveis públicas e quais partes permanecerão ocultas privadas Em Java classes são usadas para a criação de Tipos Abstratos de Dados Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 9 101 Implementando uma Classe Simples Implementando uma Classe Simples Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 10 101 Implementando uma Classe Simples Implementando uma Classe Simples Exemplo contador Uma classe que modela um dispositivo mecânico que é usado para realizar contagens Por exemplo para contar quantas pessoas estão assistindo a um concerto ou quantas pessoas embarcaram em um ônibus O que deve ser feito Inicializar o contador Java já faz isso automaticamente Incrementar o dispositivo Obter o valor atual Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 11 101 Implementando uma Classe Simples Classe Contador Especificase variáveis de instância na declaração da classe Cada objeto instanciado a partir desta classe terá seu próprio conjunto de variáveis de instância Cada objeto da classe Contador terá sua própria variável valor Especificadores de acesso Classes e métodos de interface são públicos public Variáveis de instância são privadas private Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 12 101 Implementando uma Classe Simples Instanciando Objetos Objetos são criados a partir de classes Usase o operador new para construir objetos Cada objeto recebe um nome único da mesma forma que uma variável O operador new já apareceu em exemplos anteriores Scanner in new ScannerSystemin Para criar duas instâncias de objetos da classe Contador usase NomeClasse nomeObjeto new NomeClasse Contador presentes new Contador Contador embarcaram new Contador Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 13 101 Implementando uma Classe Simples Métodos da Classe Contador Dois métodos serão usados para acessar as variáveis de instância dos objetos da classe Contador incrementaValor incrementa o valor da variável de instância valor obtemValor retorna o valor da variável de instância valor Para usar estes métodos é preciso especificar sobre qual objeto eles deverão ser aplicados presentesincrementaValor embarcaramincrementaValor Classe para contagem de eventos simulando um dispositivo de contagem version 00 public class Contador private int valor public int obtemValor return valor public void incrementaValor valor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 14 101 Implementando uma Classe Simples Tipos de Métodos 1 Métodos de Acesso Accessors ou getters Solicitam uma informação ao objeto sem alterálo Normalmente retornam algum valor Em inglês costumam iniciar com o prefixo get em Português obtem public int obtemValor return valor 2 Métodos de Alteração Mutators ou setters Alteram valores no objeto Geralmente recebem um parâmetro que será usado para alterar uma variável de instância Normalmente o tipo de retorno é void Em inglês costumam iniciar com o prefixo set em Português define public void incrementaValor valor public void defineValorint v valor v Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 15 101 Implementando uma Classe Simples Métodos Estáticos x NãoEstáticos Quando um método ou membro é declarado como static ele existe e pode ser acessado mesmo se nenhum objeto da classe for criado lembrese da classe Math Para métodos de instância nãoestáticos é preciso instanciar um objeto da classe antes que o método possa ser invocado lembrese da classe Scanner Somente depois de criar um objeto é possível invocar os seus métodos nãoestáticos Métodos estáticos SOMENTE podem invocar métodos estáticos Métodos de instância podem acessar métodos estáticos Contador presentes new Contador Cria o objeto presentesincrementaValor Invoca um de seus metodos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 16 101 Construtores Construtores Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 17 101 Construtores Construtores Um construtor é um método que inicializa as variáveis de instância de um objeto Ele é automaticamente chamado quando um objeto é criado Ele tem exatamente o mesmo nome da classe Construtores nunca retornam valores mas não se usa void na sua declaração Classe para contagem de eventos simulando um dispositivo de contagem version 10 public class Contador private int valor Construtor que inicializa o valor com 0 public Contador Faz exatamente o que o construtor padrão valor 0 gerado pelo compilador faria public int obtemValor return valor public void incrementaValor valor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 18 101 Construtores Múltiplos Construtores Sobrecarga Uma classe pode ter mais de um construtor mas cada um tem que ter um conjunto único de parâmetros Classe para contagem de eventos simulando um dispositivo de contagem version 20 public class Contador private int valor Construtor que inicializa o valor com 0 public Contador valor 0 Construtor que inicializa o valor com um valor específico param v Valor inicial do contador que será criado public Contadorint v valor v public int obtemValor return valor public void incrementaValor valor O compilador seleciona o construtor que corresponde aos parâmetros especificados na construção Contador presentes new Contador10 Contador embarcaram new Contador Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 19 101 Construtores Sintaxe de Construtores Um construtor é invocado quando um objeto é criado com a palavrareservada new Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 20 101 Construtores O Construtor Padrão Se nenhum construtor for declarado o compilador criará um construtor padrão automaticamente Ele não receberá nenhum parâmetro Ele inicializará todas as variáveis de instância Números são inicializados com 0 booleanos com false e objetos com null Classe para contagem de eventos simulando um dispositivo de contagem version 10 public class Contador private int valor Construtor que inicializa o valor com 0 public Contador Faz exatamente o que o construtor padrão valor 0 gerado pelo compilador faria public int obtemValor return valor public void incrementaValor valor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 21 101 Exemplos Exemplos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 22 101 Exemplos Classe com main Contadorjava Classe para contagem de eventos simulando um dispositivo de contagem version 30 public class Contador private int valor public Contador valor 0 public Contadorint v valor v public int obtemValor return valor public void defineValorint v valor v public void zeraValor valor 0 public void incrementaValor valor public static String info return Contador Versão 30 Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Systemoutprintln Contadorinfo Contador c1 new Contador c2 new Contador100 Systemoutprintln c1 c1obtemValor c1incrementaValor Systemoutprintln c1 c1obtemValor for int i0 i23 i c2incrementaValor Systemoutprintln c2 c2obtemValor Contador c3 c2 Systemoutprintln c3 c3obtemValor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 23 101 Exemplos Duas Classes no mesmo Arquivo TestaContadorjava Classe para contagem de eventos simulando um dispositivo de contagem version 30 class Contador private int valor public Contador valor 0 public Contadorint v valor v public int obtemValor return valor public void defineValorint v valor v public void zeraValor valor 0 public void incrementaValor valor public static String info return Contador Versão 30 Classe para testar a classe Contador public class TestaContador Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Systemoutprintln Contadorinfo Contador c1 new Contador c2 new Contador100 Systemoutprintln c1 c1obtemValor c1incrementaValor Systemoutprintln c1 c1obtemValor for int i0 i23 i c2incrementaValor Systemoutprintln c2 c2obtemValor Contador c3 c2 Systemoutprintln c3 c3obtemValor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 24 101 Exemplos Classes em Arquivos Separados Contadorjava Classe para contagem de eventos simulando um dispositivo de contagem version 30 public class Contador private int valor public Contador valor 0 public Contadorint v valor v public int obtemValor return valor public void defineValorint v valor v public void zeraValor valor 0 public void incrementaValor valor public static String info return Contador Versão 30 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 25 101 Exemplos Classes em Arquivos Separados TestaContadorjava Classe para testar a classe Contador public class TestaContador Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Systemoutprintln Contadorinfo Contador c1 new Contador Systemoutprintln c1 c1obtemValor c1incrementaValor Systemoutprintln c1 c1obtemValor Contador c2 new Contador100 for int i0 i11 i c2incrementaValor Systemoutprintln c2 c2obtemValor Contador c3 c2 Systemoutprintln c3 c3obtemValor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 26 101 Passos para Implementar uma Classe Passos para Implementar uma Classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 27 101 Passos para Implementar uma Classe Passos para Implementar uma Classe 1 Crie uma lista informal de tarefas para os objetos adicionar obter limpar etc 2 Especifique a interface pública por exemplo para uma caixa registradora void adicionaItemdouble preco int obtemNumItems double obtemTotal void limpa 3 Documente a interface pública com comentários Javadoc Adiciona um item na caixa registradora param preco Preço do item a ser registrado 4 Determine as variáveis de instância private int numItens private double total 5 Implemente os construtores e métodos public void adicionaItemdouble preco numItens total total preco 6 Teste a classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 28 101 Passos para Implementar uma Classe Interface Pública de uma Classe Quando se projeta uma classe um dos primeiros passos é especificar a sua interface pública Por exemplo uma classe para uma caixa registradora Quais tarefas esta classe deverá executar Que métodos serão necessários Que parâmetros cada método receberá O que os métodos retornarão Tarefa Método Retorno Adiciona o preço de um item adicionaItemdouble void Obtém o total devido obtemTotal double Obtém o número de itens comprados obtemNumItens int Limpa o registro da caixa registradora para uma nova venda limpa void Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 29 101 Passos para Implementar uma Classe Escrevendo a Interface Pública de uma Classe É importante usar comentários no estilo Javadoc para documentar a classe e o funcionamento de cada método As declarações de métodos correspondem à interface pública da classe Os dados e o corpo dos métodos correspondem à implementação privada da classe Simula uma caixa registradora com número de itens e valor total dos itens public class CaixaRegistradora Adiciona um item na caixa registradora param preco Preço do item a ser registrado public void adicionaItemdouble preco numItens total total preco Obtém o valor total de todos os itens registrados return Valor total de todos os itens registrados public double obtemTotal return total Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 30 101 Passos para Implementar uma Classe Javadoc O utilitário javadoc gera um conjunto de arquivos HTML a partir dos comentários no estilo Javadoc Parâmetros e retornos de métodos devem ser descritos com as anotações param e return javadoc CaixaRegistradorajava Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 31 101 Passos para Implementar uma Classe Projetando a Representação de Dados Um objeto armazena dados em variáveis de instância Variáveis de instância são declaradas dentro da classe e devem ser privadas Simula uma caixa registradora com número de itens e valor total dos itens public class CaixaRegistradora private int numItems private double total Todos os métodos não estáticos dentro da classe têm acesso a elas podendo modificar os seus valores Quais dados os métodos da classe da caixa registradora necessitam Tarefa Método Dados necessá rios Adiciona o preço de um item adicionaItem total numItens Obtém o total devido obtemTotal total Obtém o número de itens comprados obtemNumItens numItens Limpa o registro da caixa registradora para uma nova venda limpa total numItens Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 32 101 Passos para Implementar uma Classe Variáveis de Instância de Objetos Cada objeto de uma classe tem um conjunto exclusivo de variáveis de instância Os valores armazenados nas variáveis de instância constituem o estado do objeto Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 33 101 Passos para Implementar uma Classe Acessando Variáveis de Instância Variáveis de instância privadas private não podem ser acessadas de fora da classe o compilador não permite esta violação de privacidade public static void mainString args CaixaRegistradora caixa1 new CaixaRegistradora Systemoutprintln caixa1numItens ERRO Em vez disto usamse métodos para acessar os dados da classe o encapsulamento provê uma interface pública e esconde os detalhes de implementação public static void mainString args CaixaRegistradora caixa1 new CaixaRegistradora Systemoutprintln caixa1obtemNumItens OK Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 34 101 Passos para Implementar uma Classe Implementando Métodos de Instância Métodos de instância acessam variáveis de instância privadas public void adicionaItemdouble preco numItens total total preco Métodos de instância São declarados dentro da classe como public Não há necessidade de especificar o nome do objeto parâmetro implícito quando se usa alguma variável de instância dentro de uma classe Os parâmetros explícitos variáveis paramétricas são listados na declaração do método Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 35 101 Passos para Implementar uma Classe Sintaxe de Métodos de Instância Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 36 101 Passos para Implementar uma Classe Parâmetros Implícitos e Explícitos Quando um item é adicionado isto afeta as variáveis de instância do objeto sobre o qual o método é invocado Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 37 101 Passos para Implementar uma Classe Erros Comuns 1 Não inicializar referências a objetos na construção Referências são inicializadas por padrão com null Chamar um médoto de uma referência que contém null resulta em um erro de execução NullPointerException O compilador consegue apenas detectar variáveis locais não inicializadas gerando um erro de compilação public class ErrosComuns private String nome O construtor default inicializará nome com null public void mostraNomes String nomeLocal Erro de execução javalangNullPointerException Systemoutprintln nomelength Erro de compilação a variável nomeLocal pode NÃO ter sido inicializada Systemoutprintln nomeLocallength Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 38 101 Passos para Implementar uma Classe Erros Comuns 2 Tentar chamar um construtor Não se pode chamar um construtor como é feito com outros métodos Ele é invocado automaticamente pela palavra reservada new CaixaRegistradora caixa new CaixaRegistradora Não se pode invocar um construtor para um objeto que já existe caixaCaixaRegistradora ERRO Mas podese criar um novo objeto usando uma referência existente CaixaRegistradora caixa new CaixaRegistradora caixaadicionaItem125 caixa new CaixaRegistradora Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 39 101 Passos para Implementar uma Classe Erros Comuns 3 Declarar um construtor como void Construtores não tem tipo de retorno Isto cria um método com um tipo de retorno void que NÃO é um construtor O compilador Java não considera isto um erro public class CaixaRegistradora Pretendiase criar um construtor public void CaixaRegistradora Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 40 101 Passos para Implementar uma Classe Sobrecarga Overloading Podese criar múltiplos construtores para uma classe Cada um deles tem o mesmo nome mas possui uma lista de parâmetros diferente Isto se chama sobrecarga e pode ser aplicado a qualquer método em Java Sobrecarga mesmo nome de método com parâmetros diferentes void imprimaCaixaRegistradora caixa void imprimaContaBancaria conta void imprimaint valor void imprimadouble valor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 41 101 Passos para Implementar uma Classe CaixaRegistradorajava Simula uma caixa registradora com número de itens e valor total dos itens Adaptado de HORSTMANN 2013 p 377 version 20 public class CaixaRegistradora private int numItens private double total Constrói um objeto sem qualquer item registrado public CaixaRegistradora numItens 0 total 00 Adiciona um item na caixa registradora param preco Preço do item a ser registrado public void adicionaItemdouble preco numItens total total preco Obtém o valor total de todos os itens registrados return Valor total de todos os itens registrados public double obtemTotal return total Obtém o número de itens registrados return Número de itens registrados public int obtemNumItens return numItens Limpa a caixa registradora para iniciar uma nova venda public void limpa numItens 0 total 00 Método estático que retorna informações sobre a classe return Cadeia de caracteres com o nome da classe e a sua versão public static String info return CaixaRegistradora Versão 10 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 42 101 Passos para Implementar uma Classe Fruteirajava import javautilScanner Programa que realiza o serviço de caixa registradora para uma fruteira public class Fruteira Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin SystemoutprintlnFruteira CaixaRegistradorainfo CaixaRegistradora caixa new CaixaRegistradora SystemoutprintlnDigite os valores dos itens e FIM para encerrar while inhasNextDouble double p innextDouble caixaadicionaItem p SystemoutprintlnTOTAL caixaobtemTotal SystemoutprintlnITENS caixaobtemNumItens Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 43 101 Passos para Implementar uma Classe Exercícios 1 Implemente uma classe chamada ContaBancaria que gerencie os dados de uma conta bancária considerando as seguintes informações número da conta valor inteiro nome do titular da conta cadeia de caracteres e saldo valor real Para gerenciar os objetos dessa classe implemente métodos para construir objetos considere um construtor que recebe todos os dados e outro que recebe o número da conta e o titular realizar depósito realizar saque considere que o valor do saldo NÃO poderá ser negativo obter os dados da conta modificar os dados da conta e obter uma cadeia de caracteres com todos os dados da conta chame este método de toString 2 Implemente uma classe com método main para exemplificar o uso da classe ContaBancaria Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 44 101 Passos para Implementar uma Classe Solução ContaBancariajava Classe que gerencia uma conta bancária public class ContaBancaria private int numero private String titular private double saldo public ContaBancariaint n String t double s numero n titular t saldo s public ContaBancariaint n String t numero n titular t saldo 00 public int obtemNumero return numero public String obtemTitular return titular public double obtemSaldo return saldo public void defineNumeroint n numero n public void defineTitularString t titular t public void defineSaldodouble s saldo s public void depositadouble v saldo v public void sacadouble v if v saldo saldo v else saldo 00 public String toString return numero titular R saldo public static String info return ContaBancaria Versão 10 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 45 101 Passos para Implementar uma Classe Solução GerenciaContaBancariajava import javautilScanner Este programa testa a classe ContaBancaria public class GerenciaContaBancaria Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin ContaBancaria conta new ContaBancaria1234Fulano de Tal SystemoutprintlnComandos deposita valor saca valor ou fim while true Systemoutprintf d s R2f contaobtemNumero contaobtemTitular contaobtemSaldo String comando innexttrimtoLowerCase if comandoequalsfim break else if comandoequalsdeposita if inhasNextDouble contadeposita innextDouble else Systemoutprintf ERRO Comando depositar usado com valor inválido s innext else if comandoequalssaca if inhasNextDouble contasaca innextDouble else Systemoutprintf ERRO Comando sacar usado com valor inválido s innext else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 46 101 Testando uma Classe Testando uma Classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 47 101 Testando uma Classe Testando uma Classe A maioria das classes que os programadores criam não possui método main pois elas são criadas para fazer parte de um programa maior Para testar uma classe será preciso criar um teste unitário Para testar uma nova classe podese usar Ferramentas de programação que criam objetos interativamente DrJava httpwwwdrjavaorg BlueJ httpwwwbluejorg Escrever uma classe de teste com um método main public class TestaContaBancaria public static void mainString args ContaBancaria c1 new ContaBancaria Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 48 101 Testando uma Classe Usando BlueJ para Teste BlueJ pode instanciar objetos de uma classe interativamente o que permite que seus métodos sejam invocados Isto é excelente para realizar testes Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 49 101 Testando uma Classe Criando uma Unidade de Teste Uma unidade de teste verifica se uma classe funciona corretamente de forma isolada fora do programa completo Ela deve testar todos os métodos identificando quando alguma inconsistência for identificada Este programa testa a classe CaixaRegistradora public class TestaCaixaRegistradora Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args CaixaRegistradora caixa new CaixaRegistradora if caixaobtemNumItens0 caixaobtemTotal00 SystemerrprintlnERRO Systemexit1 caixaadicionaItem125 if caixaobtemNumItens1 caixaobtemTotal125 SystemerrprintlnERRO Systemexit1 caixaadicionaItem065 if caixaobtemNumItens2 caixaobtemTotal19 SystemerrprintlnERRO Systemexit1 caixaadicionaItem210 if caixaobtemNumItens3 caixaobtemTotal40 SystemerrprintlnERRO Systemexit1 caixalimpa if caixaobtemNumItens0 caixaobtemTotal00 SystemerrprintlnERRO Systemexit1 Systemoutprintln CaixaRegistradorainfo OK Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 50 101 Padrões para Dados de Objetos Padrões para Dados de Objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 51 101 Padrões para Dados de Objetos Padrões para Dados de Objetos Existem alguns padrões comuns quando variáveis de instância são projetadas Manter um total Contar eventos Coletar valores Gerenciar propriedades de objetos Modelar objetos com diferentes estados Descrever a posição de um objeto Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 52 101 Padrões para Dados de Objetos Padrão Manter um Total Exemplos Total de caixas registradoras Saldo de contas bancárias Nível do tanque de gasolina de um carro Variáveis necessárias Total total Métodos necessários Adição adicionaItem Inicialização limpa Acesso obtemTotal Simula uma caixa registradora simples version 00 public class CaixaRegistradora private double total public void adicionaItemdouble preco total preco public void limpa total 0 public double obtemTotal return total Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 53 101 Padrões para Dados de Objetos Padrão Contar Eventos Exemplos Número de itens de uma caixa registradora Custo de transações bancárias Variáveis necessárias Contagem numItens Métodos necessários Incrementar adicionaItem Inicialização limpa Acesso obtemNumItens Simula uma caixa registradora version 10 public class CaixaRegistradora private int numItens private double total public void adicionaItemdouble preco numItens total total preco public double obtemTotal return total public int obtemNumItens return numItens public void limpa numItens 0 total 00 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 54 101 Padrões para Dados de Objetos Padrão Colectar Valores Exemplos Carrinho de compras Questões de múltipla escolha Placar de pontos Opções de um menu Valores armazenados por exemplo usando um array parcialmente preenchido Construtor Inicializa ou cria a coleção vazia Métodos necessários Adição adicionaItem obtemNumItens obtemItem Gerencia um cacrrinho de compras em uma loja virtual com até 50 itens usando um vetor parcial public class CarrinhoDeCompras private static final int MAXITENS 10 private String itens private int numItens public CarrinhoDeCompras itens new StringMAXITENS numItens 0 public void adicionaItemString nome if numItens itenslength itensnumItens nome numItens public int obtemNumItens return numItens public String obtemItemint i if i0 inumItens return null return itensi Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 55 101 Padrões para Dados de Objetos Padrão Gerenciar Propriedades de Objetos Uma propriedade de um objeto pode ser definida e recuperada Exemplos Estudante matrícula e nome Construtor Inicializa as variáveis de instância Métodos necessários Obtenção obtemMatricula obtemNome Definição defineMatricula defineNome Classe para gerenciar informações de um estudante public class Estudante private int matricula private String nome public Estudanteint m String n matricula m nome n public int obtemMatricula return matricula public String obtemNome return nome public void defineMatriculaint m matricula m public void defineNomeString n nome n Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 56 101 Padrões para Dados de Objetos Padrão Modelar Objetos com Diferentes Estados Alguns objetos podem estar em um estado de um conjunto de estados possíveis Exemplos Um peixe que pode estar nos seguintes estados sem forme com alguma fome com muita fome O peixe inicia sem fome construtor A fome do peixe é alterada através de come nada Podese conferir a fome com obtemFome Simula o comportamento de um peixe public class Peixe public static final int SEMFOME 0 public static final int COMALGUMAFOME 1 public static final int COMMUITAFOME 2 private int fome public Peixe fome SEMFOME public void come fome SEMFOME public void nada if fome COMMUITAFOME fome public int obtemFome return fome Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 57 101 Padrões para Dados de Objetos Padrão Descrever a Posição de um Objeto Exemplos Inseto em uma grade Objetos de um jogo Bala de canhão Valores armazenados Linha coluna direção etc Métodos necessários construtor anda gira Gerencia a movimentação de um inseto em uma grade version 10 public class Inseto public static final int LESTE 0 SUL 1 OESTE 2 NORTE 3 public static final int LINHAS 3 COLUNAS 8 private int linha coluna direcao public Inseto linha coluna direcao 0 public void anda switch direcao case LESTE if coluna COLUNAS1 coluna break case OESTE if coluna 0 coluna break case SUL if linha LINHAS1 linha break case NORTE if linha 0 linha break public void gira direcao direcao 1 4 public String toString return linhalinha colunacoluna direcaodirecao Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 58 101 Padrões para Dados de Objetos Exercícios 1 Implemente quatro classes cada uma com seu método main para testar as classes CarrinhoDeCompras Estudante Peixe e Inseto citadas nas 4 lâminas anteriores Sugestão na classe Inseto substitua o método toString por um método que mostre a grade com o inseto na sua posição e direção corretas use os caracteres v e para indicar o inseto e sua direção use para indicar uma posição vazia da grade Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 59 101 Padrões para Dados de Objetos Solução SelecionaProdutosjava import javautilScanner Este programa testa a classe CarrinhoDeCompras public class SelecionaProdutos Mostra um CarrinhoDeCompras param carrinho Carrinho de compras a ser mostrado public static void mostraCarrinhoDeCompras c Systemoutprintln Carrinho de Compras for int i0 icobtemNumItens i Systemoutprintln i1 cobtemItemi Systemoutprintln Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin CarrinhoDeCompras carrinho new CarrinhoDeCompras SystemoutprintlnComandos adiciona nomeDoProduto ou fim while true mostra carrinho String comando innextLinetrim if comandotoLowerCaseequalsfim break else if comandotoLowerCaseindexOfadiciona 0 carrinhoadicionaItem comandosubstring9trim else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 60 101 Padrões para Dados de Objetos Solução GerenciaEstudantejava import javautilScanner Este programa testa a classe Estudante public class GerenciaEstudante Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin Estudante estudante new Estudante1234Fulano de Tal SystemoutprintlnComandos nome novoNome matricula novaMatricula ou fim while true Systemoutprintf d s estudanteobtemMatricula estudanteobtemNome String comando innextLinetrim if comandotoLowerCaseequalsfim break else if comandotoLowerCaseindexOfnome 0 estudantedefineNome comandosubstring5trim else if comandotoLowerCaseindexOfmatricula 0 estudantedefineMatricula IntegerparseInt comandosubstring10trim else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 61 101 Padrões para Dados de Objetos Solução ControlaPeixejava import javautilScanner Este programa testa a classe Peixe public class ControlaPeixe Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin Peixe peixe new Peixe SystemoutprintlnComandos nada come ou fim while true Systemoutprintln Nível de fome do peixe peixeobtemFome String comando innexttrimtoLowerCase if comandoequalsfim break else if comandoequalsnada peixenada else if comandoequalscome peixecome else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 62 101 Padrões para Dados de Objetos Solução Insetojava Gerencia a movimentação de um inseto em uma grade version 20 public class Inseto public static final int LESTE 0 SUL 1 OESTE 2 NORTE 3 public static final int LINHAS 3 COLUNAS 8 private int linha coluna direcao public Inseto linha coluna direcao 0 public void anda switch direcao case LESTE if coluna COLUNAS1 coluna break case OESTE if coluna 0 coluna break case SUL if linha LINHAS1 linha break case NORTE if linha 0 linha break public void gira direcao direcao 1 4 public String toString String res char inseto v for int i0 iLINHAS i for int j0 jCOLUNAS j if i linha j coluna res insetodirecao else res res return res Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 63 101 Padrões para Dados de Objetos Solução ControlaInsetojava import javautilScanner Este programa testa a classe Inseto public class ControlaInseto Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin Inseto inseto new Inseto SystemoutprintlnComandos gira anda ou fim while true Systemoutprintln insetotoString String comando innexttrimtoLowerCase if comandoequalsfim break else if comandoequalsgira insetogira else if comandoequalsanda insetoanda else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 64 101 Referências a Objetos Referências a Objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 65 101 Referências a Objetos Referências a Objetos Uma referência a um objeto especifica a localização de memória do objeto Objetos são parecidos com arrays porque eles também são acessados por referências Referência a array double valores new double6 Referência a objeto CaixaRegistradora caixa new CaixaRegistradora Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 66 101 Referências a Objetos Referências Compartilhadas Múltiplas variáveis do tipo objeto podem conter referências para o mesmo objeto Referência simples CaixaRegistradora caixa new CaixaRegistradora Referências compartilhando o mesmo objeto CaixaRegistradora aux caixa Os valores internos podem ser alterados através de qualquer uma das referências Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 67 101 Referências a Objetos Cópia de Tipos Primitivos versus de Referências Variáveis de tipos primitivos podem ser copiadas mas funcionam de forma diferente do que referências de objetos Cópia de dados primitivos 2 localizações int num1 10 int num2 num1 num2 Cópia de referências 2 referências para a mesma localização CaixaRegistradora caixa new CaixaRegistradora CaixaRegistradora aux caixa auxadicionaItem125 Objetos podem ocupar muito mais espaço por isso Java realiza a cópia apenas da referência Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 68 101 Referências a Objetos A Referência null Uma referência pode apontar para nenhum objeto null Não se pode invocar métodos de um objeto através de uma referência null pois isto causará uma exceção CaixaRegistradora caixa null Systemoutprintln caixaobtetmTotal Erro de execução Devese testar todas as referência antes de tentar acessálas String nomeDoMeio null Nenhum nome do meio if nomeDoMeio null Systemoutprintln nome sobrenome else Systemoutprintln nome nomeDoMeio sobrenome Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 69 101 Referências a Objetos A Referência this Métodos recebem um parâmetro implícito em uma variável de referência chamada this Tratase de uma referência ao objeto sobre o qual o método foi invocado Assim podese deixar mais claro quando será usada uma variável de instância void adicionaItemdouble preco thisnumItens thistotal thistotal preco Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 70 101 Referências a Objetos Referências a this em Construtores A referência this é muito usada em construtores e setters assim variáveis paramétricas e de instância podem ter o mesmo nome public class Estudante private int matricula private String nome public Studentint matricula String nome thismatricula matricula thisnome nome Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 71 101 Variáveis Estáticas e Métodos Variáveis Estáticas e Métodos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 72 101 Variáveis Estáticas e Métodos Variáveis e Métodos Estáticos Variáveis podem ser declaradas como static na declaração da classe Haverá apenas uma cópia da variável static que será compartilhada entre todos os objetos da classe public class ContaBancaria private int numero private String titular private double saldo private static int proximoNumeroDeConta 1000 public ContaBancariaString t numero proximoNumeroDeConta titular t saldo 00 Métodos de qualquer objeto da classe podem usar ou alterar o valor de uma variável static Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 73 101 Variáveis Estáticas e Métodos Usando Variáveis Estáticas Exemplo Cada vez que uma nova conta for criada a variável proximoNumeroDeConta será incrementada pelo construtor Acessase a variável usando NomeDaCassenomeDaVariavel Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 74 101 Variáveis Estáticas e Métodos Usando Métodos Estáticos A API de Java tem muitas classes que provêm métodos que podem ser usados sem que se necessite instanciar um objeto A classe Math é um bom exemplo disso Por exemplo Mathsqrtvalor é um método estático que retorna a raiz quadrada de um valor Não é necessário instanciar um objeto da classe Math antes de usálo Métodos static são chamados usando NomeDaClassenomeDoMetodo Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 75 101 Variáveis Estáticas e Métodos Escrevendo Seus Próprios Métodos Estáticos Você pode definir seus próprios métodos estáticos public class Financeiro Calcula a porcentagem de determinado valor param porcentagem A porcentagem a ser aplicada param quantia A quania sobre a qual a porcentagem será aplicada return A porcentagem especificada da quantia public static double percentualDedouble porcentagem double quantia return porcentagem 1000 quantia Invocase o método estático sobre a classe e não sobre um objeto double taxa FinanceiropercentualDepercentual total Métodos estáticos geralmente retornam um valor Eles apenas podem acessar variáveis estáticas e métodos estáticos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 76 101 Exercício Exercício Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 77 101 Exercício Exercício Forca Implemente uma classe para executar um jogo de Forca Forcajava e uma classe para instanciar um objeto desta classe permitindo que o usuário dispute interativamente uma partida de Forca contra o computador Appjava Pense inicialmente nos métodos que deverão ser chamados para executar o jogo Implemente um método main na classe Appjava para criar um objeto da classe Forca e executar os métodos desse objeto A seguir pense nos dados que deverão ser armazenados para cada objeto da classe Forca e implementea Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 78 101 Exercício Solução Appjava import javautilScanner public class App public static void mainString args String enforcado O O O O O O Scanner in new ScannerSystemin Systemoutprintfs Forcainfo Forca jogo new Forca while jogonaoTerminou Systemoutprintln enforcadojogoobtemErros Palavra secreta jogoobtemIncognita SystemoutprintLetras chutadas jogoobtemLetrasChutadas Letra String letra innexttrimtoUpperCase if letraequalsFIM Systemexit0 jogochutaLetra letracharAt0 if jogoobtemErros 6 Systemoutprintln Parabéns Você conseguiu acertar a palavra else Systemoutprintln Que pena Infelizmente você NÃO acertou a palavra Tente novamente Systemoutprintf Palavra secreta s jogoobtemPalavra Systemoutprintln enforcadojogoobtemErros Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 79 101 Exercício Solução Forcajava public class Forca private String palavra private int erros letrasResolvidas private char incognita private boolean letrasChutadas public static final String palavras ADAPTADORALFABETOBIBLIOTECABENCHMARKBUFFERBOOTPRIMITIVORECURSIVIDADE CONTEXTOLINGUAGEMESCOPOPROCESSOPROCEDIMENTOHARDWARESOFTWAREFIRMWAREBITINTERFACEPROTOCOLOVALOR SOBRECARGASOBRESCRITAJAVAMODELOMODELAGEMPESQUISAPALAVRASTRINGCLASSEOBJETOTIPOREGISTROBYTE public static String info return Forca Versão 10 public Forca palavra palavras intMathrandom palavraslength letrasChutadas new boolean26 erros letrasResolvidas 0 incognita new charpalavralength for int i0 ipalavralength i incognitai public boolean naoTerminou return erros 6 letrasResolvidas palavralength public String obtemPalavra return erros 6 letrasResolvidas palavralength palavra public int obtemErros return erros public String obtemIncognita String res CharactertoStringincognita0 for int i1 ipalavralength i res incognitai return res public boolean chutaLetrachar letra int indLetra 0 acertos 0 letra CharactertoUpperCaseletra if letraA letra Z indLetra letra A else return false if letrasChutadasindLetra return false letrasChutadasindLetra true for int i0 ipalavralength i if letra palavracharAti acertos letrasResolvidas incognitai letra if acertos 0 erros return true public String obtemLetrasChutadas String res for int i0 iletrasChutadaslength i if letrasChutadasi res charAi else res return res Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 80 101 Arrays de Objetos Arrays de Objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 81 101 Arrays de Objetos Arrays de Objetos Quando se cria um array de algum tipo primitivo Java preenche todas as posições com um valor nulo 0 00 false etc double vet new double100 Quando se cria um array de objetos Java preenche todas as posições com null Classe objeto new Classe100 Nenhum construtor será chamado Isto significa que apenas o array foi criado e NÃO os objetos É preciso executar o operador new também para cada um dos objetos for int i0 iobjetolength i objetoi new Classe Agora sim o construtor será chamado Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 82 101 Arrays de Objetos Exercício 1 Implemente uma classe chamada Pessoa que armazena nome String idade int e telefone String Para esta classe implemente construtores sem parâmetros e com todos os parâmetros métodos de acesso para todas a s variáveis de instância métodos de modificação para todas as variáveis de instância e método toString 2 Implemente uma classe chamada Agenda para armazenar até 50 objetos da classe Pessoa Esta classe deverá usar internamente um vetor parcialmente preenchido de objetos da classe Pessoa Para esta classe implemente os seguintes métodos construtor sem parâmetros adicionaPessoaPessoa p obtemNumPessoas obtemPessoaint i toString e ordena 3 Implemente uma classe para adicionar um número indeterminado de itens na agenda ordenar a agenda e mostrála Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 83 101 Arrays de Objetos Solução Pessoajava Classe para gerenciar nome idade e telefone de uma pessoa public class Pessoa private String nome private int idade private String telefone public Pessoa nome idade 0 telefone public PessoaString n int i String t nome n idade i telefone t public String obtemNome return nome public int obtemIdade return idade public String obtemTelefone return telefone public void defineNomeString n nome n public void defineIdadeint i idade i public void defineTelefoneString t telefone t public String toString return nome idade telefone Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 84 101 Arrays de Objetos Solução Agendajava Classe que gerencia uma agenda formada por um array de objetos da classe Pessoa public class Agenda private final int MAXPESSOAS 10 private Pessoa pessoas private int numPessoas public Agenda pessoas new PessoaMAXPESSOAS numPessoas 0 public int obtemNumPessoas return numPessoas public boolean adicionaPessoaPessoa p if pnull numPessoaspessoaslength return false else pessoas numPessoas p return true public Pessoa obtemPessoaint i return i0 inumPessoas pessoasi null public String toString String res for int i0 inumPessoas i res pessoasitoString return res public void ordena for int i0 inumPessoas1 i int men i for int ji1 jnumPessoas j if pessoasjobtemNomecompareTopessoasmenobtemNome 0 men j if men i Pessoa aux pessoasmen pessoasmen pessoasi pessoasi aux Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 85 101 Arrays de Objetos Solução Appjava import javautilScanner public class App public static void mainString args Scanner in new ScannerSystemin Agenda agenda new Agenda Systemoutprintln Gerenciador de Agenda Comandos adiciona mostra ordena ou fim boolean fim false while fim String cmd innextLinetrimtoLowerCase switch cmd case adiciona SystemoutprintNome String nome innextLine SystemoutprintIdade int idade IntegerparseInt innextLine SystemoutprintTelefone String telefone innextLine Pessoa p new Pessoanomeidadetelefone Systemoutprintln agendaadicionaPessoap OK Adicionado ERRO SEM espaço break case mostra Systemoutprintln agendatoString break case ordena agendaordena break case fim fim true break default Systemoutprintf ERRO Comando s inválido cmd inclose Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 86 101 Arrays de Objetos Exercício 1 Implemente uma classe Carro com as propriedades descritas a seguir Um carro apresenta certo consumo de combustível medido em quilômetros por litro e tem certa quantidade de combustível no seu tanque de gasolina O consumo é especificado no construtor e o nível inicial de combustível é 0 Implemente além do construtor os seguintes métodos public double obtemConsumo retorna o consumo do carro em kmlitro public void defineConsumodouble c define o consumo do carro em kmlitro public double dirigedouble km tenta dirigir por detereminado número de km considerando a quantidade de combustível no tanque retorna o número de km que efetivamente foram percorridos public double obtemNivelTanque retorna o nível do tanque em litros public void abastecedouble litros adiciona combustível no tanque do carro Exemplo de uso Carro meuCarro new Carro100 Cria um carro que consome 10 km por litro meuCarroabastece400 Abastece 40 litros double km meuCarrodirige1000 Dirige o carro por 100 km SystemoutprintfDirigiu por f km e tem f litros no tanque km meuCarroobtemNivelTanque 2 Implemente uma classe chamada ControlaCarro com um método main para testar o funcionamento da classe Carro Sugestão para esta classe use a classe GerenciaContaBancaria como referência Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 87 101 Arrays de Objetos Solução Carrojava Classe para gerenciar um carro com determinado consumo de combustível public class Carro private double consumo private double nivelTanque public Carrodouble c consumo c nivelTanque 00 public double obtemConsumo return consumo public void defineConsumodouble c consumo c public double dirigedouble km double litros km consumo if litros nivelTanque km nivelTanque consumo nivelTanque 00 else nivelTanque litros return km public double obtemNivelTanque return nivelTanque public void abastecedouble litros nivelTanque litros Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 88 101 Arrays de Objetos Solução ControlaCarrojava Classe para controlar um objeto da classe Carro import javautilScanner public class ControlaCarro public static void mainString args Scanner in new ScannerSystemin SystemoutprintControlaCarro Comandos consumo kml dirige km abastece l fim Carro carro new Carro100 while true Systemoutprintf consumo3f kml nivelTanque3f l carroobtemConsumo carroobtemNivelTanque String comando innexttrimtoLowerCase if comandoequalsfim break else if comandoequalsconsumo if inhasNextDouble carrodefineConsumo innextDouble else Systemoutprintf ERRO Comando consumo usado com valor inválido s innext else if comandoequalsdirige if inhasNextDouble double km carrodirige innextDouble Systemoutprintf dirigiu 3f km km else Systemoutprintf ERRO Comando dirige usado com valor inválido s innext else if comandoequalsabastece if inhasNextDouble carroabastece innextDouble else Systemoutprintf ERRO Comando abastece usado com valor inválido s innext else Systemoutprintf ERRO Comando s inválido comando inclose Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 89 101 Arrays de Objetos Exercício 1 Crie uma classe GameOfLife para implementar e executar os autômatos descritos em httpsenwikipediaorgwikiConway27sGameofLife Uma sugestão de interface para esta classe pode ser a seguinte public class GameOfLife private boolean grid matriz de booleans que corresponde ao grid private boolean next matriz auxiliar public GameOfLifeint n aloca matrizes n x n de booleans public GameOfLifeint lin int col aloca matrizes lin x col de booleans public boolean setint l int c liga a célula lc do grid public int liveNeighboursint l int c conta o número de vizinhos ativos de uma célula public void nextStep gera próximo passo do autômato em next e depois troca next e grid public String toString gera uma representação do estado do autômato em um String 2 Implemente classes para os autômatos de exemplo apresentados em httpsenwikipediaorgwikiConway27sGameofLife Para facilitar o uso de animações em modo texto use a seguinte classe public class Terminal public static void clrscr Systemoutprintfc2J27 public static void gotoxyint xint y SystemoutprintfcddH27xy 3 Use como exemplo de autômato a classe Blinker na próxima lâmina Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 90 101 Arrays de Objetos Solução Blinkerjava public class Blinker public static void mainString args throws InterruptedException GameOfLife grid new GameOfLife5 gridset21 gridset22 gridset23 Terminalclrscr for int i0 i10 i Terminalgotoxy11 Systemoutprintln gridtoString Threadsleep1000 gridnextStep Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 91 101 Sumário Sumário Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 92 101 Sumário Sumário Classes e Objetos Uma classe descreve um conjunto de objetos com o mesmo comportamento Cada classe tem uma interface pública uma coleção de métodos através dos quais os objetos da classe podem ser manipulados Encapsulamento consiste em prover uma interface pública e esconder os detalhes de implementação Encapsulamento habilita alterações na implementação sem afetar os usuários da classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 93 101 Sumário Sumário Variáveis e Métodos Variáveis de Instância de objetos armazenam dados que são usados pelos seus métodos Cada objeto de uma classe tem seu próprio conjunto de variáveis de instância Um método de instância pode acessar variáveis de instância do objeto sobre o qual ele atua Uma variável de instância privada pode ser acessada apenas por métodos de sua própria classe Variáveis declaradas como estáticas em uma classe possuem uma única cópia compartilhada entre todos os objetos criados a partir desta classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 94 101 Sumário Sumário Cabeçalhos de Métodos Dados Cabeçalhos de Métodos Podese usar cabeçalhos de métodos e comentários de métodos para especificar a interface pública de uma classe Um método mutator altera o objeto sobre o qual ele opera Um método accessor não altera o objeto sobre o qual ele atua Declaração de Dados Para cada método accessor um objeto deve ou armazenar ou calcular o resultado Frequentemente há mais de uma forma de representar os dados de um objeto e devese fazer uma escolha Devese ter certeza de que a representação de dados suporta chamadas de métodos em qualquer ordem Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 95 101 Sumário Sumário Parâmetros Construtores Parâmetros de Métodos O objeto sobre o qual um método é aplicado é o parâmetro implícito Parâmetros explícitos de um método são listados na declaração do método Construtores Um construtor inicializa as variáveis de instância do objeto Um construtor é invocado quando um objeto é criado com o operador new O nome de um construtor é sempre o mesmo que o nome da classe Uma classe pode ter múltiplos construtores O compilador seleciona o construtor compatível com os argumentos especificados na criação do objeto Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 96 101 Tópicos Complementares Tópicos Complementares Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 97 101 Tópicos Complementares Depurando Objetos Uma sugestão para depurar programas que usam objetos é criar um cartão para cada objeto na parte frontal se apresentam os métodos da interface pública no verso se controla os dados encapsulados Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 98 101 Tópicos Complementares Depurando Objetos 2 Quando o construtor for chamado as variáveis de instância são inicializadas Quando um método mutator for chamado será necessário atualizar variáveis de instância Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 99 101 Referências Referências Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 100 101 Referências Referências HORSTMANN C Java for Everyone Late Objects 2 ed Hoboken Wiley 2013 xxxiv 589 p Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 101 101
8
Linguagens de Programação
PUC
1
Linguagens de Programação
PUC
8
Linguagens de Programação
PUC
1
Linguagens de Programação
ESPM
2
Linguagens de Programação
ESPM
1
Linguagens de Programação
UMG
1
Linguagens de Programação
IFF
8
Linguagens de Programação
IFF
1
Linguagens de Programação
IFF
51
Linguagens de Programação
MULTIVIX
Texto de pré-visualização
Objetos e Classes Roland Teodorowitsch Fundamentos de Programação Escola Politécnica PUCRS 17 de junho de 2023 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 1 101 Introdução Introdução Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 2 101 Introdução Objetivos Entender os conceitos de classes objetos e encapsulamento Implementar variáveis métodos e construtores de instância Ser capaz de projetar implementar e testar classes Entender o compartamento de referências a objetos variáveis estáticas e métodos estáticos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 3 101 Introdução Conteúdos Programação Orientada a Objetos Implementando uma Classe Simples Construtores Exemplos Passos para Implementar uma Classe Testando uma Classe Padrões para Dados de Objetos Referências a Objetos Variáveis e Métodos Estáticos Sumário Tópicos Complementares Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 4 101 Programação Orientada a Objetos Programação Orientada a Objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 5 101 Programação Orientada a Objetos Programação Orientada a Objetos Até agora foram apresentadas técnicas de programação estruturada Quebrar tarefas em subtarefas Escrever métodos reusáveis para tratar tarefas A partir de agora serão estudados objetos e classes Para construir programas maiores e mais complexos Para modelar objetos que são usados no mundo real Classes e Objetos Uma classe descreve objetos com um comportamento comum Por exemplo a classe Carro descreve todos os veículos de passageiros que tem determinada capacidade e formato Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 6 101 Programação Orientada a Objetos Objetos e Programas Programas Java são feitos por objetos que interagem uns com os outros Cada objeto é baseado em uma classe Uma classe descreve um conjunto de objetos o mesmo comportamento Cada classe define um conjunto específico de métodos para ser usado com os seus objetos Por exemplo a classe String provê métodos tais como length e charAt Estes métodos foram definidos na classe String e podem ser usados por qualquer objeto desta classe String boasVindas Sejam bemvindos int tamanho boasVindaslength char caract1 boasVindascharAt0 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 7 101 Programação Orientada a Objetos Diagrama de Classes Dados Privados Cada objeto tem seus próprios dados privados que outros objetos não podem acessar diretamente Métodos da interface pública provêm acesso a dados privados enquanto escondem detalhes de implementação Isto é chamado de encapsulamento Interface Pública Cada objeto tem um conjunto de métodos disponível para ser usado por outros objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 8 101 Programação Orientada a Objetos Tipos Abstratos de Dados Abstração é uma visão ou representação de uma entidade que inclui apenas os seus atributos mais importantes segundo determinado ponto de vista Em Computação usase a abstração para atenuar a complexidade de problemas Um Tipo Abstrato de Dados TAD é uma estrutura sintática que define um tipo para determinada entidade de forma que quem o usa não necessite conhecer os detalhes da sua implementação armazenamento interno de dados ou implementação de operações suportadas TADs são importantes para garantir encapsulamento Encapsulamento é uma técnica que agrupa elementos relacionados entre si tipos variáveis métodos etc em um módulo escondendo do usuário seus detalhes internos o que garante abstração O encapsulamento define quais partes de um objeto serão visíveis públicas e quais partes permanecerão ocultas privadas Em Java classes são usadas para a criação de Tipos Abstratos de Dados Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 9 101 Implementando uma Classe Simples Implementando uma Classe Simples Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 10 101 Implementando uma Classe Simples Implementando uma Classe Simples Exemplo contador Uma classe que modela um dispositivo mecânico que é usado para realizar contagens Por exemplo para contar quantas pessoas estão assistindo a um concerto ou quantas pessoas embarcaram em um ônibus O que deve ser feito Inicializar o contador Java já faz isso automaticamente Incrementar o dispositivo Obter o valor atual Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 11 101 Implementando uma Classe Simples Classe Contador Especificase variáveis de instância na declaração da classe Cada objeto instanciado a partir desta classe terá seu próprio conjunto de variáveis de instância Cada objeto da classe Contador terá sua própria variável valor Especificadores de acesso Classes e métodos de interface são públicos public Variáveis de instância são privadas private Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 12 101 Implementando uma Classe Simples Instanciando Objetos Objetos são criados a partir de classes Usase o operador new para construir objetos Cada objeto recebe um nome único da mesma forma que uma variável O operador new já apareceu em exemplos anteriores Scanner in new ScannerSystemin Para criar duas instâncias de objetos da classe Contador usase NomeClasse nomeObjeto new NomeClasse Contador presentes new Contador Contador embarcaram new Contador Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 13 101 Implementando uma Classe Simples Métodos da Classe Contador Dois métodos serão usados para acessar as variáveis de instância dos objetos da classe Contador incrementaValor incrementa o valor da variável de instância valor obtemValor retorna o valor da variável de instância valor Para usar estes métodos é preciso especificar sobre qual objeto eles deverão ser aplicados presentesincrementaValor embarcaramincrementaValor Classe para contagem de eventos simulando um dispositivo de contagem version 00 public class Contador private int valor public int obtemValor return valor public void incrementaValor valor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 14 101 Implementando uma Classe Simples Tipos de Métodos 1 Métodos de Acesso Accessors ou getters Solicitam uma informação ao objeto sem alterálo Normalmente retornam algum valor Em inglês costumam iniciar com o prefixo get em Português obtem public int obtemValor return valor 2 Métodos de Alteração Mutators ou setters Alteram valores no objeto Geralmente recebem um parâmetro que será usado para alterar uma variável de instância Normalmente o tipo de retorno é void Em inglês costumam iniciar com o prefixo set em Português define public void incrementaValor valor public void defineValorint v valor v Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 15 101 Implementando uma Classe Simples Métodos Estáticos x NãoEstáticos Quando um método ou membro é declarado como static ele existe e pode ser acessado mesmo se nenhum objeto da classe for criado lembrese da classe Math Para métodos de instância nãoestáticos é preciso instanciar um objeto da classe antes que o método possa ser invocado lembrese da classe Scanner Somente depois de criar um objeto é possível invocar os seus métodos nãoestáticos Métodos estáticos SOMENTE podem invocar métodos estáticos Métodos de instância podem acessar métodos estáticos Contador presentes new Contador Cria o objeto presentesincrementaValor Invoca um de seus metodos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 16 101 Construtores Construtores Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 17 101 Construtores Construtores Um construtor é um método que inicializa as variáveis de instância de um objeto Ele é automaticamente chamado quando um objeto é criado Ele tem exatamente o mesmo nome da classe Construtores nunca retornam valores mas não se usa void na sua declaração Classe para contagem de eventos simulando um dispositivo de contagem version 10 public class Contador private int valor Construtor que inicializa o valor com 0 public Contador Faz exatamente o que o construtor padrão valor 0 gerado pelo compilador faria public int obtemValor return valor public void incrementaValor valor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 18 101 Construtores Múltiplos Construtores Sobrecarga Uma classe pode ter mais de um construtor mas cada um tem que ter um conjunto único de parâmetros Classe para contagem de eventos simulando um dispositivo de contagem version 20 public class Contador private int valor Construtor que inicializa o valor com 0 public Contador valor 0 Construtor que inicializa o valor com um valor específico param v Valor inicial do contador que será criado public Contadorint v valor v public int obtemValor return valor public void incrementaValor valor O compilador seleciona o construtor que corresponde aos parâmetros especificados na construção Contador presentes new Contador10 Contador embarcaram new Contador Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 19 101 Construtores Sintaxe de Construtores Um construtor é invocado quando um objeto é criado com a palavrareservada new Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 20 101 Construtores O Construtor Padrão Se nenhum construtor for declarado o compilador criará um construtor padrão automaticamente Ele não receberá nenhum parâmetro Ele inicializará todas as variáveis de instância Números são inicializados com 0 booleanos com false e objetos com null Classe para contagem de eventos simulando um dispositivo de contagem version 10 public class Contador private int valor Construtor que inicializa o valor com 0 public Contador Faz exatamente o que o construtor padrão valor 0 gerado pelo compilador faria public int obtemValor return valor public void incrementaValor valor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 21 101 Exemplos Exemplos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 22 101 Exemplos Classe com main Contadorjava Classe para contagem de eventos simulando um dispositivo de contagem version 30 public class Contador private int valor public Contador valor 0 public Contadorint v valor v public int obtemValor return valor public void defineValorint v valor v public void zeraValor valor 0 public void incrementaValor valor public static String info return Contador Versão 30 Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Systemoutprintln Contadorinfo Contador c1 new Contador c2 new Contador100 Systemoutprintln c1 c1obtemValor c1incrementaValor Systemoutprintln c1 c1obtemValor for int i0 i23 i c2incrementaValor Systemoutprintln c2 c2obtemValor Contador c3 c2 Systemoutprintln c3 c3obtemValor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 23 101 Exemplos Duas Classes no mesmo Arquivo TestaContadorjava Classe para contagem de eventos simulando um dispositivo de contagem version 30 class Contador private int valor public Contador valor 0 public Contadorint v valor v public int obtemValor return valor public void defineValorint v valor v public void zeraValor valor 0 public void incrementaValor valor public static String info return Contador Versão 30 Classe para testar a classe Contador public class TestaContador Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Systemoutprintln Contadorinfo Contador c1 new Contador c2 new Contador100 Systemoutprintln c1 c1obtemValor c1incrementaValor Systemoutprintln c1 c1obtemValor for int i0 i23 i c2incrementaValor Systemoutprintln c2 c2obtemValor Contador c3 c2 Systemoutprintln c3 c3obtemValor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 24 101 Exemplos Classes em Arquivos Separados Contadorjava Classe para contagem de eventos simulando um dispositivo de contagem version 30 public class Contador private int valor public Contador valor 0 public Contadorint v valor v public int obtemValor return valor public void defineValorint v valor v public void zeraValor valor 0 public void incrementaValor valor public static String info return Contador Versão 30 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 25 101 Exemplos Classes em Arquivos Separados TestaContadorjava Classe para testar a classe Contador public class TestaContador Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Systemoutprintln Contadorinfo Contador c1 new Contador Systemoutprintln c1 c1obtemValor c1incrementaValor Systemoutprintln c1 c1obtemValor Contador c2 new Contador100 for int i0 i11 i c2incrementaValor Systemoutprintln c2 c2obtemValor Contador c3 c2 Systemoutprintln c3 c3obtemValor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 26 101 Passos para Implementar uma Classe Passos para Implementar uma Classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 27 101 Passos para Implementar uma Classe Passos para Implementar uma Classe 1 Crie uma lista informal de tarefas para os objetos adicionar obter limpar etc 2 Especifique a interface pública por exemplo para uma caixa registradora void adicionaItemdouble preco int obtemNumItems double obtemTotal void limpa 3 Documente a interface pública com comentários Javadoc Adiciona um item na caixa registradora param preco Preço do item a ser registrado 4 Determine as variáveis de instância private int numItens private double total 5 Implemente os construtores e métodos public void adicionaItemdouble preco numItens total total preco 6 Teste a classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 28 101 Passos para Implementar uma Classe Interface Pública de uma Classe Quando se projeta uma classe um dos primeiros passos é especificar a sua interface pública Por exemplo uma classe para uma caixa registradora Quais tarefas esta classe deverá executar Que métodos serão necessários Que parâmetros cada método receberá O que os métodos retornarão Tarefa Método Retorno Adiciona o preço de um item adicionaItemdouble void Obtém o total devido obtemTotal double Obtém o número de itens comprados obtemNumItens int Limpa o registro da caixa registradora para uma nova venda limpa void Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 29 101 Passos para Implementar uma Classe Escrevendo a Interface Pública de uma Classe É importante usar comentários no estilo Javadoc para documentar a classe e o funcionamento de cada método As declarações de métodos correspondem à interface pública da classe Os dados e o corpo dos métodos correspondem à implementação privada da classe Simula uma caixa registradora com número de itens e valor total dos itens public class CaixaRegistradora Adiciona um item na caixa registradora param preco Preço do item a ser registrado public void adicionaItemdouble preco numItens total total preco Obtém o valor total de todos os itens registrados return Valor total de todos os itens registrados public double obtemTotal return total Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 30 101 Passos para Implementar uma Classe Javadoc O utilitário javadoc gera um conjunto de arquivos HTML a partir dos comentários no estilo Javadoc Parâmetros e retornos de métodos devem ser descritos com as anotações param e return javadoc CaixaRegistradorajava Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 31 101 Passos para Implementar uma Classe Projetando a Representação de Dados Um objeto armazena dados em variáveis de instância Variáveis de instância são declaradas dentro da classe e devem ser privadas Simula uma caixa registradora com número de itens e valor total dos itens public class CaixaRegistradora private int numItems private double total Todos os métodos não estáticos dentro da classe têm acesso a elas podendo modificar os seus valores Quais dados os métodos da classe da caixa registradora necessitam Tarefa Método Dados necessá rios Adiciona o preço de um item adicionaItem total numItens Obtém o total devido obtemTotal total Obtém o número de itens comprados obtemNumItens numItens Limpa o registro da caixa registradora para uma nova venda limpa total numItens Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 32 101 Passos para Implementar uma Classe Variáveis de Instância de Objetos Cada objeto de uma classe tem um conjunto exclusivo de variáveis de instância Os valores armazenados nas variáveis de instância constituem o estado do objeto Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 33 101 Passos para Implementar uma Classe Acessando Variáveis de Instância Variáveis de instância privadas private não podem ser acessadas de fora da classe o compilador não permite esta violação de privacidade public static void mainString args CaixaRegistradora caixa1 new CaixaRegistradora Systemoutprintln caixa1numItens ERRO Em vez disto usamse métodos para acessar os dados da classe o encapsulamento provê uma interface pública e esconde os detalhes de implementação public static void mainString args CaixaRegistradora caixa1 new CaixaRegistradora Systemoutprintln caixa1obtemNumItens OK Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 34 101 Passos para Implementar uma Classe Implementando Métodos de Instância Métodos de instância acessam variáveis de instância privadas public void adicionaItemdouble preco numItens total total preco Métodos de instância São declarados dentro da classe como public Não há necessidade de especificar o nome do objeto parâmetro implícito quando se usa alguma variável de instância dentro de uma classe Os parâmetros explícitos variáveis paramétricas são listados na declaração do método Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 35 101 Passos para Implementar uma Classe Sintaxe de Métodos de Instância Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 36 101 Passos para Implementar uma Classe Parâmetros Implícitos e Explícitos Quando um item é adicionado isto afeta as variáveis de instância do objeto sobre o qual o método é invocado Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 37 101 Passos para Implementar uma Classe Erros Comuns 1 Não inicializar referências a objetos na construção Referências são inicializadas por padrão com null Chamar um médoto de uma referência que contém null resulta em um erro de execução NullPointerException O compilador consegue apenas detectar variáveis locais não inicializadas gerando um erro de compilação public class ErrosComuns private String nome O construtor default inicializará nome com null public void mostraNomes String nomeLocal Erro de execução javalangNullPointerException Systemoutprintln nomelength Erro de compilação a variável nomeLocal pode NÃO ter sido inicializada Systemoutprintln nomeLocallength Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 38 101 Passos para Implementar uma Classe Erros Comuns 2 Tentar chamar um construtor Não se pode chamar um construtor como é feito com outros métodos Ele é invocado automaticamente pela palavra reservada new CaixaRegistradora caixa new CaixaRegistradora Não se pode invocar um construtor para um objeto que já existe caixaCaixaRegistradora ERRO Mas podese criar um novo objeto usando uma referência existente CaixaRegistradora caixa new CaixaRegistradora caixaadicionaItem125 caixa new CaixaRegistradora Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 39 101 Passos para Implementar uma Classe Erros Comuns 3 Declarar um construtor como void Construtores não tem tipo de retorno Isto cria um método com um tipo de retorno void que NÃO é um construtor O compilador Java não considera isto um erro public class CaixaRegistradora Pretendiase criar um construtor public void CaixaRegistradora Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 40 101 Passos para Implementar uma Classe Sobrecarga Overloading Podese criar múltiplos construtores para uma classe Cada um deles tem o mesmo nome mas possui uma lista de parâmetros diferente Isto se chama sobrecarga e pode ser aplicado a qualquer método em Java Sobrecarga mesmo nome de método com parâmetros diferentes void imprimaCaixaRegistradora caixa void imprimaContaBancaria conta void imprimaint valor void imprimadouble valor Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 41 101 Passos para Implementar uma Classe CaixaRegistradorajava Simula uma caixa registradora com número de itens e valor total dos itens Adaptado de HORSTMANN 2013 p 377 version 20 public class CaixaRegistradora private int numItens private double total Constrói um objeto sem qualquer item registrado public CaixaRegistradora numItens 0 total 00 Adiciona um item na caixa registradora param preco Preço do item a ser registrado public void adicionaItemdouble preco numItens total total preco Obtém o valor total de todos os itens registrados return Valor total de todos os itens registrados public double obtemTotal return total Obtém o número de itens registrados return Número de itens registrados public int obtemNumItens return numItens Limpa a caixa registradora para iniciar uma nova venda public void limpa numItens 0 total 00 Método estático que retorna informações sobre a classe return Cadeia de caracteres com o nome da classe e a sua versão public static String info return CaixaRegistradora Versão 10 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 42 101 Passos para Implementar uma Classe Fruteirajava import javautilScanner Programa que realiza o serviço de caixa registradora para uma fruteira public class Fruteira Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin SystemoutprintlnFruteira CaixaRegistradorainfo CaixaRegistradora caixa new CaixaRegistradora SystemoutprintlnDigite os valores dos itens e FIM para encerrar while inhasNextDouble double p innextDouble caixaadicionaItem p SystemoutprintlnTOTAL caixaobtemTotal SystemoutprintlnITENS caixaobtemNumItens Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 43 101 Passos para Implementar uma Classe Exercícios 1 Implemente uma classe chamada ContaBancaria que gerencie os dados de uma conta bancária considerando as seguintes informações número da conta valor inteiro nome do titular da conta cadeia de caracteres e saldo valor real Para gerenciar os objetos dessa classe implemente métodos para construir objetos considere um construtor que recebe todos os dados e outro que recebe o número da conta e o titular realizar depósito realizar saque considere que o valor do saldo NÃO poderá ser negativo obter os dados da conta modificar os dados da conta e obter uma cadeia de caracteres com todos os dados da conta chame este método de toString 2 Implemente uma classe com método main para exemplificar o uso da classe ContaBancaria Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 44 101 Passos para Implementar uma Classe Solução ContaBancariajava Classe que gerencia uma conta bancária public class ContaBancaria private int numero private String titular private double saldo public ContaBancariaint n String t double s numero n titular t saldo s public ContaBancariaint n String t numero n titular t saldo 00 public int obtemNumero return numero public String obtemTitular return titular public double obtemSaldo return saldo public void defineNumeroint n numero n public void defineTitularString t titular t public void defineSaldodouble s saldo s public void depositadouble v saldo v public void sacadouble v if v saldo saldo v else saldo 00 public String toString return numero titular R saldo public static String info return ContaBancaria Versão 10 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 45 101 Passos para Implementar uma Classe Solução GerenciaContaBancariajava import javautilScanner Este programa testa a classe ContaBancaria public class GerenciaContaBancaria Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin ContaBancaria conta new ContaBancaria1234Fulano de Tal SystemoutprintlnComandos deposita valor saca valor ou fim while true Systemoutprintf d s R2f contaobtemNumero contaobtemTitular contaobtemSaldo String comando innexttrimtoLowerCase if comandoequalsfim break else if comandoequalsdeposita if inhasNextDouble contadeposita innextDouble else Systemoutprintf ERRO Comando depositar usado com valor inválido s innext else if comandoequalssaca if inhasNextDouble contasaca innextDouble else Systemoutprintf ERRO Comando sacar usado com valor inválido s innext else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 46 101 Testando uma Classe Testando uma Classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 47 101 Testando uma Classe Testando uma Classe A maioria das classes que os programadores criam não possui método main pois elas são criadas para fazer parte de um programa maior Para testar uma classe será preciso criar um teste unitário Para testar uma nova classe podese usar Ferramentas de programação que criam objetos interativamente DrJava httpwwwdrjavaorg BlueJ httpwwwbluejorg Escrever uma classe de teste com um método main public class TestaContaBancaria public static void mainString args ContaBancaria c1 new ContaBancaria Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 48 101 Testando uma Classe Usando BlueJ para Teste BlueJ pode instanciar objetos de uma classe interativamente o que permite que seus métodos sejam invocados Isto é excelente para realizar testes Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 49 101 Testando uma Classe Criando uma Unidade de Teste Uma unidade de teste verifica se uma classe funciona corretamente de forma isolada fora do programa completo Ela deve testar todos os métodos identificando quando alguma inconsistência for identificada Este programa testa a classe CaixaRegistradora public class TestaCaixaRegistradora Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args CaixaRegistradora caixa new CaixaRegistradora if caixaobtemNumItens0 caixaobtemTotal00 SystemerrprintlnERRO Systemexit1 caixaadicionaItem125 if caixaobtemNumItens1 caixaobtemTotal125 SystemerrprintlnERRO Systemexit1 caixaadicionaItem065 if caixaobtemNumItens2 caixaobtemTotal19 SystemerrprintlnERRO Systemexit1 caixaadicionaItem210 if caixaobtemNumItens3 caixaobtemTotal40 SystemerrprintlnERRO Systemexit1 caixalimpa if caixaobtemNumItens0 caixaobtemTotal00 SystemerrprintlnERRO Systemexit1 Systemoutprintln CaixaRegistradorainfo OK Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 50 101 Padrões para Dados de Objetos Padrões para Dados de Objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 51 101 Padrões para Dados de Objetos Padrões para Dados de Objetos Existem alguns padrões comuns quando variáveis de instância são projetadas Manter um total Contar eventos Coletar valores Gerenciar propriedades de objetos Modelar objetos com diferentes estados Descrever a posição de um objeto Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 52 101 Padrões para Dados de Objetos Padrão Manter um Total Exemplos Total de caixas registradoras Saldo de contas bancárias Nível do tanque de gasolina de um carro Variáveis necessárias Total total Métodos necessários Adição adicionaItem Inicialização limpa Acesso obtemTotal Simula uma caixa registradora simples version 00 public class CaixaRegistradora private double total public void adicionaItemdouble preco total preco public void limpa total 0 public double obtemTotal return total Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 53 101 Padrões para Dados de Objetos Padrão Contar Eventos Exemplos Número de itens de uma caixa registradora Custo de transações bancárias Variáveis necessárias Contagem numItens Métodos necessários Incrementar adicionaItem Inicialização limpa Acesso obtemNumItens Simula uma caixa registradora version 10 public class CaixaRegistradora private int numItens private double total public void adicionaItemdouble preco numItens total total preco public double obtemTotal return total public int obtemNumItens return numItens public void limpa numItens 0 total 00 Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 54 101 Padrões para Dados de Objetos Padrão Colectar Valores Exemplos Carrinho de compras Questões de múltipla escolha Placar de pontos Opções de um menu Valores armazenados por exemplo usando um array parcialmente preenchido Construtor Inicializa ou cria a coleção vazia Métodos necessários Adição adicionaItem obtemNumItens obtemItem Gerencia um cacrrinho de compras em uma loja virtual com até 50 itens usando um vetor parcial public class CarrinhoDeCompras private static final int MAXITENS 10 private String itens private int numItens public CarrinhoDeCompras itens new StringMAXITENS numItens 0 public void adicionaItemString nome if numItens itenslength itensnumItens nome numItens public int obtemNumItens return numItens public String obtemItemint i if i0 inumItens return null return itensi Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 55 101 Padrões para Dados de Objetos Padrão Gerenciar Propriedades de Objetos Uma propriedade de um objeto pode ser definida e recuperada Exemplos Estudante matrícula e nome Construtor Inicializa as variáveis de instância Métodos necessários Obtenção obtemMatricula obtemNome Definição defineMatricula defineNome Classe para gerenciar informações de um estudante public class Estudante private int matricula private String nome public Estudanteint m String n matricula m nome n public int obtemMatricula return matricula public String obtemNome return nome public void defineMatriculaint m matricula m public void defineNomeString n nome n Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 56 101 Padrões para Dados de Objetos Padrão Modelar Objetos com Diferentes Estados Alguns objetos podem estar em um estado de um conjunto de estados possíveis Exemplos Um peixe que pode estar nos seguintes estados sem forme com alguma fome com muita fome O peixe inicia sem fome construtor A fome do peixe é alterada através de come nada Podese conferir a fome com obtemFome Simula o comportamento de um peixe public class Peixe public static final int SEMFOME 0 public static final int COMALGUMAFOME 1 public static final int COMMUITAFOME 2 private int fome public Peixe fome SEMFOME public void come fome SEMFOME public void nada if fome COMMUITAFOME fome public int obtemFome return fome Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 57 101 Padrões para Dados de Objetos Padrão Descrever a Posição de um Objeto Exemplos Inseto em uma grade Objetos de um jogo Bala de canhão Valores armazenados Linha coluna direção etc Métodos necessários construtor anda gira Gerencia a movimentação de um inseto em uma grade version 10 public class Inseto public static final int LESTE 0 SUL 1 OESTE 2 NORTE 3 public static final int LINHAS 3 COLUNAS 8 private int linha coluna direcao public Inseto linha coluna direcao 0 public void anda switch direcao case LESTE if coluna COLUNAS1 coluna break case OESTE if coluna 0 coluna break case SUL if linha LINHAS1 linha break case NORTE if linha 0 linha break public void gira direcao direcao 1 4 public String toString return linhalinha colunacoluna direcaodirecao Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 58 101 Padrões para Dados de Objetos Exercícios 1 Implemente quatro classes cada uma com seu método main para testar as classes CarrinhoDeCompras Estudante Peixe e Inseto citadas nas 4 lâminas anteriores Sugestão na classe Inseto substitua o método toString por um método que mostre a grade com o inseto na sua posição e direção corretas use os caracteres v e para indicar o inseto e sua direção use para indicar uma posição vazia da grade Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 59 101 Padrões para Dados de Objetos Solução SelecionaProdutosjava import javautilScanner Este programa testa a classe CarrinhoDeCompras public class SelecionaProdutos Mostra um CarrinhoDeCompras param carrinho Carrinho de compras a ser mostrado public static void mostraCarrinhoDeCompras c Systemoutprintln Carrinho de Compras for int i0 icobtemNumItens i Systemoutprintln i1 cobtemItemi Systemoutprintln Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin CarrinhoDeCompras carrinho new CarrinhoDeCompras SystemoutprintlnComandos adiciona nomeDoProduto ou fim while true mostra carrinho String comando innextLinetrim if comandotoLowerCaseequalsfim break else if comandotoLowerCaseindexOfadiciona 0 carrinhoadicionaItem comandosubstring9trim else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 60 101 Padrões para Dados de Objetos Solução GerenciaEstudantejava import javautilScanner Este programa testa a classe Estudante public class GerenciaEstudante Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin Estudante estudante new Estudante1234Fulano de Tal SystemoutprintlnComandos nome novoNome matricula novaMatricula ou fim while true Systemoutprintf d s estudanteobtemMatricula estudanteobtemNome String comando innextLinetrim if comandotoLowerCaseequalsfim break else if comandotoLowerCaseindexOfnome 0 estudantedefineNome comandosubstring5trim else if comandotoLowerCaseindexOfmatricula 0 estudantedefineMatricula IntegerparseInt comandosubstring10trim else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 61 101 Padrões para Dados de Objetos Solução ControlaPeixejava import javautilScanner Este programa testa a classe Peixe public class ControlaPeixe Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin Peixe peixe new Peixe SystemoutprintlnComandos nada come ou fim while true Systemoutprintln Nível de fome do peixe peixeobtemFome String comando innexttrimtoLowerCase if comandoequalsfim break else if comandoequalsnada peixenada else if comandoequalscome peixecome else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 62 101 Padrões para Dados de Objetos Solução Insetojava Gerencia a movimentação de um inseto em uma grade version 20 public class Inseto public static final int LESTE 0 SUL 1 OESTE 2 NORTE 3 public static final int LINHAS 3 COLUNAS 8 private int linha coluna direcao public Inseto linha coluna direcao 0 public void anda switch direcao case LESTE if coluna COLUNAS1 coluna break case OESTE if coluna 0 coluna break case SUL if linha LINHAS1 linha break case NORTE if linha 0 linha break public void gira direcao direcao 1 4 public String toString String res char inseto v for int i0 iLINHAS i for int j0 jCOLUNAS j if i linha j coluna res insetodirecao else res res return res Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 63 101 Padrões para Dados de Objetos Solução ControlaInsetojava import javautilScanner Este programa testa a classe Inseto public class ControlaInseto Metodo inicial param args Argumentos da linha de comandos NÃO utilizado public static void mainString args Scanner in new ScannerSystemin Inseto inseto new Inseto SystemoutprintlnComandos gira anda ou fim while true Systemoutprintln insetotoString String comando innexttrimtoLowerCase if comandoequalsfim break else if comandoequalsgira insetogira else if comandoequalsanda insetoanda else Systemoutprintf ERRO Comando s inválido comando Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 64 101 Referências a Objetos Referências a Objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 65 101 Referências a Objetos Referências a Objetos Uma referência a um objeto especifica a localização de memória do objeto Objetos são parecidos com arrays porque eles também são acessados por referências Referência a array double valores new double6 Referência a objeto CaixaRegistradora caixa new CaixaRegistradora Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 66 101 Referências a Objetos Referências Compartilhadas Múltiplas variáveis do tipo objeto podem conter referências para o mesmo objeto Referência simples CaixaRegistradora caixa new CaixaRegistradora Referências compartilhando o mesmo objeto CaixaRegistradora aux caixa Os valores internos podem ser alterados através de qualquer uma das referências Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 67 101 Referências a Objetos Cópia de Tipos Primitivos versus de Referências Variáveis de tipos primitivos podem ser copiadas mas funcionam de forma diferente do que referências de objetos Cópia de dados primitivos 2 localizações int num1 10 int num2 num1 num2 Cópia de referências 2 referências para a mesma localização CaixaRegistradora caixa new CaixaRegistradora CaixaRegistradora aux caixa auxadicionaItem125 Objetos podem ocupar muito mais espaço por isso Java realiza a cópia apenas da referência Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 68 101 Referências a Objetos A Referência null Uma referência pode apontar para nenhum objeto null Não se pode invocar métodos de um objeto através de uma referência null pois isto causará uma exceção CaixaRegistradora caixa null Systemoutprintln caixaobtetmTotal Erro de execução Devese testar todas as referência antes de tentar acessálas String nomeDoMeio null Nenhum nome do meio if nomeDoMeio null Systemoutprintln nome sobrenome else Systemoutprintln nome nomeDoMeio sobrenome Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 69 101 Referências a Objetos A Referência this Métodos recebem um parâmetro implícito em uma variável de referência chamada this Tratase de uma referência ao objeto sobre o qual o método foi invocado Assim podese deixar mais claro quando será usada uma variável de instância void adicionaItemdouble preco thisnumItens thistotal thistotal preco Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 70 101 Referências a Objetos Referências a this em Construtores A referência this é muito usada em construtores e setters assim variáveis paramétricas e de instância podem ter o mesmo nome public class Estudante private int matricula private String nome public Studentint matricula String nome thismatricula matricula thisnome nome Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 71 101 Variáveis Estáticas e Métodos Variáveis Estáticas e Métodos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 72 101 Variáveis Estáticas e Métodos Variáveis e Métodos Estáticos Variáveis podem ser declaradas como static na declaração da classe Haverá apenas uma cópia da variável static que será compartilhada entre todos os objetos da classe public class ContaBancaria private int numero private String titular private double saldo private static int proximoNumeroDeConta 1000 public ContaBancariaString t numero proximoNumeroDeConta titular t saldo 00 Métodos de qualquer objeto da classe podem usar ou alterar o valor de uma variável static Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 73 101 Variáveis Estáticas e Métodos Usando Variáveis Estáticas Exemplo Cada vez que uma nova conta for criada a variável proximoNumeroDeConta será incrementada pelo construtor Acessase a variável usando NomeDaCassenomeDaVariavel Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 74 101 Variáveis Estáticas e Métodos Usando Métodos Estáticos A API de Java tem muitas classes que provêm métodos que podem ser usados sem que se necessite instanciar um objeto A classe Math é um bom exemplo disso Por exemplo Mathsqrtvalor é um método estático que retorna a raiz quadrada de um valor Não é necessário instanciar um objeto da classe Math antes de usálo Métodos static são chamados usando NomeDaClassenomeDoMetodo Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 75 101 Variáveis Estáticas e Métodos Escrevendo Seus Próprios Métodos Estáticos Você pode definir seus próprios métodos estáticos public class Financeiro Calcula a porcentagem de determinado valor param porcentagem A porcentagem a ser aplicada param quantia A quania sobre a qual a porcentagem será aplicada return A porcentagem especificada da quantia public static double percentualDedouble porcentagem double quantia return porcentagem 1000 quantia Invocase o método estático sobre a classe e não sobre um objeto double taxa FinanceiropercentualDepercentual total Métodos estáticos geralmente retornam um valor Eles apenas podem acessar variáveis estáticas e métodos estáticos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 76 101 Exercício Exercício Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 77 101 Exercício Exercício Forca Implemente uma classe para executar um jogo de Forca Forcajava e uma classe para instanciar um objeto desta classe permitindo que o usuário dispute interativamente uma partida de Forca contra o computador Appjava Pense inicialmente nos métodos que deverão ser chamados para executar o jogo Implemente um método main na classe Appjava para criar um objeto da classe Forca e executar os métodos desse objeto A seguir pense nos dados que deverão ser armazenados para cada objeto da classe Forca e implementea Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 78 101 Exercício Solução Appjava import javautilScanner public class App public static void mainString args String enforcado O O O O O O Scanner in new ScannerSystemin Systemoutprintfs Forcainfo Forca jogo new Forca while jogonaoTerminou Systemoutprintln enforcadojogoobtemErros Palavra secreta jogoobtemIncognita SystemoutprintLetras chutadas jogoobtemLetrasChutadas Letra String letra innexttrimtoUpperCase if letraequalsFIM Systemexit0 jogochutaLetra letracharAt0 if jogoobtemErros 6 Systemoutprintln Parabéns Você conseguiu acertar a palavra else Systemoutprintln Que pena Infelizmente você NÃO acertou a palavra Tente novamente Systemoutprintf Palavra secreta s jogoobtemPalavra Systemoutprintln enforcadojogoobtemErros Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 79 101 Exercício Solução Forcajava public class Forca private String palavra private int erros letrasResolvidas private char incognita private boolean letrasChutadas public static final String palavras ADAPTADORALFABETOBIBLIOTECABENCHMARKBUFFERBOOTPRIMITIVORECURSIVIDADE CONTEXTOLINGUAGEMESCOPOPROCESSOPROCEDIMENTOHARDWARESOFTWAREFIRMWAREBITINTERFACEPROTOCOLOVALOR SOBRECARGASOBRESCRITAJAVAMODELOMODELAGEMPESQUISAPALAVRASTRINGCLASSEOBJETOTIPOREGISTROBYTE public static String info return Forca Versão 10 public Forca palavra palavras intMathrandom palavraslength letrasChutadas new boolean26 erros letrasResolvidas 0 incognita new charpalavralength for int i0 ipalavralength i incognitai public boolean naoTerminou return erros 6 letrasResolvidas palavralength public String obtemPalavra return erros 6 letrasResolvidas palavralength palavra public int obtemErros return erros public String obtemIncognita String res CharactertoStringincognita0 for int i1 ipalavralength i res incognitai return res public boolean chutaLetrachar letra int indLetra 0 acertos 0 letra CharactertoUpperCaseletra if letraA letra Z indLetra letra A else return false if letrasChutadasindLetra return false letrasChutadasindLetra true for int i0 ipalavralength i if letra palavracharAti acertos letrasResolvidas incognitai letra if acertos 0 erros return true public String obtemLetrasChutadas String res for int i0 iletrasChutadaslength i if letrasChutadasi res charAi else res return res Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 80 101 Arrays de Objetos Arrays de Objetos Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 81 101 Arrays de Objetos Arrays de Objetos Quando se cria um array de algum tipo primitivo Java preenche todas as posições com um valor nulo 0 00 false etc double vet new double100 Quando se cria um array de objetos Java preenche todas as posições com null Classe objeto new Classe100 Nenhum construtor será chamado Isto significa que apenas o array foi criado e NÃO os objetos É preciso executar o operador new também para cada um dos objetos for int i0 iobjetolength i objetoi new Classe Agora sim o construtor será chamado Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 82 101 Arrays de Objetos Exercício 1 Implemente uma classe chamada Pessoa que armazena nome String idade int e telefone String Para esta classe implemente construtores sem parâmetros e com todos os parâmetros métodos de acesso para todas a s variáveis de instância métodos de modificação para todas as variáveis de instância e método toString 2 Implemente uma classe chamada Agenda para armazenar até 50 objetos da classe Pessoa Esta classe deverá usar internamente um vetor parcialmente preenchido de objetos da classe Pessoa Para esta classe implemente os seguintes métodos construtor sem parâmetros adicionaPessoaPessoa p obtemNumPessoas obtemPessoaint i toString e ordena 3 Implemente uma classe para adicionar um número indeterminado de itens na agenda ordenar a agenda e mostrála Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 83 101 Arrays de Objetos Solução Pessoajava Classe para gerenciar nome idade e telefone de uma pessoa public class Pessoa private String nome private int idade private String telefone public Pessoa nome idade 0 telefone public PessoaString n int i String t nome n idade i telefone t public String obtemNome return nome public int obtemIdade return idade public String obtemTelefone return telefone public void defineNomeString n nome n public void defineIdadeint i idade i public void defineTelefoneString t telefone t public String toString return nome idade telefone Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 84 101 Arrays de Objetos Solução Agendajava Classe que gerencia uma agenda formada por um array de objetos da classe Pessoa public class Agenda private final int MAXPESSOAS 10 private Pessoa pessoas private int numPessoas public Agenda pessoas new PessoaMAXPESSOAS numPessoas 0 public int obtemNumPessoas return numPessoas public boolean adicionaPessoaPessoa p if pnull numPessoaspessoaslength return false else pessoas numPessoas p return true public Pessoa obtemPessoaint i return i0 inumPessoas pessoasi null public String toString String res for int i0 inumPessoas i res pessoasitoString return res public void ordena for int i0 inumPessoas1 i int men i for int ji1 jnumPessoas j if pessoasjobtemNomecompareTopessoasmenobtemNome 0 men j if men i Pessoa aux pessoasmen pessoasmen pessoasi pessoasi aux Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 85 101 Arrays de Objetos Solução Appjava import javautilScanner public class App public static void mainString args Scanner in new ScannerSystemin Agenda agenda new Agenda Systemoutprintln Gerenciador de Agenda Comandos adiciona mostra ordena ou fim boolean fim false while fim String cmd innextLinetrimtoLowerCase switch cmd case adiciona SystemoutprintNome String nome innextLine SystemoutprintIdade int idade IntegerparseInt innextLine SystemoutprintTelefone String telefone innextLine Pessoa p new Pessoanomeidadetelefone Systemoutprintln agendaadicionaPessoap OK Adicionado ERRO SEM espaço break case mostra Systemoutprintln agendatoString break case ordena agendaordena break case fim fim true break default Systemoutprintf ERRO Comando s inválido cmd inclose Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 86 101 Arrays de Objetos Exercício 1 Implemente uma classe Carro com as propriedades descritas a seguir Um carro apresenta certo consumo de combustível medido em quilômetros por litro e tem certa quantidade de combustível no seu tanque de gasolina O consumo é especificado no construtor e o nível inicial de combustível é 0 Implemente além do construtor os seguintes métodos public double obtemConsumo retorna o consumo do carro em kmlitro public void defineConsumodouble c define o consumo do carro em kmlitro public double dirigedouble km tenta dirigir por detereminado número de km considerando a quantidade de combustível no tanque retorna o número de km que efetivamente foram percorridos public double obtemNivelTanque retorna o nível do tanque em litros public void abastecedouble litros adiciona combustível no tanque do carro Exemplo de uso Carro meuCarro new Carro100 Cria um carro que consome 10 km por litro meuCarroabastece400 Abastece 40 litros double km meuCarrodirige1000 Dirige o carro por 100 km SystemoutprintfDirigiu por f km e tem f litros no tanque km meuCarroobtemNivelTanque 2 Implemente uma classe chamada ControlaCarro com um método main para testar o funcionamento da classe Carro Sugestão para esta classe use a classe GerenciaContaBancaria como referência Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 87 101 Arrays de Objetos Solução Carrojava Classe para gerenciar um carro com determinado consumo de combustível public class Carro private double consumo private double nivelTanque public Carrodouble c consumo c nivelTanque 00 public double obtemConsumo return consumo public void defineConsumodouble c consumo c public double dirigedouble km double litros km consumo if litros nivelTanque km nivelTanque consumo nivelTanque 00 else nivelTanque litros return km public double obtemNivelTanque return nivelTanque public void abastecedouble litros nivelTanque litros Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 88 101 Arrays de Objetos Solução ControlaCarrojava Classe para controlar um objeto da classe Carro import javautilScanner public class ControlaCarro public static void mainString args Scanner in new ScannerSystemin SystemoutprintControlaCarro Comandos consumo kml dirige km abastece l fim Carro carro new Carro100 while true Systemoutprintf consumo3f kml nivelTanque3f l carroobtemConsumo carroobtemNivelTanque String comando innexttrimtoLowerCase if comandoequalsfim break else if comandoequalsconsumo if inhasNextDouble carrodefineConsumo innextDouble else Systemoutprintf ERRO Comando consumo usado com valor inválido s innext else if comandoequalsdirige if inhasNextDouble double km carrodirige innextDouble Systemoutprintf dirigiu 3f km km else Systemoutprintf ERRO Comando dirige usado com valor inválido s innext else if comandoequalsabastece if inhasNextDouble carroabastece innextDouble else Systemoutprintf ERRO Comando abastece usado com valor inválido s innext else Systemoutprintf ERRO Comando s inválido comando inclose Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 89 101 Arrays de Objetos Exercício 1 Crie uma classe GameOfLife para implementar e executar os autômatos descritos em httpsenwikipediaorgwikiConway27sGameofLife Uma sugestão de interface para esta classe pode ser a seguinte public class GameOfLife private boolean grid matriz de booleans que corresponde ao grid private boolean next matriz auxiliar public GameOfLifeint n aloca matrizes n x n de booleans public GameOfLifeint lin int col aloca matrizes lin x col de booleans public boolean setint l int c liga a célula lc do grid public int liveNeighboursint l int c conta o número de vizinhos ativos de uma célula public void nextStep gera próximo passo do autômato em next e depois troca next e grid public String toString gera uma representação do estado do autômato em um String 2 Implemente classes para os autômatos de exemplo apresentados em httpsenwikipediaorgwikiConway27sGameofLife Para facilitar o uso de animações em modo texto use a seguinte classe public class Terminal public static void clrscr Systemoutprintfc2J27 public static void gotoxyint xint y SystemoutprintfcddH27xy 3 Use como exemplo de autômato a classe Blinker na próxima lâmina Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 90 101 Arrays de Objetos Solução Blinkerjava public class Blinker public static void mainString args throws InterruptedException GameOfLife grid new GameOfLife5 gridset21 gridset22 gridset23 Terminalclrscr for int i0 i10 i Terminalgotoxy11 Systemoutprintln gridtoString Threadsleep1000 gridnextStep Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 91 101 Sumário Sumário Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 92 101 Sumário Sumário Classes e Objetos Uma classe descreve um conjunto de objetos com o mesmo comportamento Cada classe tem uma interface pública uma coleção de métodos através dos quais os objetos da classe podem ser manipulados Encapsulamento consiste em prover uma interface pública e esconder os detalhes de implementação Encapsulamento habilita alterações na implementação sem afetar os usuários da classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 93 101 Sumário Sumário Variáveis e Métodos Variáveis de Instância de objetos armazenam dados que são usados pelos seus métodos Cada objeto de uma classe tem seu próprio conjunto de variáveis de instância Um método de instância pode acessar variáveis de instância do objeto sobre o qual ele atua Uma variável de instância privada pode ser acessada apenas por métodos de sua própria classe Variáveis declaradas como estáticas em uma classe possuem uma única cópia compartilhada entre todos os objetos criados a partir desta classe Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 94 101 Sumário Sumário Cabeçalhos de Métodos Dados Cabeçalhos de Métodos Podese usar cabeçalhos de métodos e comentários de métodos para especificar a interface pública de uma classe Um método mutator altera o objeto sobre o qual ele opera Um método accessor não altera o objeto sobre o qual ele atua Declaração de Dados Para cada método accessor um objeto deve ou armazenar ou calcular o resultado Frequentemente há mais de uma forma de representar os dados de um objeto e devese fazer uma escolha Devese ter certeza de que a representação de dados suporta chamadas de métodos em qualquer ordem Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 95 101 Sumário Sumário Parâmetros Construtores Parâmetros de Métodos O objeto sobre o qual um método é aplicado é o parâmetro implícito Parâmetros explícitos de um método são listados na declaração do método Construtores Um construtor inicializa as variáveis de instância do objeto Um construtor é invocado quando um objeto é criado com o operador new O nome de um construtor é sempre o mesmo que o nome da classe Uma classe pode ter múltiplos construtores O compilador seleciona o construtor compatível com os argumentos especificados na criação do objeto Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 96 101 Tópicos Complementares Tópicos Complementares Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 97 101 Tópicos Complementares Depurando Objetos Uma sugestão para depurar programas que usam objetos é criar um cartão para cada objeto na parte frontal se apresentam os métodos da interface pública no verso se controla os dados encapsulados Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 98 101 Tópicos Complementares Depurando Objetos 2 Quando o construtor for chamado as variáveis de instância são inicializadas Quando um método mutator for chamado será necessário atualizar variáveis de instância Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 99 101 Referências Referências Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 100 101 Referências Referências HORSTMANN C Java for Everyone Late Objects 2 ed Hoboken Wiley 2013 xxxiv 589 p Roland Teodorowitsch FPROG EP PUCRS OBJETOS E CLASSES 17 de junho de 2023 101 101