Java POO
-
Upload
mario-sergio -
Category
Technology
-
view
1.509 -
download
1
Transcript of Java POO
Curso de Java
OO – Orientação a ObjetosClasse, Objeto, Instanciação
Encapsulamento, Herança, Construtores,Associação de Classes
Abstração
Ministrado por: Mário Sergio
email: [email protected]
https://www.linkedin.com/profile/view?id=111098029
Orientação a Objetos
2
Em um sistema orientado a objetos, os dados e todas as operações (funções), que manipulam esses dados, são agrupados em uma única estrutura: os objetos. O molde da estrutura de um objeto são as classes.
Classe – Um molde para um objeto
3
Os atributos privados, juntamente com os métodos get e set
garantem o encapsulamento
Do paradigma Procedural para OO
4
A solução é criar outras classes !
public class ProgramaEscola { static String nomeAluno; static int idade; static String nomeFuncionario; static String usuarioFuncionario; static String senhaFuncionario; static Double resultadoCalculo;
static void realizaMatricula() { nomeAluno = JoptionPane.showInputDialog("Novo Aluno: "); ...} static void loginSistema() {
lusuarioFuncionario = JoptionPane.showInputDialog("Usuario:"); senhaFuncionario = JoptionPane.showInputDialog("Senha:"); ...} static void imprime(String mensagem) {
System.out.println("Aviso: " + mensagem);}static double soma(double n1, double n2) {
return n1 + n2;}
static double divide(double n1, double n2) {return n1 / n2;
} static double multiplica(double n1, double n2) {
return n1 * n2;}
…...............
Como resolver esta bagunça ?
Regras/Benefícios das Classes em OO
5
-Dividir o programa em partes menores
-Criar classes com caracteristicas (atributos) e comportamentos (métodos)
semelhantes (uma Abstração do mundo real)
-Delegar responsabilidades (Encapsulamento)
-Possibilita o Reuso de código (Herança)
-Torna a programação mais flexível (Polimorfismo)
-Melhora a legibilidade e a Documentação do software
Criando Classes
6
public class Aluno { private String nome private int idade; //métodos}
public class Funcionario { private String nome; private int idade; private String usuario; private String senha; private String departamento; //métodos}
public public class Calculadora { private double resultadoCalculo; //métodos}
Em princípio, poderiamos dividir as classes do nosso exemplo da seguinte maneira para resolver a bagunça:
Criando uma Classe Genérica
7
public class Pessoa { private String nome private int idade; //métodos}
Mas, observe que as classes Aluno e Funcionário possuem caracteristicas comuns (nome e idade), isso nos permite criar de uma Classe Genérica que poderiamos chamar de Pessoa.
Depois disso, podemos fazer REUSO de código da classe Genérica Pessoa a partir do conceito de Herança.
Ou seja, podemos criar duas classes Especializadas (filhas: Aluno, Funcionário) que herdam as caracteristicas e métodos da classe Genérica (Mãe), e terão tambémsuas caracteristicas próprias.
Isso garante o REUSO de código da Classe Genérica Pessoa.
Criando uma Classe Genérica
8
Código Java e Diagrama UML da classe Classe Genérica (SuperClasse) Pessoa.
A palavra this,serve para referenciar
um atributo do objeto e nãouma variável local.
Nesse exemplo, o atributoprivate int idade recebe o valor
do parâmetro idade passado ao método setIdade(int idade)
Herança Superclasse (Genérica): é classe pai que fornece atributos e comportamento
para outras classes;
Subclasse (Especializado): referem-se a especializações de determinada classe projetando uma nova versão do modelo original.
public class Pessoa { private int id; private String nome, endereco; private int idade; //métodos}
public class Funcionario extends Pessoa {
private String usuario; private String senha;
private String departamento; //métodos da classe Paciente}
”extends” é a palavra reservada que indica que uma classe (subclasse) está herdando as características de outra classe (superclasse)
Pessoa
Paciente Médico Funcionário
Aluno
9
private é o modificador de visibilidade, que garante que os atributos somente
seja acessado dentro da propria classe
Herança – Relacionamento É UM
10
Diagrama UMLunified modeling language
Notação de Diagramaspara modelar
Projetos de Software
A Herança é um Relacionamento É UM
Então:
Homem É UM AnimalCão É UM AnimalGato É UM Animal
Seta para cima, indica o relacionamento de
Herança É UM
Herança – Relacionamento É UM
11
Herança – Diagrama de Classes UML
12
Herança – Pessoa e suas classes Especializadas
13
ConstrutoresVeremos
nas pags: 25/27
Qualificadores em JAVA
14
Na frente da declaração de Classes, Atributos e Métodos, podem aparecer palavras chaves que são seus qualificadores
(também chadamas de diretivas)
Modificadores de Acesso/Visibilidade
ou Diretivas de Encapsulamento
(são mutuamente exclusivos, somenteUm deles deve aparecer)
Qualificadores Gerais
Esse qualificadores podem ser Classificados em:
Obs: ainda há outros, mas esses são os mais importantes
Os qualificadores e sua sintaxe
15
Nem todos os qualificadores são aplicáveis em qualquer lugar:
Declaração de Classes
Declaração de Atributos e Variáveis
Declaração de Métodos
Declaração de Classes
ver pags: 32/33
Qualificadores: Modificador de Acesso
16
Esses modificadores de acesso podem aparecer na frente da declaração de Classes,
Atributos ou Métodos
Qualificadores: Modificador de Acesso (tabela)
17
Diretivas de Encapsulamento ou Modificadores de de Acesso/Visibilidade
Encapsulamento de Atributos
18
Os atributos de uma classe devem ser definidos com a diretiva privateE os métodos get e set devem ser declarados. Mas, apenas para os atributos que precisam ser acessados fora da sua classe.
Encapsulamento de Atributos
19
O operador new
20
Para usarmos uma classe precisamos declarar uma variável ou atributo utilizando a classe como tipo.
Declaração: 3 atributos (objetos) das classes Pessoa, Aluno e Funcionario.
private Pessoa pessoa1;
private Aluno pessoa2;
private Funcionario fulano;
Instanciação: Mas, diferentemente dos tipos primitivos, para instanciar/inicializaruma variável/atributo cujo tipo é uma classe, é preciso utilizar a palavra reservada new
pessoa1 = new Pessoa();
pessoa2 = new Aluno();
fulano = new Funcionario();
A partir desse momento cada objeto (indivíduo) passa a ter um espaço individual na memoria para armazenanar seus dados.
pessoa1.setNome("Elvis Presley");
pessoa1.setIdade(29);
O operador new
21
O operador new é um criador (instanciador) de objetos de uma classe.
Declaração e Instanciação tudo na mesma linha:
private Pessoa pessoa1 = new Pessoa();
Mais exemplos de instanciação de objetos
22
Declaração da classe Veiculo:
Mais exemplos de instanciação de objetos
23
Instanciando um veículo (lembrando que uma classe é um molde (fôrma) que pode fabricar vários objetos (indivíduos)
Mais exemplos de instanciação de objetos
24
Instanciando um veículo em java.
Construtores
25
Instanciamos um objeto com new new, na verdade estamos chamando o construtor do objeto.
pessoa1 = new Pessoa();
Instanciando um objeto com construtor SEM parâmetros Construtor padrão (nem precisa declarar)
public Pessoa() { }
pessoa1 = new Pessoa("Fausto Silva", 55);
Instanciando um objeto com construtor COM parâmetros
public Pessoa(String nome, int idade) { this.nome = nome; this.idade = idade; }
Declaração de um novo construtor COM parâmetrosAssim, o objeto pessoa1 já é criado
com um nome e uma idade
sem que haja a necessidade da chamada posterior aos métodos
setNome e setIDade
Construtores
26
Agora suponha que precisamos de uma classe especializada que herda a classe Pessoa, para representar os milionários:
milionario1 = new Milionario("Eike Batista", 1283254895.52);
Novo construtor da classe Milionario
public class Milionario extends Pessoa {
private Double fortuna; public Milionario(String nome, int idade, Double fortuna) { super(nome,idade);
this.fortuna = fortuna; }...
Chama o construtor da SuperClasse Pessoa
Instanciando um objeto do tipo Milionario
Referência ao atributo declarado na própria classe
Construtores
27
Associação de Classes – Relacionamento TEM UM
28
A Associação é um Relacionamento TEM UM (ou TEM VÁRIOS)
Então:
Pedido TEM UM ClientePedido TEM VÁRIOS ItensItem TEM UM Livro
Associação de Classes – Relacionamento TEM UM
29
Associação de Classes – Relacionamento TEM UM
30
Como escrever osrelacionamentos em java:
Pedido TEM UM Atributo do tipo Clienteprivate Cliente cliente;
Pedido TEM VÁRIOS Atributos do tipo ItemPedidoList<ItemPedido> itens = new ArrayList<>();
Item TEM UM Livroprivate Livro livro;
- Com base no exercício provão desenvolvido durante as aulas:
1-Crie classes para Pessoa, Aluno, Funcionário, parecido com o Diagrama de Classe da pag 13 (mas, utilize o modificador private nos atributos, ao invés de protected) (coloque essas classes em um pacote chamado modelo).
2-Importe a classe calculadora ao seu projeto no pacote modelo.
3-Altere seu programa principal de maneira que ele instancie e utilize os métodos das classes modelo, de maneira a reutilizar os métodos dessas classe.
4-Crie um construtor com parametros para a classe Funcionário, que deve adicionar os atributos: Cargo, usuario, senha. No seu programa principal instancie pelo menos 4 Funcionários.
5-Para utilizar o seu sistema o usuário precisará fazer login, você somente deverá permitir digitação das notas das alunos aos funcionário credenciados para isso (cargo: secretária).
Exercício
31
Tornado uma Classe Abstrata
32
Ora, será que no dominio do nosso problema queremos que um objeto seja apenas uma “pessoa qualquer” ?
Na verdade não !
Queremos que toda pessoa no nosso sistema seja do tipo de uma das classes especializadas de Pessoa, e não um “pessoa qualquer”. Para isso precisamos informar que a classe Pessoa é abstrata, para isso utilizamos o qualificador bstract.
public abstract class PessoaAssim, não será mais possível instanciar um objeto do tipo Pessoa com o operador new . Ou seja, a classe Pessoa agora só serve para ser herdada por um aclasse especializada.
Pessoa pessoa1 = new Pessoa();
public class Aluno extends Pessoa OK
Uma classe que não pode ter filhos: Classe Final
33
Uma classe final é o inverso da classe abstrata, ela não pode ser herdada por outra classe (ou seja, não é uma superclasse), podendo apenas ser instanciada com new.
Assim, se não quisermos que a classe especializada Aluno seja utilizada para criar Alunos mais especializados, como por exemplo: AlunoFundamental, AlunoSuperior...
Então precisamos informar que ela é uma classe final, para isso utilizamos o qualificador final.
public final class Aluno
Assim, não será possível herdar a classe Aluno, ou seja é a versão final da classe, não poderá mais ser alterada.
Aluno aluno1 = new Aluno(); OKpublic class AlunoSuperior extends Aluno
Exemplo: Diagrama de Classes UMLVídeo Locadora
34
Exemplo: Diagrama de Classes UMLUm hospital completo
35
Exemplo: Diagrama de Classes UMLUm hospital simplificado
Classe ControlePaciente
36
public class Paciente extends Pessoa {
//Atributos private String documento;
//Construtor public Paciente(int pCodigo, String pNome, String pEndereco, int pIdade, String pDocumento) { setId(pCodigo); setNome(pNome); setEndereco(pEndereco); setIdade(pIdade); documento = pDocumento; }
//Métodos de atribuição public void setDocumento(String pDocumento) { documento = pDocumento; }
//Métodos de recuperação public String getDocumento() { return documento; }}
Exemplo – Modelagem UML Hospital
Classe Paciente Construtor da classe Paciente com cinco argumentos
Métodos de atribuição de informação set...()
Métodos de recuperação de informação get...()
Encapsulamento: Todos os atributos da classe Paciente são definidos como privados “private” e somente podem ser acessados através de métodos públicos “public”.
37
public class Paciente extends Pessoa {
//Atributos private String documento;
//Construtor public Paciente(int pCodigo, String pNome, String pEndereco, int pIdade, String pDocumento) { setId(pCodigo); setNome(pNome); setEndereco(pEndereco); setIdade(pIdade); documento = pDocumento; }
//Métodos de atribuição public void setDocumento(String pDocumento) { documento = pDocumento; }
//Métodos de recuperação public String getDocumento() { return documento; }}
Exemplo – Modelagem UML Hospital
Classe Paciente Construtor da classe Paciente com cinco argumentos
Métodos de atribuição de informação set...()
Métodos de recuperação de informação get...()
Encapsulamento: Todos os atributos da classe Paciente são definidos como privados “private” e somente podem ser acessados através de métodos públicos “public”.
38
public class ControlePaciente { private List<Paciente> listaPaciente = new ArrayList<>(); public void inserePaciente(int pId, String pNome, String pEndereco, int pIdade, String pDocumento) { Paciente paciente = new Paciente(pId, pNome, pEndereco, pIdade, pDocumento); listaPaciente.add(paciente); }
//Método utilizado para imprimir a lista de TODOS Pacientes public String imprimePacientes() { String result = ""; for (int intIdx = 0; intIdx < listaPaciente.size(); intIdx++) { result += "Código: " + listaPaciente.get(intIdx).getId()+ " Nome: " + listaPaciente.get(intIdx).getNome()+ " Idade: " + listaPaciente.get(intIdx).getIdade() + " Documento: " + listaPaciente.get(intIdx).getDocumento() +"\n"; } return result; }....
Exemplo – Modelagem UML Hospital
Classe ControlePaciente
Cria o objeto paciente (instância da classe Paciente) utilizando o construtor que recebe parâmetros
39
... //Método utilizado para imprimir UM DETERMINADO Paciente public String imprimePaciente(int pId) { for " Nome: " +intIdx = 0; intIdx < listaPaciente.size(); intIdx++) { if (listaPaciente.get(intIdx).getId() == pId) { return "Código: " + listaPaciente.get(intIdx).getId()+ " Nome: " + listaPaciente.get(intIdx).getNome()+ " Idade: " + listaPaciente.get(intIdx).getIdade()+ " Documento: " + listaPaciente.get(intIdx).getDocumento()+"\n"; } } }}
Classe ControlePaciente
Exemplo – Modelagem UML Hospital
40
... //Método utilizado para imprimir UM DETERMINADO Paciente public String imprimePaciente(int pId) { for " Nome: " +intIdx = 0; intIdx < listaPaciente.size(); intIdx++) { if (listaPaciente.get(intIdx).getId() == pId) { return "Código: " + listaPaciente.get(intIdx).getId()+ " Nome: " + listaPaciente.get(intIdx).getNome()+ " Idade: " + listaPaciente.get(intIdx).getIdade()+ " Documento: " + listaPaciente.get(intIdx).getDocumento()+"\n"; } } }}
Classe ControlePaciente
Exemplo – Classe ControlePaciente
41
import javax.swing.*;
public class ProgramaHospital {
private ControlePaciente ctrPac = new ControlePaciente();
public void capturaDados() { ctrPac.inserePaciente(1, "José da Silva", "Endereço 1", 55, "298982828"); ctrPac.inserePaciente(2, "Fulano de Tal", "Endereço 2", 18, "099889828"); ctrPac.inserePaciente(3, "Alexandre Silveira", "Endereço 3", 35, "327489938"); }
public void imprimePacientes() { System.out.println(ctrPac.imprimePacientes()); }
public void imprimePaciente(int pId) { System.out.println(ctrPac.imprimePaciente(pId)); }
public static void main (String par[]) { LimiteCadPaciente limPac = new LimiteCadPaciente(); limPac.capturaDados(); limPac.imprimePacientes(); System.out.println("-------------------"); limPac.imprimePaciente(2); }}
Classe Principal do Programa:
ProgramaHospital
Chama os métodos da classe ControlePaciente através do objeto ctrPac
Cria o objeto ctrPac (instância da classe ControlePaciente)
Exemplo – Modelagem UML Hospital
42
import javax.swing.*;
public class ProgramaHospital {
public static void main (String par[]) {
int escolha = 0;
//Variável utilizada para recuperar as informações da interface //do usuário int id = 0; String nome = "", endereco = "", documento = ""; int idade = 0;
//Instancia o Controlador ControlePaciente ctrPac = new ControlePaciente();
do { do { escolha = Integer.parseInt( JOptionPane.showInputDialog("Escolha uma opção do menu:\n"+ "[1] Adiciona Pacientes\n"+ "[2] Altera Pacientes\n"+ "[3] Finaliza")); } while ((escolha < 1) || (escolha > 3));
if (escolha == 3) System.exit(0); ....
Cria o objeto ctrPac (instância da classe ControlePaciente)
Exemplo – Classe LimiteCadPacienteExemplo – Classe ProgramaHospital
43
Classe Principal do Programa:
ProgramaHospital
.... switch (escolha) { case 1: //Requisita o Código id = Integer.parseInt( JOptionPane.showInputDialog ("Informe o código")); //Requisita o Nome nome = JOptionPane.showInputDialog ("Informe o nome"); //Requisita o Endereco endereco = JOptionPane.showInputDialog ("Informe o endereço"); //Requisita a Idade idade = Integer.parseInt( JOptionPane.showInputDialog ("Informe a idade")); //Requisita o Documento documento = JOptionPane.showInputDialog ("Informe o documento"); //Adiciona o objeto para a lista de pacientes ctrPac.inserePaciente(id, nome, endereco, idade, documento); break; case 2: JOptionPane.showMessageDialog(null, ctrPac.imprimePacientes(), "Relação de Pacientes", JOptionPane.INFORMATION_MESSAGE); } } while (true); }}
Chama os métodos da classe ControlePaciente através do objeto ctrPac
Exercício I – Limite (Classe LimiteCadPacienteI)Exemplo – Classe ProgramaHospital
44
Classe Principal do Programa:
ProgramaHospital
Referências
Programação de computadores em Java
Rui Rossi dos Santos
Java 8: Programação de Computadores - Guia Prático de Introdução, Orientação e Desenvolvimento - José Augusto N. G. Manzano
Slides do Prof. Roberto Pacheco INE – CTC – UFSC
Slides do Prof. Rui Silva
Escola Naútica D. Henrique
Sugestão de Material
http://www.dialetodigital.com/blog/conteudos-programacao/