Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 71

Java e a

Orientação a Objetos

Ayslan Macedo de Sousa


1
Orientação a Objetos
• A orientação a objetos é um paradigma de
análise, projeto e programação

2
Orientação a Objetos
• Ajudar a se organizar e escrever menos

• Concentra as responsabilidades nos pontos


certos

• Encapsulamento da lógica de negócios.

3
Conceitos Essenciais
Elemento Descrição

Classe É o tipo do Objeto

Objeto/Instância É o objeto criado (instanciado ou construído)

Atributo São as características da classe

Método São as operações(habilidades) da classe

4
Exemplo - Conta Bancária
• Ao tentar abstrair o caso de uma conta,
podemos perceber, suas características e
operações, por exemplo:

– Saldo
– Opção de Sacar
– Opção de Depositar
– Número da Conta
– Titular

5
Exemplo - Conta Bancária
• Classe
– Conta Bancária

• Objeto instância
– Conta do Fulano de tal

• Atributo
– Número da Conta
– Titular
– Saldo Atual

• Método
– Sacar
– Depositar

6
UML - Conta Bancária
• É possível mostrar graficamente uma classe através da
UML, utilizando um Diagrama de Classes:

ContaBancaria: Nome da Classe

Atributos da classe: saldo, numero e


titular

Métodos da classe: sacar e depositar

7
Exercício - Identificando cada elemento
• Considere um veículo, modelado no paradigma orientado a
objetos, identifique o que cada elemento abaixo representa:

Veículo
• Classe
Cor
• Instância/Objeto
Ligar o motor
• Atributo
Quantidade de Portas • Método
Acender os Faróis
Carro do Fulano

8
Exercício - Identificando cada elemento

• Considere um veículo, modelado no paradigma orientado a


objetos, identifique o que cada elemento abaixo representa:

Veículo Classe
Cor Atributo
Ligar o motor Método
Quantidade de Portas Atributo
Acender os Faróis Método
Carro do Fulano Instância

9
UML – Exemplo mais complexo
• Nesse Diagrama de Classes o nível de
abstração é maior:

10
Conta Bancária em Java

1. class Conta{
2. double saldo;
3. String numero;
4. String titular;
5. }

11
Instanciado uma Conta
Para se instanciar um novo objeto usa-se a palavra
reservada “new”.

1. Conta conta = new Conta();


2. conta.saldo = 10000;
3. conta.numero = "2000";
4. conta.titular = "Fulano de Tal";

12
Exercício - Conta Bancária
• Criar a classe Conta.java:
1. class Conta{
2. double saldo;
3. String numero;
4. String titular;
5. }

• Criar a classe TesteConta.java:


1. public class TesteConta {
2. public static void main(String[] args) {
3. Conta conta = new Conta();
4. conta.saldo = 10000;
5. conta.numero = "2000";
6. conta.titular = "Fulano de Tal";
7. //escrever o resultado
8. System.out.println(conta.saldo);
9. System.out.println(conta.numero);
10. System.out.println(conta.titular);
11. }
12. }

13
Métodos - Sintaxe
Tipo de retorno. O retorno void
Nome do método. Geralmente
indica que não possui retorno
deve indicar uma ação

Parâmetros do Método

1. void sacar(double valor) {


2. saldo = saldo - valor;
3. }

14
Métodos com Retorno - Sintaxe

Tipo de retorno

1. int duplicar(int valor) {


2. return valor * 2;
3. }

Para indicar o retorno deve-se


utilizar a palavra chave return

15
Conta Bancária - Métodos
No exemplo abaixo foram adicionados os métodos “sacar” e “depositar” na
classe Conta.java:
1. class Conta{
2.

3. double saldo;
4. String numero;
5. String titular;
6.

7. void sacar(double valor) {


8. this.saldo = this.saldo - valor;
9. }
10.

11. void depositar(double valor) {


12. this.saldo = this.saldo + valor;
13. }
14.

15. }

16
Exercício - Conta Bancária - Métodos
• Adicionar os métodos “sacar” e “depositar” na classe “Conta”:
1. void sacar(double valor) {
2. saldo = saldo - valor;
3. }
4. void depositar(double valor) {
5. saldo = saldo + valor;
6. }

