JAVA TÓPICOS ESPECIAIS DE PROGRAMACAO ORIENTADA A OBJETOS

Documentos relacionados
Modificadores de Acesso e Atributos de Classe

Orientação a Objetos Básica

Programação Java Aula 05

OO Orientação a Objetos

Programação Java Aula 03

Java Standard Edition (JSE)

Linguagem de Programação II Implementação

Java Standard Edition (JSE)

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

Modificadores de acesso e atributos de classe

OO - Orientação a Objetos

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

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

Linguagem de Programação III

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

Desenvolvimento OO com Java Modificadores de acesso e atributos de classe

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

Programação Orientada a Objetos. Prof. Diemesleno Souza Carvalho

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Professor Jefferson Chaves Jefferson de Oliveira Chaves


Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Classes e Objetos em Java. Algoritmos e Programação I. Classes. Classes. Modificadores de Acesso. Classes. Revisão

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

Análise de Programação

AULA 13 MÉTODOS. Disciplina: Programação Orientada a Objetos Professora: Alba Lopes

Linguagem de Programação III

ALGORITMOS. Professor: Diego Oliveira. Aula 06 - Tipos Primitivos de Dados

Controlando Erros com Exceções

Orientação a Objetos - Herança

Linguagem de Programação II Implementação

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

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

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

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

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

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

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

Visibilidade e Encapsulamento

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

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

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

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.

Orientação a Objetos parte 2 ENCAPSULAMENTO, CLASSES, HERANÇAS

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

PROGRAMAÇÃO ORIENTADA A OBJETOS JAVA

Unidade Acadêmica: Faculdade de Computação FACOM Disciplina: Programação Orientada a Objetos I Professor: Fabiano Azevedo Dorça Prática 01

PROGRAMAÇÃO I INTRODUÇÃO À ORIENTAÇÃO A OBJETOS

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

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

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

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

Programação Orientada a Objetos

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

Laboratório de programação II

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

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

Programação Orientada a Objeto

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

Classes e Objetos POO

Programação Orientada a Objetos

4 Conceito de Herança

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

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

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

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

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

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

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Exercícios sobre herança e polimorfismo

Construtores e Especificadores de Acesso

Linguagem de Programação IV Introdução

Atributos e Métodos Estáticos

Programação Orientada a Objetos

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

Programação Orientada a Objetos em Java

AULA 15 CONSTRUTORES. Disciplina: Programação Orientada a Objetos Professora: Alba Lopes

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

COMPORTAMENTOS - Observações

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

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

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

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

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

AULA 16 HERANÇA. Disciplina: Programação Orientada a Objetos Professora: Alba Lopes

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

AULA 2 VISÃO BÁSICA DE CLASSES EM PHP

5 Arrays. 5.1 Criando um array. 5.2 Inicializando arrays. c:\>java Array Janeiro tem 31 dias.

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

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

Linguagem de Programação III

Classes, instâncias e métodos de acesso. prática

Array em Java. Figura 1 - Exemplo de um array de inteiros


Transcrição:

JAVA TÓPICOS ESPECIAIS DE PROGRAMACAO ORIENTADA A OBJETOS LABORATÓRIO 2 PROF. EMILIO PARMEGIANI

Neste laboratório trabalharemos com conceitos de orientação a objetos, através da criação de classes, propriedades, métodos, assim como aplicando herança e outros conceitos da linguagem. Vamos imaginar um sistema para um banco. Crie um novo projeto do tipo Java na IDE Eclipse com o nome SistemaBancário. Dentro do nosso sistema, um dos objetos mais importantes desse tipo de sistema é a conta. Quais as propriedades que toda conta possui e é importante para nós? Número da conta Nome do dono da conta Saldo Limite O que toda conta faz (O que gostaríamos de pedir para a conta)? Saca uma determinada quantidade Deposita uma determinada quantidade Imprime o nome do dono da conta Devolve o saldo atual Transfere uma quantidade de uma conta para outra contra Devolve o tipo de conta

Uma vez que identificamos estas propriedades, poderíamos fazer a seguinte definição para nossa classe Conta: Conta -numero : int -saldo : double -limite : double -nome : string +saca(entrada valor : double) : bool +deposita(entrada valor : double) Para implementar esta classe, crie um novo objeto do tipo Class, com o tipo de modificador default, como mostrado a seguir:

