Java POO

46
Curso de Java OO – Orientação a Objetos Classe, 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

Transcript of Java POO

Page 1: 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

Page 2: Java POO

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.

Page 3: Java POO

Classe – Um molde para um objeto

3

Os atributos privados, juntamente com os métodos get e set

garantem o encapsulamento

Page 4: Java POO

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 ?

Page 5: Java POO

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

Page 6: Java POO

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:

Page 7: Java POO

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.

Page 8: Java POO

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)

Page 9: Java POO

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

Page 10: Java POO

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

Page 11: Java POO

Herança – Relacionamento É UM

11

Page 12: Java POO

Herança – Diagrama de Classes UML

12

Page 13: Java POO

Herança – Pessoa e suas classes Especializadas

13

ConstrutoresVeremos

nas pags: 25/27

Page 14: Java POO

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

Page 15: Java POO

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

Page 16: Java POO

Qualificadores: Modificador de Acesso

16

Esses modificadores de acesso podem aparecer na frente da declaração de Classes,

Atributos ou Métodos

Page 17: Java POO

Qualificadores: Modificador de Acesso (tabela)

17

Diretivas de Encapsulamento ou Modificadores de de Acesso/Visibilidade

Page 18: Java POO

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.

Page 19: Java POO

Encapsulamento de Atributos

19

Page 20: Java POO

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);

Page 21: Java POO

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();

Page 22: Java POO

Mais exemplos de instanciação de objetos

22

Declaração da classe Veiculo:

Page 23: Java POO

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)

Page 24: Java POO

Mais exemplos de instanciação de objetos

24

Instanciando um veículo em java.

Page 25: Java POO

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

Page 26: Java POO

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

Page 27: Java POO

Construtores

27

Page 28: Java POO

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

Page 29: Java POO

Associação de Classes – Relacionamento TEM UM

29

Page 30: Java POO

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;

Page 31: Java POO

- 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

Page 32: Java POO

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

Page 33: Java POO

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

Page 34: Java POO

Exemplo: Diagrama de Classes UMLVídeo Locadora

34

Page 35: Java POO

Exemplo: Diagrama de Classes UMLUm hospital completo

35

Page 36: Java POO

Exemplo: Diagrama de Classes UMLUm hospital simplificado

Classe ControlePaciente

36

Page 37: Java POO

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

Page 38: Java POO

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

Page 39: Java POO

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

Page 40: Java POO

... //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

Page 41: Java POO

... //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

Page 42: Java POO

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

Page 43: Java POO

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

Page 44: Java POO

.... 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

Page 45: Java POO

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

Page 46: Java POO

Sugestão de Material

http://www.dialetodigital.com/blog/conteudos-programacao/