• Alterar classe TesteConta, e utilizar os métodos “sacar” e “depositar”:


1. public static void main(String[] args) {
2. Conta conta = new Conta();
3. conta.saldo = 10000;
4. conta.numero = "2000";
5. conta.titular = "Fulano de Tal";
6. //sacar
7. conta.sacar(5000);
8. System.out.println(conta.saldo);
9. //depositar
10. conta.depositar(20000);
11. System.out.println(conta.saldo);
12. }
17
Modificadores de Acesso
• Também conhecidos como modificador de
visibilidade
• Definem se o acesso ao método ou ao
atributo deve ser privado, público ou
protegido.

18
Modificadores de Acesso

Modificador Descrição

O acesso é permitido somente dentro da classe


private
onde ele foi declarado
A classe e/ou seus membros são acessíveis
default
somente por classes do mesmo pacote
O acesso é permitido dentro da classe onde ele foi
protected
declarado, nas suas subclasses e no mesmo pacote

public O acesso é livre em qualquer classe

19
Modificadores de Acesso
private default protected public

Mesma classe X X X X

Mesmo Pacote X X X
Pacotes diferentes
X* X
(sendo subclasse)
Pacotes diferentes (não
X
sendo subclasse)
* Apenas através de Herança

20
Modificadores de Acesso em Java

private default* protected public

classe X X

atributo X X X X

método X X X X

* O modificador default não deve ser explicitamente declarado em Java,


para que seja default, basta que nenhum modificador esteja declarado

21
Modificadores de Acesso nas Classes
Nas declaração das classes apenas o public ou o default é
permitido:

1. private class Conta{


2. }

1. protected class Conta{


2. }

1. public class Conta{


2. }
1. class Conta{
2. }

22
Modificando a Classe Conta
Adicionando os modificadores de acesso privados nos campos e
public classe Conta:
Sem modificadores de acesso:
1. class Conta{
2. double saldo;
3. String numero;
4. String titular;
5. }
Com modificadores de acesso:
1. public class Conta {
2. private double saldo;
3. private String numero;
4. private String titular;
5. }
23
Modificadores de Acesso

Importante!
Na orientação a objetos, é prática muito recomendada proteger
seus atributos com private.

24
Encapsulamento
• Encapsulamento, é uma das práticas da
orientação a objetos que consiste em separar
o programa em partes, o mais isoladas
possível.
• A idéia é tornar o software mais flexível, fácil
de modificar e de criar novas implementações

25
Encapsulamento - Getters e Setters
São métodos que acessam ou atribuem os
valores aos campos de uma classe.
1. public class Conta {
2.
3. private double saldo;
4.
5. public double getSaldo() {
6. return saldo;
7. }
8. public void setSaldo(double saldo) {
9. this.saldo = saldo;
10. }
11.}

26
Encapsulamento – Getters e Setters
Como os atributos estão private, não é possível acessar
diretamente seus valores assim:

1. Conta conta = new Conta();


2. conta.saldo = 10000;

A valores devem ser atribuídos através do “set”:

1. Conta conta = new Conta();


2. conta.setSaldo(10000);

27
Encapsulamento - Getters e Setters
1. public class Conta {
2.
3. private double saldo;
4. private String numero;
5. private String titular;
6.
7. public double getSaldo() {
8. return saldo;
9. }
10. public void setSaldo(double saldo) {
11. this.saldo = saldo;
12. }
13. public String getNumero() {
14. return numero;
15. }
16. public void setNumero(String numero) {
17. this.numero = numero;
18. }
19. public String getTitular() {
20. return titular;
21. }
22. public void setTitular(String titular) {
23. this.titular = titular;
24. }
25. }

28
Exercício - Modificar a classe Conta
• Modificar a classe Conta.java
– Adicionar modificador de acesso public na declaração da classe
– Adicionar modificadores de acesso private aos campos
– Criar Getters e Setters
• Utilizar atalhos da IDE NetBeans Alt+Insert

1. class Conta{
2. double saldo;
3. String numero;
4. String titular;
5. }

29
Getters e Setters

Importante!
Não é uma boa prática criar getters e setters para todos os
atributos, sem antes analisar. Devem ser criados apenas caso
haja necessidade.