O nosso modelo de classe quando implementado terá o seguinte código: double saldo; double limite; String nome; boolean saca(double valor) { if (this.saldo < valor) { return false; else { this.saldo = this.saldo - valor; return true; void deposita (double quantidade) { this.saldo += quantidade; Veja que dentro do método saca foi implementada uma lógica que protege nosso sistema de sacar mais do que pode, comparando o valor que se deseja sacar com o saldo da conta. Vamos testar até esse ponto nossa classe Conta. Para isso vamos criar uma classe chamada CaixaEletronico, de onde iremos testar as funcionalidades do nosso sistema. Crie um novo objeto do tipo Class, com o nome CaixaEletronica, com o modificador do tipo public e marque a opção para que seja criado o método main, conforme mostrado a seguir:

Vamos criar duas instâncias da nossa classe conta, uma chamada c1 e outra chamada c2. Em seguida vamos realizar para cada conta algumas operações de saca e deposita e ao final vamos imprimir o saldo de cada conta: public class CaixaEletronica { public static void main(string[] args) { Conta c1 = new Conta(); c1.nome = "João da Silva"; c1.saldo = 100; c1.deposita(200); c1.saca(50); Conta c2 = new Conta(); c2.nome = "Don Pedro Segundo"; c2.saldo = 50000; c2.deposita(5000); c2.saca(3); System.out.println("Conta do senhor:" + c1.nome); System.out.println("Saldo:" + c1.saldo + "\n"); System.out.println("Conta do senhor:" + c2.nome); System.out.println("Saldo:" + c2.saldo + "\n"); O resultado dessa operação será: Conta do senhor:joão da Silva Saldo:250.0 Conta do senhor:don Pedro Segundo Saldo:54997.0 Mas e se o nosso cliente quiser fazer uma transferência de valores entre duas contas? Para isso vamos implementar na nossa classe Conta um método transfere, onde como parâmetro esse método deve receber a conta destino, e o valor que se deseja transferir. Como retorno, nosso método deve responder se a transferência foi ou não bem sucedida. Conta -numero : int -saldo : double -limite : double -nome : string +saca(entrada valor : double) : bool +deposita(entrada valor : double) +transfere(entrada destino : Conta, entrada valor : double) : bool

Para realizar a operação de transferência, vamos utilizar os métodos já implementados. Neste caso, utilizaremos o método saca da conta de origem da transferência, e o método deposita da conta destino. //outras propriedades e métodos... boolean transfere(conta destino, double valor) { boolean retirou = this.saca(valor); if (retirou == false) { // não deu pra sacar! return false; else { destino.deposita(valor); return true; Veja que apenas permitimos realizar o depósito na conta destino, caso a retirada da conta de origem tenha sido exitosa. Vamos testar nossa nova funcionalidade. Vamos transferir R$1000 da conta do senhor Don Pedro para a conta do senhor João: public static void main(string[] args) { Conta c1 = new Conta(); c1.nome = "João da Silva"; c1.saldo = 100; c1.deposita(200); c1.saca(50); Conta c2 = new Conta(); c2.nome = "Don Pedro Segundo"; c2.saldo = 50000; c2.deposita(5000); c2.saca(3); System.out.println("Conta do senhor:" + c1.nome); System.out.println("Saldo:" + c1.saldo + "\n"); System.out.println("Conta do senhor:" + c2.nome); System.out.println("Saldo:" + c2.saldo + "\n"); c2.transfere(c1, 1000); System.out.println("Conta do senhor:" + c1.nome); System.out.println("Saldo:" + c1.saldo + "\n"); System.out.println("Conta do senhor:" + c2.nome); System.out.println("Saldo:" + c2.saldo + "\n");

Veja que ao chamar o método transfere, passamos como conta destino a referência da conta do senhor João, ou seja, c1. Agora imagine que necessitemos incluir mais informações do nosso cliente, como seu endereço e seu CPF. Não seria correto que estes atributos estivessem na classe conta. Portanto neste momento identificamos outro objeto do nosso sistema: Cliente. Cliente -nome : string -endereco : string -cpf : string Vamos agora criar um novo objeto do tipo Class de nome Cliente, com o modificador do tipo default e SEM o método main, e vamos implementar os atributos da nossa nova classe. class Cliente { String nome; String endereco; String CPF; Agora precisamos alterar os atributos da classe Conta para implementar a seguinte relação: Cliente -nome : string -endereco : string -cpf : string Conta -numero : int -saldo : double -limite : double -titular : Cliente +saca(entrada valor : double) : bool +deposita(entrada valor : double) +transfere(entrada destino : Conta, entrada valor : double) : bool * 1 double saldo; double limite; Cliente titular; //métodos...

Veja que aparecerão erros na classe CaixaEletronica, pois o parâmetro nome não existe mais na classe Conta. Agora nome é um parâmetro da classe Cliente, que podemos acessar do parâmetro titular da classe Conta, pois titular é uma variável do tipo Cliente. public class CaixaEletronica { public static void main(string[] args) { Conta c1 = new Conta(); //c1.nome = "João da Silva"; c1.titular.nome = "João da Silva"; c1.titular.endereco = "Av. Brigadeiro Luis Antônio"; c1.titular.cpf = "666.666.666-99"; c1.saldo = 100; c1.deposita(200); c1.saca(50); Conta c2 = new Conta(); //c2.nome = "Don Pedro Segundo"; c2.titular.nome = "Don Pedro Segundo"; c2.titular.endereco = " Parque da Independência"; c2.titular.cpf = "000.000.000-01"; c2.saldo = 50000; Porém ao executar o novo código, você perceberá que será lançado o seguinte erro: Exception in thread "main" java.lang.nullpointerexception at CaixaEletronica.main(CaixaEletronica.java:8) Veja que o erro significa que encontrou um objeto nulo (NullPointer) e acontece na classe CaixaEletronica, na linha onde atribuímos o nome ao titular da conta. Isso ocorre porque criamos uma nova classe Conta ( new Conta() ), porém não criamos uma nova classe Cliente para ser o titular da conta. Para isso alterar a classe Conta, para que ao instanciar o objeto titular como sendo Cliente, também realizaremos a inicialização desta classe: double saldo; double limite; Cliente titular = new Cliente();. Dessa forma sempre que iniciamos uma nova classe Conta, automaticamente será inicializada uma nova classe Cliente. Isso soluciona o problema, mas não seria estranho, em algum momento, termos uma Conta com um Cliente nulo? Temos que lembrar que ao criar uma nova classe Cliente, não estamos atribuindo valores a seus atributos. Sendo assim temos que encontrar uma forma de obrigar ao programador ao criar uma classe Conta, fornecer uma classe Cliente. Para isso utilizaremos um construtor:

private double saldo; private double limite; Cliente titular; public Conta (Cliente cliente) { this.titular = cliente; Por fim alteramos a classe CaixaEletronica para criar os objetos Cliente, atribuir valores e passá-los como parâmetro dos construtores das classes Conta: public class CaixaEletronica { public static void main(string[] args) { Cliente cli1 = new Cliente(); cli1.nome = "João da Silva"; cli1.endereco = "Av. Brigadeiro Luis Antônio"; cli1.cpf = "666.666.666-99"; //Passando cli1 como parâmetro do construtor de Conta Conta c1 = new Conta(cli1);.. Agora vamos tratar do limite da conta do nosso usuário. Precisamos validar que ao sacar um valor da conta, que o valor seja inferior ao saldo mais o limite. Poderíamos implementar esta lógica ao chamar o método saca, porém teríamos que implementar em todos os momentso onde chamemos o método. Portanto o correto é implementar esta validação dentro do próprio método saca : double saldo; double limite; Cliente titular = new Cliente(); boolean saca(double valor) { if (valor > this.saldo + limite) { System.out.println("Saldo insuficiente!"); return false; else { this.saldo = this.saldo - valor; return true; //Demais métodos... Porém ainda temos um outro problema. Não podemos garantir que todas as operações sejam realizadas com os métodos da classe Conta (saca, deposita, transfere). Algum programador

poderia acessar diretamente as propriedades saldo e limite para definir novos valores para as mesmas. Sendo assim temos que proteger essas variáveis e vamos encapsular seus acessos através de métodos Getter e Setter. Para isso, vamos atribuir a essas propriedades um modificador de acesso (ou modificador de visibilidade). Vamos defini-las como sendo private. private double saldo; private double limite; Cliente titular; Para gerar os métodos de encapsulamento para estes atributos, utilizaremos uma ferramenta da IDE Eclipse. Clique com o botão direito do mouse sobre a classe Conta, selecione Source e selecione a opção Generate Getters and Setters... Selecione as variáveis limite e saldo, de forma que fiquem marcados para gerar tanto os métodos get quanto set:

Ao final da classe Conta serão criados os respectivos métodos: private double saldo; private double limite; Cliente titular; public double getsaldo() { return saldo; public void setsaldo(double saldo) { this.saldo = saldo; public double getlimite() { return limite; public void setlimite(double limite) { this.limite = limite; Agora não esqueça de alterar a classe main, para atribuir e resgatar esses valores através dos métodos Getter e Setter: //Passando cli1 como parâmetro do construtor de Conta Conta c1 = new Conta(cli1); c1.setsaldo(100); c1.setlimite(0); System.out.println("Conta do senhor:" + c1.titular.nome); System.out.println("Saldo:" + c1.getsaldo() + "\n"); Agora nosso Gerente de Projetos solicitou que o sistema seja capaz de controlar a quantidade de contas existentes em nosso sistema. Parece ser muito fácil, não é mesmo? Basta criar uma variável do tipo int que armazena a quantidade de contas: Conta c = new Conta(); totaldecontas = totaldecontas + 1; Porém quem irá garantir que todas as vezes que algum programador criar uma nova classe Conta, ele irá incrementar 1 em nossa variável?

Ok! E se criarmos essa variável dentro da classe Conta e todas as vezes que for criada uma nova classe (executado seu construtor), realizarmos o incremento? private double saldo; private double limite; Cliente titular; private int totaldecontas; public Conta (Cliente cliente) { this.totaldecontas ++; this.titular = cliente; public int gettotaldecontas() { return totaldecontas; Obs.: Veja que utilizamos encapsulamento para a variável totaldecontas e você nem percebeu!!! Aparentemente o problema foi solucionado. Vamos testar? public class CaixaEletronica { public static void main(string[] args) { Conta c1 = new Conta(new Cliente()); System.out.println("Total de Contas:" + c1.gettotaldecontas()); Conta c2 = new Conta(new Cliente()); System.out.println("Total de Contas:" + c2.gettotaldecontas()); A saída desse programa será: Total de Contas:1 Total de Contas:1 Isso acontece porque quando criamos as instâncias da classe Conta, cada uma possui sua própria variável totaldecontas. Não existe uma comunicação entre essas variáveis. Precisamos que essa variável seja única, ou seja, compartilhada por todos os objetos dessa classe. Para isso podemos utilizar o modificador de acesso static. private static int totaldecontas; Quando declaramos um atributo como static, ele passa a não ser mais um atributo de cada objeto, e sim um atributo da classe, a informação fica guardada pela classe, não é mais individual para cada objeto.

Para acessarmos um atributo estático, não usamos a palavra chave this, mas sim o nome da classe: private double saldo; private double limite; Cliente titular; private static int totaldecontas; public Conta (Cliente cliente) { Conta.totalDeContas ++; this.titular = cliente; public int gettotaldecontas() { return totaldecontas; Agora imagine a seguinte situação. Seu companheiro de programação está trabalhando numa tela do sistema onde necessite exibir a quantidade de contas. Para isso, ele precisaria criar uma classe Conta, para acessar o método gettotaldecontas(). Porém ao realizar isso, ele estaria incrementando 1 à quantidade de contas, e não queremos que isso aconteça. Para resolver esse problema, faremos a mesma coisa que fizemos com a variável, transformar esse método de um método de objeto, para um método de classe, através da nossa palavra mágica static. private double saldo; private double limite; Cliente titular; private static int totaldecontas; public Conta (Cliente cliente) { Conta.totalDeContas ++; this.titular = cliente; public static int gettotaldecontas() { return totaldecontas;

Agora podemos acessar o método não pelo objeto, mas pela classe: public class CaixaEletronica { public static void main(string[] args) { Conta c1 = new Conta(new Cliente()); Conta c2 = new Conta(new Cliente()); System.out.println("Total de Contas:" + Conta.getTotalDeContas()); Conta c3 = new Conta(new Cliente()); System.out.println("Total de Contas:" + Conta.getTotalDeContas());