Desenvolvimento OO com Java Modificadores de acesso e atributos de classe

Documentos relacionados
[Desenvolvimento OO com Java] Modificadores de acesso e atributos de classe

[Desenvolvimento OO com Java] Orientação a objetos básica

Desenvolvimento OO com Java Um pouco de vetores

Modificadores de Acesso e Atributos de Classe

[Desenvolvimento OO com Java] Orientação a objetos básica

Desenvolvimento OO com Java Organizando suas classes

Orientação a Objetos Básica

Membros estáticos e Pacotes

JAVA TÓPICOS ESPECIAIS DE PROGRAMACAO ORIENTADA A OBJETOS

Linguagem de Programação II Implementação

Desenvolvimento OO com Java Orientação a objetos básica

Programação Java Aula 05

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

OO Orientação a Objetos

Construtores e Especificadores de Acesso

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

[Desenvolvimento OO com Java] Organizando suas classes

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Aula 08 Encapsulamento. Disciplina: Programação Estruturada e Orientada a Objetos Prof. Bruno Gomes

Desenvolvimento OO com Java Classes abstratas e interfaces

Dados armazenados em um objeto podem ser tanto primitivos, tais como inteiros ou caracteres, ou referências para outros objetos.

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

Tema da aula Introdução ao paradigma de programação: Orientado a Objetos

Java Standard Edition (JSE)

Classes e Objetos. Prof. Fernando V. Paulovich 9 de agosto de 2010

Desenvolvimento OO com Java 4 Classes e Objetos

Orientação a Objetos - Herança

Programação Java. - Classes, Objetos, Atributos e Métodos - Marco Fagundes Marco Fagundes -

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Encapsulamento. Alberto Costa Neto DComp - UFS

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Introdução. Atributos em Java. Atributos. Acesso à atributos em Java. Atributo versus variável. Atributos, métodos e encapsulamento.

Introdução à Orientação a Objetos em Java

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Programação Java Aula 03

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

5 Reuso de Classes. Desenvolvimento OO com Java. Vítor E. Silva Souza

Programação Orientada a Objetos

OO - Orientação a Objetos

Java Standard Edition (JSE)

Linguagem de Programação III

p Ja usamos, por diversas vezes, a classe String. Vimos o sistema de pacotes do Java e nunca precisamos dar um import nessa classe.

Introdução à Programação. Encapsulamento e Herança

Classes e Objetos. Sintaxe de classe em Java

Desenvolvimento OO com Java Herança, reescrita e polimorfismo

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS - ORIENTAÇÃO A OBJETOS

Programação Orientada a Objetos Classes Abstratas. Sérgio Soares

Modificadores de acesso e atributos de classe

[Desenvolvimento OO com Java] Classes abstratas e interfaces

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Estrutura de Dados Funções e Procedimentos

Modificadores de Acesso JAVA

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Classes e Objetos POO

[Desenvolvimento OO com Java] Exceções e controle de erros

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Interfaces POO. Prof. Marcio Delamaro

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

JAVA. Professor: Bruno Toledo

Herança (parte 2) Redefinição de métodos AULA 11

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

PROGRAMAÇÃO ORIENTADA A OBJETOS JAVA

Conceitos Básicos de Orientação a Objetos e Strings AULA 08

Análise de Programação

Linguagem de Programação IV Introdução

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Professor Jefferson Chaves Jefferson de Oliveira Chaves

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Paradigmas de Linguagens de Programação. Tipos de Dados Abstratos

Programação Orientada a Objetos

1 Introdução e Conceitos básicos

Sabemos que a classe é responsável por definir a estrutura e o comportamento de seus objetos. Portanto, os objetos são instâncias das classes.

Programação Estruturada e Orientada a Objetos. Objetos e Métodos

Linguagem de Programação II Implementação

Linguagem de Programação II Programação Orientada a Objetos. Orientação a Objetos

Métodos em Java. Prof. Esp. André Aparecido da Silva (Aulas 31 a 33) Disponível em:

Programação Orientada a Objetos (utilizando C#) Professor Emiliano S. Monteiro Versão 12 Out/2016.

Programação Orientada a Objetos em Java

Programação Orientada a Objetos

Linguagem de Programação II Importando Classes/Pacotes

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Computação II Orientação a Objetos

Programação Orientada a Objetos II

PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Programação por Objectos. Java

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Unidade 7: Documentação de Código A Importância dos Comentários Prof. Daniel Caetano

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Palavras Reservadas da Linguagem Java

Instituto de Informática Estrutura de Dados II

Linguagem de Programação Orientada a Objeto Construtores e Sobrecarga

Classe Abstrata e Interface

Transcrição:

Desenvolvimento OO com Java Modificadores de acesso e atributos de classe Vítor E. Silva Souza (vitor.souza@ufes.br) http://www.inf.ufes.br/~vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo

Licença para uso e distribuição Este obra está licenciada com uma licença Creative CommonsAtribuição-CompartilhaIgual4.0 Internacional; Você tem o direito de: Compartilhar: copiar e redistribuir o material em qualquer suporte ou formato Adaptar: remixar, transformar, e criar a partir do material para qualquer fim, mesmo que comercial. De acordo com os termos seguintes: Atribuição: você deve dar o crédito apropriado, prover um link para a licença e indicar se mudanças foram feitas. Você deve fazê-lo em qualquer circunstância razoável, mas de maneira alguma que sugira ao licenciante a apoiar você ou o seu uso; CompartilhaIgual: se você remixar, transformar, ou criar a partir do material, tem de distribuir as suas contribuições sob a mesma licença que o original. Mais informações podem ser encontradas em: http://creativecommons.org/licenses/by-sa/4.0/ Abril 2016 OO & Java - Modif. de acesso e atributos de classe 2

Conteúdo do curso O que é Java; Variáveis primitivas e controle de fluxo; Orientação a objetos básica; Um pouco de vetores; Modificadores de acesso e atributos de classe; Herança, reescrita e polimorfismo; Classes abstratas; Interfaces; Exceções e controle de erros; Utilitários da API Java. Estes slides foram baseados na apostila do curso FJ-11: Java e Orientação a Objetos da Caelum e na apostila Programação Orientada a Objetos em Java do prof. Flávio Miguel Varejão. Abril 2016 OO & Java - Modif. de acesso e atributos de classe 3

Questão de responsabilidade (de novo!) Imagine um sistema... Dezenas de formulários; CPFs são validados função validar(cpf) deve ser chamada em cada formulário; Todos os desenvolvedores são responsáveis! Sem problemas! Define-se a classe Pessoa com o atributo cpf e o método validar()! E aí o desenvolvedor foi lá e Pessoa p = new Pessoa(); p.cpf = "321.654.987-00"; // Cadê a validação? Abril 2016 OO & Java - Modif. de acesso e atributos de classe 4

Regras de negócio Para uma conta corrente: class Conta { int numero; String dono; double saldo; double limite; //... RN1: quando negativo, o valor absoluto do saldo não pode ser superior ao do limite. Abril 2016 OO & Java - Modif. de acesso e atributos de classe 5

Implementando a regra de negócio class Conta { // Restante da classe... void sacar(double qtd) { double novosaldo = this.saldo - qtd; this.saldo = novosaldo; public class TesteConta { public static void main(string[] args) { Conta c = new Conta(); c.saldo = 1000.0; c.limite = 1000.0; c.sacar(5000); // Vai gerar inconsistência! Abril 2016 OO & Java - Modif. de acesso e atributos de classe 6

Implementando a regra de negócio public class TesteConta { public static void main(string[] args) { Conta c = new Conta(); c.saldo = 1000.0; c.limite = 1000.0; // Vamos verificar antes de sacar... double valorasacar = 5000.0; if (valorasacar < c.saldo + c.limite) c.sacar(valorasacar); A responsabilidade está com a classe certa? Abril 2016 OO & Java - Modif. de acesso e atributos de classe 7

Implementando a regra de negócio boolean sacar(double qtd) { double novosaldo = this.saldo - qtd; if (novosaldo >= -limite) { this.saldo = novosaldo; return true; else return false; Conta c = new Conta(); c.saldo = 1000.0; c.limite = 1000.0; Conta TesteConta // Agora sim! if (c.sacar(5000)) System.out.println("Consegui"); else System.out.println("Não deu..."); c.saldo = -3000.0; // Só que não... Abril 2016 OO & Java - Modif. de acesso e atributos de classe 8

Falta encapsulamento... Permitir o acesso direto aos atributos: Exige disciplina dos clientes da classe Conta; Pode levar a inconsistências; Solução: impedir o acesso externo ao atributo: Atributo privativo; Externo = qualquer outra clase, exceto a proprietária do atributo (ex.: Conta para o atributo saldo). Vantagens: Objetos trocam mensagens com base em contratos; Modificaçõesnaimplementação não afetam clientes (ex.: adicionar CPMF nos saques de conta-corrente). Abril 2016 OO & Java - Modif. de acesso e atributos de classe 9

Encapsulamento Usamos objetos sem saber seu funcionamento interno; Assim também deve ser em nossos sistemas OO: Maior manutenibilidade; Maior reusabilidade. Abril 2016 OO & Java - Modif. de acesso e atributos de classe 10

Implementando o encapsulamento class Conta { private int numero; private String dono; private double saldo; private double limite; public boolean sacar(double qtd) { //... //... Modificador de acesso / visibilidade! Abril 2016 OO & Java - Modif. de acesso e atributos de classe 11

Modificadores de acesso Determinam a visibilidade de um determinado membro da classe com relação a outras classes; Há quatro níveis de acesso: Público (public); Privado/privativo (private); Protegido (protected); Amigo ou privativo ao pacote (friendly ou packageprivate). Regra de bolso do encapsulamento: atributos são privativos, métodos são públicos. Regra de bolso das regras: toda regra tem suas exceções Abril 2016 OO & Java - Modif. de acesso e atributos de classe 12

Palavras-chave Três palavras-chave especificam o acesso: public private protected O nível de acesso package-private é determinado pela ausência de especificador; Devem ser usadas antes do nome do membro que querem especificar; Não podem ser usadas em conjunto. Abril 2016 OO & Java - Modif. de acesso e atributos de classe 13

Modificadores de acesso Acesso Público Protegido Amigo Privado A própria classe Sim Sim Sim Sim Classe no mesmo pacote Sim Sim Sim Não Subclasse em pacote diferente Sim Sim Não Não Não-subclasse em pacote diferente Sim Não Não Não Abril 2016 OO & Java - Modif. de acesso e atributos de classe 14

Testando o encapsulamento class Conta { //... private double saldo; Conta public boolean sacar(double qtd) { //... Conta c = new Conta(); c.depositar(1000.0); c.saldo = -3000.0; TesteConta // Não compila! // error: saldo has private access in Conta // c.saldo = -3000.0; // ^ Abril 2016 OO & Java - Modif. de acesso e atributos de classe 15

Separando interface e implementação Em OO é fundamental o ocultamento de informação: Estrutura interna fica inacessível; Interface do objeto é pública. O que é uma pilha? Uma lista? Um vetor? Uma estrutura que me permite empilhar e desempilhar itens? Abril 2016 OO & Java - Modif. de acesso e atributos de classe 16

Ocultamento de informações import java.util.*; class Pilha { private Vector elems; public Pilha() { elems = new Vector(10, 10); public void empilha(object obj) { elems.add(obj); public Object desempilha() { Object obj = elems.get(elems.size() - 1); elems.remove(elems.size() - 1); return obj; Abril 2016 OO & Java - Modif. de acesso e atributos de classe 17

Mudando a implementação import java.util.*; class Pilha { private LinkedList elems; public Pilha() { elems = new LinkedList(); public void empilha(object obj) { elems.addfirst(obj); public Object desempilha() { return elems.removefirst(); Programe para interfaces, não para implementações! (Design Patterns, de Eric Gamma et al.) Abril 2016 OO & Java - Modif. de acesso e atributos de classe 18

O exemplo do CPF class Cliente { private String nome; private String endereco; private String cpf; private int idade; public void mudacpf(string cpf) { validacpf(cpf); this.cpf = cpf; private void validacpf(string cpf) { // série de regras aqui, falha caso não seja válido //... E se um dia eu não precisar mais validar CPF para pessoas com idade acima de 60 anos? Abril 2016 OO & Java - Modif. de acesso e atributos de classe 19

Mas e se eu precisar acessar um atributo? Basta usar um método para isso! class Conta { int numero; String dono; double saldo; double limite; public double versaldo() { return saldo; public void alterarlimite(double limite) { this.limite = limite; //... Abril 2016 OO & Java - Modif. de acesso e atributos de classe 20

POJOs (o Bom e Velho Objeto Java) Atributos devem ser privativos; Se precisarem ser lidos ou alterados, prover métodos get/set (para booleanos, pode-se usar o prefixo is): public class Cliente { //... private String nome; public String getnome() { return nome; public void setnome(string nome) { this.nome = nome; IDEs geram esses métodos automaticamente. Abril 2016 OO & Java - Modif. de acesso e atributos de classe 21

Planeje bema interface da classe É importante observar que: O método getatr() não tem que necessariamente retornar apenas o atributo atr; Não crie automaticamente métodos get/set para todos osatributos! Para alguns não fazsentido // O limite faz parte do saldo (só que cobra juros)! public double getsaldo() { return saldo + limite; // Não há método para mudar o saldo. Tem que sacar() // public void setsaldo(double saldo) Sugestão de leitura: http://blog.caelum.com.br/nao-aprender-oo-getters-e-setters/ Abril 2016 OO & Java - Modif. de acesso e atributos de classe 22

Inicialização Neologismo criado para indicar tarefas que devem ser efetuadas ao iniciarmos algo; Quando criamos objetos, podemos querer inicializá-lo com alguns valores; Poderíamos criar um método para isso: class Aleatorio { private int numero; public void inicializar() { Random rand = new Random(); numero = rand.nextint(20); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 23

Construtores Problema do método inicializar(): podemos esquecer de chamá-lo! Por isso, Java provê o mecanismo de construtores: São chamados automaticamente pelo Java quando um objeto novo é criado; Construtores não tem valor de retorno e possuem o mesmo nome da classe. new construtor Abril 2016 OO & Java - Modif. de acesso e atributos de classe 24

Construtores Quando um novo objeto é criado: 1. é alocada memória para o objeto; 2. o construtor é chamado. class Aleatorio { private int numero; public Aleatorio() { Random rand = new Random(); numero = rand.nextint(20); public class Teste { public static void main(string[] args) { Aleatorio aleat = new Aleatorio(); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 25

Construtores podem ter argumentos Se definidos argumentos, devem ser passados na criação do objeto com new: class Aleatorio { private int numero; public Aleatorio(int max) { Random rand = new Random(); numero = rand.nextint(max); public class Teste { public static void main(string[] args) { Aleatorio aleat1 = new Aleatorio(20); Aleatorio aleat2 = new Aleatorio(50); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 26

Pode haver múltiplos construtores Nossas classes podem ter quantos construtores quisermos (com argumentos diferentes): class Aleatorio { private int numero; public Aleatorio() { Random rand = new Random(); numero = rand.nextint(20); public Aleatorio(int max) { Random rand = new Random(); numero = rand.nextint(max); public class Teste { public static void main(string[] args) { Aleatorio aleat1 = new Aleatorio(); Aleatorio aleat2 = new Aleatorio(50); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 27

Construtor default Quando não especificamos construtores, Java provê um construtor default para nossa classe: Toda classe precisa de um construtor; Sem parâmetros e sem implementação. Quando especificamos construtores, o construtor default não é provido automaticamente: Se você escreveu um construtor, Java assume que você sabe o que está fazendo e não provê um; Chamar o construtor sem o parâmetro gera erro se ele não for definido explicitamente. Isso é bom! Mas por que? (Apostila Caelum, sec. 6.5) Abril 2016 OO & Java - Modif. de acesso e atributos de classe 28

Construtores chamando construtores Seria interessante não haver duplicação de código: class Aleatorio { private int numero; public Aleatorio() { Random rand = new Random(); numero = rand.nextint(20); public Aleatorio(int max) { Random rand = new Random(); numero = rand.nextint(max); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 29

Construtores chamando construtores Usamos novamente a palavra-chave this, com outro significado: chamar outro construtor: class Aleatorio { private int numero; public Aleatorio() { // Chama o outro construtor com argumento 20. this(20); public Aleatorio(int max) { Random rand = new Random(); numero = rand.nextint(max); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 30

Construtores chamando construtores A chamada this(): Deve especificar os argumentos do construtor a ser chamado; Deve ser a primeira linha do construtor que a utiliza; Não pode ser usada fora de construtores. Depois que o objeto foi construído, não é mais possível chamar o construtor para ele. Abril 2016 OO & Java - Modif. de acesso e atributos de classe 31

O padrão JavaBean Abril 2016 OO & Java - Modif. de acesso e atributos de classe 32

Desenvolvimento OO com Java Modific. de acesso e atributos de classe ATRIBUTOS DE CLASSE Abril 2016 OO & Java - Modif. de acesso e atributos de classe 33

Atributos independentes de objetos Vimos até agora que atributos pertencem aos objetos: Não se faz nada sem antes criar um objeto (new)! No entanto, há situações que você quer usá-los sem ter que criar objetos: public class TesteConta { public static void main(string[] args) { int qtdcontas = 0; Conta c1 = new Conta(); qtdcontas++; Conta c2 = new Conta(); qtdcontas++; //... A responsabilidade está com a classe certa? Abril 2016 OO & Java - Modif. de acesso e atributos de classe 34

Atributos independentes de objetos Se acertamos a responsabilidade, voltamos a depender de um objeto para usar o atributo: class Conta { //... public int qtdcontas = 0; public Conta() { qtdcontas++; // Outras inicializações... Conta c1 = new Conta(); Conta c2 = new Conta(); TesteConta // Quantas contas foram criadas? System.out.println(c2.qtdContas); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 35

Atributos static Usando a palavra-chave static você define um atributo de classe ( estático ): Pertence à classe como um todo; Pode-se acessá-los mesmo sem ter criado um objeto; Objetos podem acessá-los como se fosse um membro de objeto, só que compartilhado. class Conta { //... public static int qtdcontas = 0; public Conta() { qtdcontas++; // Outras inicializações... Abril 2016 OO & Java - Modif. de acesso e atributos de classe 36

Acesso a atributos static Não precisamos mais de um objeto pra acessar: public class TesteConta { public static void main(string[] args) { Conta c1 = new Conta(); Conta c2 = new Conta(); System.out.println(Conta.qtdContas); //... O atributo é da classe. A visibilidade está certa? Abril 2016 OO & Java - Modif. de acesso e atributos de classe 37

Acesso a atributos static Se acertamos a visibilidade do atributo, precisamos então de um método para acessá-lo: class Conta { //... private static int qtdcontas = 0; public Conta() { qtdcontas++; // Outras inicializações... public int getqtdcontas() { return qtdcontas; Mas não sendo static, vou precisar de um objeto pra acessar o atributo de novo!?! Abril 2016 OO & Java - Modif. de acesso e atributos de classe 38

Métodos static Métodos também podem ser static: class Conta { //... private static int qtdcontas = 0; public Conta() { qtdcontas++; /*... */ public static int getqtdcontas() { return qtdcontas; Conta c1 = new Conta(); Conta c2 = new Conta(); TesteConta // Quantas contas foram criadas? System.out.println(Conta.getQtdContas()); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 39

Armazenamento em memória Classe Conta qtdcontas = 2 sacar() depositar() meusonho minhaconta saldo = 1_000_000_000 saldo = 1_000 Março 2016 OO & Java - Orientação a objetos básica 40

Contexto static Métodos static não podem acessar membros não-static: public class Teste { private int atributo; private int atributostatic; public void metodo() { public static void metodostatic() { public static void main(string[] args) { //... System.out.println(atributoStatic); System.out.println(Teste.atributoStatic); metodostatic(); Teste.metodoStatic(); // Continua... Abril 2016 OO & Java - Modif. de acesso e atributos de classe 41

Contexto static // Não pode: // System.out.println(atributo); // System.out.println(Teste.atributo); // metodo(); // Teste.metodo(); // Preciso de um objeto: Teste t = new Teste(); System.out.println(t.atributo); t.metodo(); Abril 2016 OO & Java - Modif. de acesso e atributos de classe 42

Cuidado com o static Membros estáticos são como variáveis/funções globais; São mais procedurais do que orientados a objetos; No entanto, em alguns casos são necessários Abril 2016 OO & Java - Modif. de acesso e atributos de classe 43

Exercitar é fundamental Apostila FJ-11 da Caelum: Seção 6.8, página 81 (class Funcionario); Seção 6.9, página 83 (desafios). Abril 2016 OO & Java - Modif. de acesso e atributos de classe 44

http://nemo.inf.ufes.br/