30
Exercício – Teste Conta Bancária
Alterar a classe TesteConta.java e considerar os gets e sets criados na
classe Conta:
1. public class TesteConta {
2. public static void main(String[] args) {
3.
4. Conta conta = new Conta();
5. conta.setSaldo(10000);
6. conta.setNumero("2000");
7. conta.setTitular("Fulano de Tal");
8. //sacar
9. conta.sacar(5000);
10. System.out.println(conta.getSaldo());
11. //depositar
12. conta.depositar(20000);
13. System.out.println(conta.getSaldo());
14.
15. }
16. }

31
Construtores
Sempre quando o new é chamado, ele executa o construtor da classe.
O construtor da classe é um bloco declarado com o mesmo nome que a
Classe:

1. public class Conta {


2. O construtor deve ser declarado
3. private double saldo; com o mesmo nome da classe
4. private String numero;
5. private String titular;
6.
7. public Conta() {
8. }
9. //getters e setters
10. }

32
Construtor que recebe argumento
Sempre quando o new é chamado, ele executa o construtor da classe.
O construtor da classe é um bloco declarado com o mesmo nome que a
Classe:

1. public class Conta { O construtor que recebe, saldo,


2. numero e titular
3. private double saldo;
4. private String numero;
5. private String titular;
6.
7.
8. public Conta(double saldo, String numero, String titular) {
9. this.saldo = saldo;
10. this.numero = numero;
11. this.titular = titular;
12. }
13.
14. //getters e setters
15. }

33
Múltiplos Construtores
Mais de um construtor podem ser declarados na classe:
1. public class Conta {
2.
3. private double saldo;
4. private String numero;
5. private String titular;
6.
7. //construtor 1
8. public Conta() {
9.
10. }
11. //construtor 2
12. public Conta(double saldo, String numero, String titular) {
13. this.saldo = saldo;
14. this.numero = numero;
15. this.titular = titular;
16. }
17.
18. //getters e setters
19. }
34
Exercício - Construtores
Adicionar 2 construtores na classe Conta:
1. Construtor Vazio (Sem argumentos)
2. Construtor que recebe saldo, numero e titular

Dica: Utilizar atalho da IDE (Netbeans: Alt+Insert)

1. public class Conta {


2.
3. private double saldo;
4. private String numero;
5. private String titular;
6.
7.
8. //getters e setters
9. }

35
Exercício - Construtores
Resposta:
1. public class Conta {
2.
3. private double saldo;
4. private String numero;
5. private String titular;
6.
7. public Conta() {
8.
9. }
10.
11. public Conta(double saldo, String numero, String titular) {
12. this.saldo = saldo;
13. this.numero = numero;
14. this.titular = titular;
15. }
16.
17. //getters e setters
18. }

36
Padrão Java Bean
Quando criamos uma classe com todos os atributos privados, seus
getters e setters e um construtor vazio (padrão), na verdade estamos
criando um Java Bean.
1. public class Conta {
2.
3. private double saldo;
4. private String numero;
5. private String titular;

6. public Conta() {
7.
8. }
9.
10. public double getSaldo() {
11. return saldo;
12. }
13. public void setSaldo(double saldo) {
14. this.saldo = saldo;
15. }
16. //outros getters e setters
17. }

Com os getters e setters criados e um construtor padrão, a classe Conta.java se


tornou um Java Bean.
37
Método “toString()”
• Todas as classes java podem sobrescrever esse
método

• Ao escrever o próprio objeto esse método


será chamado

• Por padrão o java atribui uma hash


concatenado com o nome da classe e “@”
(não é humanamente legível)

38
Método “toString()”

1. public class ToString {


2. public static void main(String[] args) {
3.

4. Conta conta = new Conta();


5. conta.setNumero("3000");
6. conta.setSaldo(10000);
7. conta.setTitular("Maria");
8. //escreverá algo como "Conta@164f1d0d"
9. System.out.println(conta);
10.

11. }
12. }

39
Definindo o “toString()” da classe Conta

1. public class Conta {


2.

3. public String toString() {


4. return "Número: "+numero+" Titular: "+titular+" Saldo: "+saldo;
5. }
6.

7. }

