Buscar

IOO_Aula 5 _Encapsulamento, Métodos e retorno, sobrecarga, converção de tipos e Herança

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

Continue navegando