Baixe o app para aproveitar ainda mais
Prévia do material em texto
Implementação Orientada a Objetos - IOO Marcia Bissaco Universidade de Mogi das Cruzes 1 1/2021 Aula 5 1 Apresentar alguns exemplos de programas simples implementados usando a linguagem JAVA e conceitos de POO. Nesta aula, serão abordados os conceitos básicos (classe, objeto, método e atributo), abstração, encapsulamento, método e retorno. Objetivo 2 2 Declaração do método 3 public float somar(float x, float y) { return x + y; } Modificador de acesso Tipo de retorno Nome do método Lista de parâmetros Implementação Orientada a Objetos Relembrando .... 3 Declaração do método 4 public float somar(float x, float y) { return x + y; } Modificador de acesso Tipo de retorno Nome do método Lista de parâmetros Assinatura do método Implementação Orientada a Objetos Relembrando .... 4 Declaração do método 5 public void imprimirAloMundo() { System.out.println(“Alo Mundo”); } Modificador de acesso Tipo de retorno Nome do método Lista de parâmetros (vazia) Implementação Orientada a Objetos Relembrando .... 5 Linha de declaração do método 6 public void imprimirAloMundo() { System.out.println(“Alo Mundo”); } Assinatura do método Implementação Orientada a Objetos Relembrando .... 6 Assinatura do método Nome dado à linha de declaração do método, que é composta por: Modificadores: indicam, por exemplo, a visibilidade. Um método pode ser public, private ou protected Tipo de retorno: um método pode ou não retornar um valor. Na assinatura do método deve ser informado o tipo da variável retornada (void significa sem retorno) Nome do método: nome identificador do método Lista de parâmetros: quais parâmetros devem ser passados para o método quando ele for chamado 7 Orientação a Objetos Relembrando .... 7 Chamada do método A chamada do método em outra classe deve estar em conformidade com a sua assinatura: 8 public class Mensagem { public void imprimeAloMundo() { System.out.println(“Alo Mundo”); } } public class Aplicacao { public static void main(String[] args) { Mensagem objMensagem; objMensagem = new Mensagem(); objMensagem.imprimeAloMundo(); } } Implementação Orientada a Objetos Relembrando .... 8 Chamada do método A chamada do método em outra classe deve estar em conformidade com a sua assinatura: 9 public class Mensagem { public void imprimeMensagem(String textoMensagem){ System.out.println(textoMensagem); } } public class Aplicacao { public static void main(String[] args) { Mensagem objMensagem; objMensagem = new Mensagem(); objMensagem.imprimeMensagem(“Alo Mundo”); } } Implementação Orientada a Objetos Relembrando .... 9 Chamada do método A chamada do método em outra classe deve estar em conformidade com a sua assinatura: 10 public class Mensagem { public void imprimeMensagem(String textoMensagem){ System.out.println(textoMensagem); } } public class Aplicacao { public static void main(String[] args) { Mensagem objMensagem; objMensagem = new Mensagem(); objMensagem.imprimeMensagem(“Alo Mundo”); } } Implementação Orientada a Objetos Relembrando .... 10 Chamada do método A chamada do método em outra classe deve estar em conformidade com a sua assinatura: 11 public class Mensagem { public static void imprimeMensagem(String textoMensagem){ System.out.println(textoMensagem); } } public class Aplicacao { public static void main(String[] args) { Mensagem.imprimeMensagem(“Alo Mundo”); } } Implementação Orientada a Objetos 11 Chamada do método O tipo de retorno void na assinatura de um método indica que ele não terá retorno. Para todos os outros tipos de retorno, a instrução return deverá ser utilizada para retornar um valor do tipo especificado. 12 Implementação Orientada a Objetos 12 Criação de objetos Relembrando: um objeto é uma instância de uma classe Para criar um novo objeto, usa-se a instrução new Sintaxe para declaração de um objeto [<nome_da_classe>] <nome_objeto> = new [<nome_da_classe>]([<parametros>]); Ou: [<nome_da_classe>] <nome_objeto>; <nome_objeto> = new [<nome_da_classe>]([<parametros>]); 13 Relembrando .... Implementação Orientada a Objetos 13 Encapsulamento Mecanismo que permite a classe agregar toda a informação relevante para seu processamento, escondendo detalhes de implementação de classes externas Toda a manipulação de dados de uma classe se encontra na propria classe; Atributos de uma classe não devem ser acessados por classes externas, a menos que explicitamente permitido Orientação a Objetos 14 Relembrando .... 14 Objeto = atributos privados + métodos públicos Encapsulamento Uma boa prática para garantir o encapsulamento dos dados é declarar os atributos sempre privados, e os métodos públicos. Atributos da classe não devem ser acessados por classes externas, a menos que explicitamente permitido. Relembrando .... Classe Calculadora Encapsulamento 16 <<não tem> soma(float x, float y) subtrair(float x, float y) dividir(float x, float y) multiplicar(float x, float y) calculadora Calculadora + somar (float x, float y): float + subtrair(float x, float y): float + dividir(float x, float y): float + multiplicar(float x, float y): float Relembrando .... 16 Classe Aluno Encapsulamento 17 Nome, rgm, nota1, nota2, notaFinal calcularMedia() gerarRGM() Matricular() inativarAluno() verificarAprovação() aluno Relembrando .... 17 Classe Medico Encapsulamento 18 Crm, valorConsulta cadastra() Inativar() medico 18 Politica de visibilidade (Modificadores de acesso) public O atributo/método declarado como público podera ser acessado por qualquer objeto externo. O acesso externo neste caso é total. private O atributo/método declarado como private somente pode ser acessado pelo próprio objeto, sem nenhuma visibilidade externa. protected O atributo/método declarado como protected pode ser acessado pelo próprio objeto e/ou por objetos de classes derivadas através de uma herança (Herança será um tópico abordado nas próximas aulas). 19 Encapsulamento Relembrando .... 19 Métodos de acesso getters e setters Se os atributos são privados, como ler/modificar o valor dos mesmos para diferentes objetos? SOLUÇÃO: criar métodos que encapsulem o acesso aos atributos. Esses métodos sao chamados GETTERS e SETTERS Para LER o valor do atributo rgm, criar o método getRgm Para ALTERAR o valor do atributo rgm, criar o método setRgm Encapsulamento 20 Relembrando .... 20 Método construtor Método construtor é o bloco de instruções executados no momento da criação da instância. Acionados pela cláusula new. Toda classe possui um construtor. Se o programador não declarar um construtor explícito, o compilador cria um construtor padrão (em branco e sem parâmetros). Orientação a Objetos 21 Relembrando .... 21 Método construtor Métodos construtores têm o nome idêntico ao da classe. Construtores não retornam valor. Não deve ser declarado tipo de retorno algum, nem mesmo void. Não pode ser chamado isoladamente, apenas na criação de objetos. Também não podem ser chamados recursivamente. Porém, construtores da mesma classe podem chamar uns aos outros, usando a cláusula this (deve ser a primeira instrução do método). Orientação a Objetos 22 Relembrando .... 22 Método construtor Pode ser implementado mais de um método constructor Construtores podem ser personalizados para iniciar valores do objeto ou executar sub rotinas de inicialização Orientação a Objetos 23 Relembrando .... 23 Classe CarroEncapsulamento 24 placa Carro() Carro(String placa) getPlaca() setPlaca(String placa) Objeto carro Carro - placa: String + Carro () + Carro(String placa) + setPlaca(String placa): void + getPlaca(): String Carro - placa: String 24 Exemplo de método construtor 25 Implementação Orientada a Objetos public class Carro { private String placa; public Carro(){} public Carro(String placa){ this.placa = placa; } public String getPlaca(){ return placa; } public void setPlaca(String placa){ this.placa = placa; } } public class Aplicacao { public static void main(String[] args) { Carro objCarro, objCarro2; objCarro = new Carro(); objCarro.setPlaca(“ABC-124”); objCarro2 = new Carro(“ABC-123”); } } 25 26 Implementação Orientada a Objetos public class Aplicacao { public static void main(String[] args) { Carro objCarro; System.out.println(“O objeto ainda não existe“); objCarro = new Carro(); System.out.println(“Depois da criação do objeto“); } } 26 Sobrecarga de método Em Java é possível ter mais de um método com o mesmo nome na mesma classe; Porém, os parâmetros dos métodos devem ser DIFERENTES, ou seja, a assinatura deve ser diferente. Ex.: métodos construtores implementatos na classe carro Orientação a Objetos 27 Relembrando .... 27 Classe Conta Encapsulamento 28 Numerro, saldo Conta() Conta(int numero) Conta(int numero, double daldo) getNum() setNum(int numero) setSaldo(double saldo) getSaldo() saque(double valorSaque) saque(double valorSaque, double taxa) Objeto conta Conta - numero: int - saldo: double + Conta () + Conta (int numero) + Conta(int numero, double saldo) + setNum(int numero): void + setSaldo(double saldo): void + getSaldo():double + getNumero():int + saque(double valorSaque): void + saque(double valorSaque, double taxa): void Conta - numero: int - saldo: double + saque(double valorSaque): void + saque(double valorSaque, double taxa): void 28 29 Implementação Orientada a Objetos public class Conta { private int numero; private double saldo; public Conta(){} public Conta(int numero){ this.numero = numero; this.saldo = 0;} public Conta(int numero, double saldo){ this.numero = numero; this.saldo = saldo;} public void saque(double valorSaque){ saldo -= valorSaque;} public void saque(double valorSaque, double taxa){ saldo -= valorSaque - taxa;} public void setSaldo(double saldo) { this.saldo = saldo;} public double getSaldo() { return saldo;} public void setNumero(int numero) { this.numero = numero;} public double getNumero() { return numero;} } } // saldo = saldo - valorSaque; (mesma coisa que: saldo -= valorSaque;) public class AplicacaoBancaria { public static void main(String[] args) { Conta minhaConta; minhaConta = new Conta(123); Conta outraConta; outraConta = new Conta(123, 500); minhaConta.setSaldo(100); minhaConta.saque(50); outraConta.saque(90,10); System.out.println(minhaConta.getSaldo()); System.out.println(outraConta.getSaldo()); } } Exemplo de Sobrecarga 29 30 Implementação Orientada a Objetos Exemplo de Sobrecarga public class Conta { private int numero; private double saldo; public Conta(){ } public Conta(int numero){ this.numero = numero; this.saldo = 0; } public Conta(int numero, double saldo){ this.numero = numero; this.saldo = saldo; } public void saque(double valorSaque){ saldo -= valorSaque; } public void saque(double valorSaque, double taxa){ saldo -= valorSaque - taxa; } public void setSaldo(double saldo) { this.saldo = saldo;} public double getSaldo() { return saldo;} public void setNumero(int numero) { this.numero = numero;} public double getNumero() { return numero;}} public class AplicacaoBancaria { public static void main(String[] args) { Conta minhaConta; minhaConta = new Conta(123); Conta outraConta; outraConta = new Conta(123, 500); minhaConta.setSaldo(100); minhaConta.saque(50); outraConta.saque(90,10); System.out.println(minhaConta.getSaldo()); System.out.println(outraConta.getSaldo()); } } Sobrecarga de construtores Sobrecarga de métodos 30 31 Implementação Orientada a Objetos Exemplo de Sobrecarga public class Conta { private int numero; private double saldo; public Conta(){ } public Conta(int numero){ this(numero, 0); } public Conta(int numero, double saldo){ this.numero = numero; this.saldo = saldo; } public void saque(double valorSaque){ saldo -= valorSaque; } public void saque(double valorSaque, double taxa){ saldo -= valorSaque + taxa; } public void setSaldo(double saldo) { this.saldo = saldo; } public double getSaldo() { return saldo; } } public class AplicacaoBancaria { public static void main(String[] args) { Conta minhaConta; minhaConta = new Conta(123); Conta outraConta; outraConta = new Conta(123, 500); minhaConta.setSaldo(100); minhaConta.saque(50); outraConta.saque(90,10); System.out.println(minhaConta.getSaldo()); System.out.println(outraConta.getSaldo()); } } 31 Muitas vezes, na programação, nos deparamos com um valor armazenado em uma variável de um tipo, e precisamos converter esse valor em uma variável de outro tipo. Podemos fazer algumas conversões implicitamente, e outras explicitamente 32 Conversão de tipos 32 Conversões implícitas Com tipos primitivos similares, podemos converter implicitamente os tipos menores para tipos maiores: int a = 5; float b = a; // a é igual a 5.0 short c = 3; long d = c; // d é igual a 3 33 Conversão de tipos 33 Conversões explícitas Para converter tipos maiores em tipos menores, temos que avisar a JVM explicitamente sobre a nossa conversão (casting). Neste caso, temos que estar cientes que pode haver perda de dados. double a = 5.15; int b = (int) a; // b será igual a 5 int c = 12345678; short d = (short) c; // c é 24910 34 Conversão de tipos 34 Conversões com Strings String não é um tipo primitivo. Strings são objetos da classe String, do java. Para converter valores numéricos armazenados em Strings, usamos métodos das Wrapper classes Integer, Long, Double, Float. String minhaString = “21”; int valorInt = Integer.parseInt(minhaString); double valorDouble = Double.parseDouble(minhaString); //minhaString é igual a “21” //valorInt será igual a 21 //valorDouble será igual a 21.00 35 Conversão de tipos 35 Conversões com Strings Para o processo contrário – converter valores numéricos em String, usamos o método valueOf, da classe String. double valorDouble = 42.31; String valorString = String.valueOf(valorDouble); //valorDouble é igual a 42.31 //valorString será igual a “42.31” 36 Conversão de tipos 36 Usando o tipo Date e formatador para converter String para Date e Date para Strimg SimpleDateFormat objFormato; objFormato = new SimpleDateFormat("dd/MM/yyyy"); Classe objeto = new ConstrutorDaClasse(); //entra a data usando o tipo String e a formata para o tipo Date String dataR = ”05/11/2020”; Date data = objFormato.parse(dataR); objeto.setData(data); // ou somente em uma linha //objeto.setData(objFormato.parse(”05/11/2020”)); System.out.println(objFormato.format(“Data da consulta: ” + objeto,getData())); 3 37 Conversão de tipos Precisa importer as classes SimpleDateFormat e Date antes de iniciar a codificação da classe principal import java.util.Date; import java.text.SimpleDateFormat; 37 https://www.alura.com.br/artigos/como-converter-string-para-date-em-java?gclid=EAIaIQobChMI88Tx6K7N7AIVDIiRCh1a0gHKEAAYASAAEgKGVPD_BwE Utilizando a API Calendar Calendar objCalendar = Calendar.getInstance(); objCalendar.setTime(date); System.out.println(objFormato.format(objCalendar.getTime())); //APIs do Java mais recentes paradatas (a partir do Java 8) //classe LocalDate do pacote "java.time” DateTimeFormatter objFormato; objFormato = DateTimeFormatter.ofPattern("dd/MM/yyyy"); LocalDate data = LocalDate.parse(”05/11/2020", objFormato); System.out.println(objFormato.format(data)); Usando o tipo Date e formatador para converter String para Date e Date para Strimg SimpleDateFormat objFormato; objFormato = new SimpleDateFormat("dd/MM/yyyy"); Consulta objConsulta = new Consulta(); //entra a data do tipo string e a formata para o tipo Date String dataR = ”05/11/2020”; Date data = objFormato.parse(dataR); objConsulta.setData(data); // ou somente em uma linha //objConsulta.setData(objFormato.parse(”05/11/2020”)); System.out.println(objFormato.format(“Data da consulta: ” + objConsulta,getData())); Voltando ao diagrama da clínica médica Orientação a Objetos 39 39 Voltando ao diagrama da clínica médica Vamos codificar as classes Paciente e Pessoa sem ainda codificar a relação entre ela e as outras classes Orientação a Objetos 40 40 41 Implementação Orientada a Objetos import java.util.Date; public class Paciente { private Date dataNascimento; private String sexo; public Paciente(){ } public Paciente(Date dn, String sexo){ dataNascimento = dn; this.sexo = sexo; } public void setDataNascimento (Date data)[ dataDeNascimento = data; } public Date get DataNascimento(){ return dataNascimento; } public void setSexo (String sexo)[ this.sexo = sexo; } public String getSexo(){ return sexo; } public void cadastrar(){} Public void consultar(){} } import java.util.Date; public class ClinicaMedica { public static void main(String[] args) { Paciente objPaciente = new Paciente(); objPaciente.setSexo(“Masculino”) // para a data precisa usar função de //conversão de string para data – pesquisar System.out.println(objPaciente.getSexo()); } } 41 Considere a classe Medico Médico Encapsulamento 42 Voltando ao diagrama da clínica médica (HERANÇA) Herança (generalização) Pessoa é super classe (classe mãe, primitive) Medico e Paciente são subclasses (classes filhas, derivadas) 42 43 Implementação Orientada a Objetos import java.util.Date; public class Paciente extends Pessoa { private Date dataNascimento; private String sexo; public Paciente(){ super();} public Paciente(int id, String nome, int rg, int cpf, Date dn, String sexo){ super (id, nome, rg, cpf); dataNascimento = dn; this.sexo = sexo; } public void setDataNascimento (Date data)[ dataDeNascimento = data; } public Date get DataNascimento(){ return dataNascimento; } public void setSexo (String sexo)[ this.sexo = sexo; } public String getSexo(){ return sexo; } public void cadastrar(){} Public void consultar(){} } import java.util.Date; public class ClinicaMedica { public static void main(String[] args) { Paciente objPaciente = new Paciente(); objPaciente.setSexo(“Masculino”) objPaciente.setId(1); objPaciente.setRg(11); objPaciente.setCpf(111); objPaciente.setNome("maria"); // para a data precisa usar função de //conversão de string para data – pesquisar System.out.println(objPaciente.getId()); System.out.println(objPaciente.getNome()); System.out.println(objPaciente.getCpf()); System.out.println(objPaciente.getRg()); System.out.println(objPaciente.getSexo()); } } Alterações na classe filha e na classe principal Precisa codificar a classe pessoa …… Herança.... 43 44 Implementação Orientada a Objetos import java.util.Date; public class Paciente extends Pessoa { private Date dataNascimento; private String sexo; public Paciente(){ super();} public Paciente(int id, String nome, int rg, int cpf, Date dn, String sexo){ super (id, nome, rg, cpf); dataNascimento = dn; this.sexo = sexo; } public void setDataNascimento (Date data)[ dataDeNascimento = data; } public Date get DataNascimento(){ return dataNascimento; } public void setSexo (String sexo)[ this.sexo = sexo; } public String getSexo(){ return sexo; } public void cadastrar(){} Public void consultar(){} } import java.util.Date; public class ClinicaMedica { public static void main(String[] args) { Paciente objPaciente = new Paciente(); objPaciente.setSexo(“Masculino”) objPaciente.setId(1); objPaciente.setRg(11); objPaciente.setCpf(111); objPaciente.setNome("maria"); String dataString = "13/03/2021"; SimpleDateFormat objFormato = new SimpleDateFormat("dd/MM/yyyy"); Date data = objFormato.parse(dataString); objPaciente.setDataNascimento(data); // ou somente em uma linha //objeto.setData(objFormato.parse(”05/11/2020”)); System.out.println(objFormato.format("Data de nascimento: " + objPaciente.getDataNascimento())); System.out.println(objPaciente.getId()); System.out.println(objPaciente.getNome()); System.out.println(objPaciente.getCpf()); System.out.println(objPaciente.getRg()); System.out.println(objPaciente.getSexo()); } } Herança.... 44 Bibliografia Básica Pádua, W, P. F. “Engenharia de Software”. Fundamentos, métodos e padrões. Editora: LCT, 2001. Santos Neto, ANTONIO GONÇALVES DOS. Java na Web. 1. Rio de Janeiro / Ciência Moderna, 2011. WINDER, Russel; ROBERTS, Graham.; Desenvolvendo software em Java (3ª Ed); http://online.minhabiblioteca.com.br/#/books/978-85-216-1994-9/pages/67068701 RUTTER, Jake. Smashing jQuery: Interatividade Avançada com JavaScript Simples, Bookman, 2012. <http://online.minhabiblioteca.com.br/books/9788540701359>. Bibliografia 45 Plano de Ensino 45 Bibliografia complementar ARNOLD, Ken ; GOSLING, James ; HOLMES, David. A Linguagem de Programação Java, 4ª edição, Bookman, 2007. <http://online.minhabiblioteca.com.br/books/9788560031610>. ROMAN, Ed; AMBLER, Scott W.; JEWELL, Tyler . Dominando Enterprise Javabeans, 2ª Edição, 2004. Minha Biblioteca. Web. 20 November 2013 <http://online.minhabiblioteca.com.br/books/9788577804061>. BARNES, D.; KÖLLING, Michael. Programação orientada a objetos com Java: uma introdução prática usando o Blue J. São Paulo: Pearson Prentice Hall, 2004. 368 p. + 1 CD-ROM ISBN 8776050129. Número de Chamada: 005.133 B261p Bibliografia 46 Plano de Ensino 46 UML para Java. Disponível em: https://www.devmedia.com.br/uml-para-java/2711. Acessado em 28/08/2020. https://www.guj.com.br/t/cod-para-calcular-media-resolvido/32587 https://www.alura.com.br/artigos/como-converter-string-para-date-em-java?gclid=EAIaIQobChMI88Tx6K7N7AIVDIiRCh1a0gHKEAAYASAAEgKGVPD_BwE Bibliografia 47 47
Compartilhar