Nesse é exemplo é mostrado a concatenação de Strings, que se faz utilizando o “+”

40
Exercício “toString()”
Criar o toString() na classe Conta como mostrado abaixo:
1. public String toString() {
2. return "Número: "+numero+" Titular: "+titular+" Saldo: "+saldo;
3. }

Criar a classe ToString e escrever o resultado, após setar os campos:


1. public class ToString {
2. public static void main(String[] args) {
3. Conta conta = new Conta();
4. conta.setNumero("3000");
5. conta.setSaldo(10000);
6. conta.setTitular("Maria");
7. System.out.println(conta);
8. }
9. }

41
Pacotes

• Organização física dos arquivos

• Pode-se dividir arquivos de estrutura


semelhante, exemplo:
• Classes de acesso ao banco de dados
• Classes de domínio
• Classes de Regra de Negócio

• Identificação do projeto ou módulo

42
Pacotes
• Exemplo de pacotes do JavaSE:

43
Exercício - Pacotes
• Criar o pacote chamado br.com.curso.modelo
• Clicar com o direto em cima do projeto
• Selecionar novo - > Pacote Java
• Criar a classe Veiculo.java dentro do pacote
br.com.curso.modelo
• Clicar com o direito em cima do pacote
• Selecionar novo -> Classe Java

44
Exercício - Criação de classes
• Criar o pacote br.com.curso.modelo
• Criar as 4 classes mostradas no diagrama de classes
– Veiculo, Cor, Pessoa e TipoCombustivel
• Criar as classes com seus atributos, respectivos getters e setters

45
Exercício - Criação de classes
Classe Cor: Classe TipoCombustivel:
1. package br.com.curso.modelo; 1. package br.com.curso.modelo;
2. 2.
3. public class Cor { 3. public class TipoCombustivel {
4. 4.
5. private long id; 5. private long id;
6. private String descricao; 6. private String descricao;
7. 7.
8. //getters e setters 8. //getters e setters
9. } 9. }

Classe Veiculo: Classe Pessoa:


1. package br.com.curso.modelo; 1. package br.com.curso.modelo;
2. 2.
3. public class Veiculo { 3. public class Pessoa {
4. 4.
5. private String placa; 5. private String nome;
6. private int ano; 6. private String cpf;
7. private String chassi; 7. private String rg;
8. 8.
9. private Pessoa proprietario; 9. //getters e setters
10. private TipoCombustivel tipoCombustivel; 10. }
11. private Cor cor;
12.
13. //getters e setters
14. }
46
Imports
• Para utilizar classes de outros pacotes, deve-se
usar o comando import
• O comando import deve aparecer antes da
definição da classe e após o pacote

47
Imports
No exemplo abaixo, a classe Produto “importa” a classe
java.math.BigDecimal:
1. package br.com.curso.modelo;
2.
3. import java.math.BigDecimal;
4.
5. public class Produto {
6.
7. private String nome;
8. private BigDecimal valor;
9.
10. }

48
Imports - pacote java.lang
• As classes do pacote java.lang não precisam ter
imports explicitados.
• A classe String é um exemplo disso:

1. package br.com.curso.modelo;
2.
3. public class Produto {
4.
5. private String nome;
6. }

49
Imports
Ao fazer o import, é possível ainda fazer import não apenas
da classe, mas de todas as classes de um pacote:
1. package br.com.curso.modelo;
2.
3. import java.math.*;
4.
5. public class Produto {
6.
7. private String nome;
8. private BigDecimal valor;
9.
10. }

50
Exercício - Imports
• Criar a classe Produto no pacote br.com.curso.modelo
• Criar o atributo nome do tipo String
• Criar o atributo valor do tipo java.math.BigDecimal
• Criar os getters e setters da classe

1. package br.com.curso.modelo;
2.
3. import java.math.BigDecimal;
4.
5. public class Produto {
6.
7. private String nome;
8. private BigDecimal valor;
9.
10. }

51
Imports - Desempenho
Importante!
Fazer import de um pacote não afeta o desempenho

É mais por questão de legibilidade do código, o import “*” não deixa o


código mais lento. O código abaixo não teria seu desempenho afetado se
fosse java.math.BigDecimal ou java.math.*:
1. package br.com.curso.modelo;
2.
3. import java.math.*;
4.
5. public class Produto {
6.
7. private String nome;
8. private BigDecimal valor;
9.
10. }

52
Exercício de Fixação - Método Main
Quais maneiras abaixo apresentam a sintaxe correta para se criar a um
método “main” em java:
1. public static void main(String[] args) {
a) 2.
3. }
1. public static void main(String... args) {
b) 2.
3. }
1. private static void main(String[] args) {
c) 2.
3. }
1. public static void main(String args[]) {
d) 2.
3. }
1. public static void main(String args) {
e) 2.
3. }

53
Exercício de Fixação - Método Main
Quais maneiras abaixo apresentam a sintaxe correta para se criar a um
método “main” em java:
1. public static void main(String[] args) {
a) 2.
3. }
1. public static void main(String... args) {
b) 2.
3. }
1. private static void main(String[] args) {
c) 2.
3. }
1. public static void main(String args[]) {
d) 2.
3. }
1. public static void main(String args) {
e) 2.
3. }

54
Exercício de Fixação - Classes
Quais maneiras abaixo não apresentam erro de compilação ao se criar a
classe Pessoa.java?
1. public class Pessoa {
a) 2.
3. }
1. void class Pessoa {
b) 2.
3. }
1. private class Pessoa {
c) 2.
3. }
1. default class Pessoa {
d) 2.
3. }
1. class Pessoa {
e) 2.
3. }

55
Exercício de Fixação - Classes
Quais maneiras abaixo não apresentam erro de compilação ao se criar a
classe Pessoa.java?
1. public class Pessoa {
a) 2.
3. }
1. void class Pessoa {
b) 2.
3. }
1. private class Pessoa {
c) 2.
3. }
1. default class Pessoa {
d) 2.
3. }
1. class Pessoa {
e) 2.
3. }

56
Exercício de Fixação - Atributos
Considerando a classe pessoa:
1. public class Pessoa {
2. }

Para criar o atributo nome do tipo String, quais maneiras abaixo são consideradas
corretas e não apresentariam erro de compilação?

a) 1. private string nome;

b) 1. private String nome;

c) 1. void String nome;

d) 1. String nome;

e) 1. private String nome();

57
Exercício de Fixação - Atributos
Considerando a classe pessoa:
1. public class Pessoa {
2. }

Para criar o atributo nome do tipo String, quais maneiras abaixo são consideradas
corretas e não apresentariam erro de compilação?

a) 1. private string nome;

b) 1. private String nome;

c) 1. void String nome;

d) 1. String nome;

e) 1. private String nome();

58
Exercício de Fixação - Construtores
Considerando a classe pessoa:
1. public class Pessoa {
2. private String nome;
3. private String cpf;
4. }

Qual construtor abaixo não é considerado um construtor válido?


1. public Pessoa(String nome, String cpf) {
2. this.nome = nome;
a) 3. this.cpf = cpf;
4. }
1. Pessoa() {
b) 2. }
1. void Pessoa() {
c) 2. }
1. public Pessoa() {
d) 2. }
1. public Pessoa(String nome) {
e) 2. this.nome = nome;
3. }
59
Exercício de Fixação - Construtores
Considerando a classe pessoa:
1. public class Pessoa {
2. private String nome;
3. private String cpf;
4. }

Qual construtor abaixo não é considerado um construtor válido?


1. public Pessoa(String nome, String cpf) {
2. this.nome = nome;
a) 3. this.cpf = cpf;
4. }
1. Pessoa() {
b) 2. }
1. void Pessoa() {
c) 2. }
void é um tipo de retorno e não deve ser usado no construtor

1. public Pessoa() {
d) 2. }
1. public Pessoa(String nome) {
e) 2. this.nome = nome;
3. }
60
Exercício de Fixação - Getters
Considerando a classe pessoa:
1. public class Pessoa {
2. private String nome;
3. private String cpf;
4. }

Seguindo os padrões de nome dos getters e setters, como ficaria um getter válido para
o atributo “nome”?

1. public String getNome() {


a) 2. return nome;
3. }
1. public getNome() {
b) 2. return nome;
3. }
1. public String gettNome() {
c) 2. return nome;
3. }
1. public String getnome() {
d) 2. return nome;
3. }
61
Exercício de Fixação - Getters
Considerando a classe pessoa:
1. public class Pessoa {
2. private String nome;
3. private String cpf;
4. }

Seguindo os padrões de nome dos getters e setters, como ficaria um getter válido para
o atributo “nome”?

1. public String getNome() {


a) 2. return nome;
3. }
1. public getNome() {
b) 2. return nome;
3. }
1. public String gettNome() {
c) 2. return nome;
3. }
1. public String getnome() {
d) 2. return nome;
3. }
62
Exercício de Fixação - Setters
Considerando a classe pessoa:
1. public class Pessoa {
2. private String nome;
3. private String cpf;
4. }

Seguindo os padrões de nome dos getters e setters, como ficaria um setter válido para
o atributo “nome”?

1. public String setNome(String nome) {


a) 2. this.nome = nome;
3. }
1. public void setNome() {
b) 2. this.nome = nome;
3. }
1. public void setNome(String nome) {
c) 2. this.nome = nome;
3. }
1. public void setNome(String nome) {
d) 2. nome = nome;
3. }
63
Exercício de Fixação - Setters
Considerando a classe pessoa:
1. public class Pessoa {
2. private String nome;
3. private String cpf;
4. }

Seguindo os padrões de nome dos getters e setters, como ficaria um setter válido para
o atributo “nome”?

1. public String setNome(String nome) {


a) 2. this.nome = nome;
3. }
1. public void setNome() {
b) 2. this.nome = nome;
3. }
1. public void setNome(String nome) {
c) 2. this.nome = nome;
3. }
1. public void setNome(String nome) {
d) 2. nome = nome;
3. }
64
Atributos Estáticos
• Quando um atributo é estático dizemos que
ele é um atributo de classe e não um atributo
de instância
• Para declarar um atributo estático deve-se
usar a palavra chave static

65
Atributos Estáticos
• A classe Funcionario apresenta um atributo estático:

1. public class Funcionario {


2.
3. public static int atributoEstatico = 5;
4.
5. private String nome;
6.
7. public Funcionario() {
8. }
9.
10. }

• Assim independente da instância, o valor será o mesmo:


1. public static void main(String[] args) {
2.
3. Funcionario funcionario1 = new Funcionario();
4. funcionario1.setNome("Maria");
5.
6. Funcionario funcionario2 = new Funcionario();
7. funcionario2.setNome("Ana");
8.
9. System.out.println(funcionario1.atributoEstatico);
10. System.out.println(funcionario2.atributoEstatico);
11. }
66
Atributos estáticos finais
• A palavra chave final determina que uma variável não pode
ter seu valor alterado
• Em combinação com atributos estáticos, os torna valores
constantes

O atributo estático abaixo é uma constante:


1. public class Funcionario {
2.
3. public final static int ATRIBUTO_ESTATICO = 5;
4.
5. private String nome;
6.
7. public Funcionario() {
8. }
9.
10. }
67
Atributos Estáticos

Importante!
Utilize os nomes de constantes em caixa alta

Por convenção variáveis constantes devem ser declaradas em


caixa alta.

68
Métodos Estáticos
• Quando um método é estático dizemos que
ele é um atributo de classe e não um atributo
de instância
• Assim como os atributos, para tornar um
método estático deve-se usar a palavra chave
static
• Métodos estáticos não conseguem acessar
variáveis não estáticas

69
Métodos Estáticos
O atributo nome se for acessado por um método estático abaixo apresentará
erro de compilação:
1. public class Funcionario {
2.

3. private String nome;


4.

5. public Funcionario() {
6. }
7.

8. public static void main(String[] args) {


9. //erro de compilação
10. nome = "Algum Nome";
11.

12. }
13.

14. }
70
Métodos Estáticos

Métodos estáticos são úteis para métodos utilitários de um programa, como


por exemplo verificar se um CPF é ou não válido:
1. public class ValidadorCPF{
2.

3. public boolean void ehValido(String cpf) {


4. //fazer lógica de validação
5. }
6.

7. }

71

Você também pode gostar