Programação com OO Acesso em Java a BD Curso: Técnico em Informática Campus: Ipanguaçu José Maria Monteiro Pontifícia Universidade Católica do Rio de Janeiro PUC-Rio Departamento Clayton Maciel de Informática Costa clayton.maciel@ifrn.edu.br monteiro@inf.puc-rio.brrio.br Programação com Acesso a BD Aqueles que não conseguem captar novas idéias ficam com medo delas ou as ignoram. David F. Hinnant 1
Programação com Acesso a BD Unidade III: Objetos, Classes e Encapsulamento O paradigma de orientação a objetos consiste basicamente em organizar o software como uma coleção de objetos que incorporam a estrutura de dados e o comportamento; Orientação a objetos contrasta com a programação convencional, na qual a estrutura de dados e o comportamento são fracamente conectados; Foco nos dados (objetos) do sistema, não nas funções; O comportamento muda mais que a estrutura de dados; 2
Objetos Um objeto é qualquer coisa, real ou abstrata, na qual nós armazenamos dados e as operações que manipulam os dados [ Martin ]; Um objeto ou uma instância é uma abstração de alguma coisa no domínio do problema, refletindo as capacidades do sistema de manter informações sobre ele, interagir com ele, ou ambos, um encapsulamento de valores de atributos e seus serviços exclusivos [ Yourdon ]; Objetos 3
Objetos Um objeto é um ente independente, composto por: Estado Interno: uma memória interna em que valores podem ser armazenados e modificados ao longo da vida do objeto (conjunto de atributos ou variáveis de instância). Comportamento: conjunto de ações prédefinidas (denominadas métodos) através das quais o objeto responderá a demanda de processamento por parte de outros objetos; Objetos numero saldo credito(int v) debito(int v) getsaldo() OBJETO CONTA 4
Objetos Passagem de Mensagem M3(); M3 M2 Obj 1 M1 M4 M2 M3 Obj 2 M1 M4 M2 Obj 3 M3 M4; M1 M4 credito(20) credito Crédito credito saldo numero Saldo Número 875,32 21.342-7 875,32 21.342-7 saldo 895,32 numero 21.342-7 debito Débito debito ESTADOS DO OBJETO CONTA 5
Objetos Um objeto possui: Identidade: É uma propriedade imutável e permanente que distingue um objeto de outros, independentemente de seu estado interno, e que não é perdida pelo objeto ao longo de toda a sua vida; M3 M2 Obj 1 M1 M4 Classes Classe é o agrupamento de objetos com a mesma estrutura de dados (atributos) e comportamento (operações) [ Rumbaugh ]; Classe é uma coleção de um ou mais objetos com um conjunto uniforme de atributos e serviços, incluindo uma descrição de como criar novos objetos na classe [ Yourdon ]; Descreve um conjunto infinito de objetos; Cada objeto é dito ser uma instância de uma classe; 6
Classes Classes 7
Representação de uma classe Conta saldo : double numero: int data : date credito(double) : debito(double) : Classes X Objetos Cada instância da classe tem seus próprios valores para cada atributo, mas compartilham as operações com outras instâncias da classe; Em programação orientada a objetos, os termos principais têm a seguinte correspondência aproximada com termos tradicionais de programação: classe -> tipo objeto -> variável de um tipo método -> procedimento ou função mensagem -> chamada de procedimento 8
Relacionamentos Entre Classes; Entre Classe e Objeto; Entre Objetos; Relacionamentos Entre Classes; GENERALIZAÇÃO / ESPECIALIZAÇÃO (É-UM-TIPO-DE)... METACLASSE... 9
Generalização X Especialização Impressora Matricial Laser Jato de Tinta Metaclasse 10
Relacionamentos Entre Classe e Objeto; UM OBJETO É INSTÂNCIA DE UMA CLASSE Relacionamentos Entre Objetos; UTILIZAÇÃO... Apartamento AGREGAÇÃO OU COMPOSIÇÃO Sala Cozinha Banheiro Quarto ASSOCIAÇÃO... 11
Utilização M3 M2 Obj 1 M1 M4 M3(); M2 M1 Obj 2 M3 M4 Composição Apartamento Sala Cozinha Banheiro Quarto 12
Associação Pessoa Empregado Empregador Trabalha para Empresa Sintaxe de uma classe [public] class <nome da classe> [ extends <classe pai> ] [ implements <interface1>,..., <interfacen> ] { [ public/protected/private] [ final ] [ static ] <DADOS> [ public/protected/private] [ final ] [ static ] [abstract ] <MÉTODOS> 13
Classe de Contas em Java Nome da classe. class Conta { String numero; Atributos. double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; Métodos. Criando Instâncias DECLARAÇÃO: < ID-CLASSE > < LISTA-ID >; CRIAÇÃO: < ID > = new < ID-CLASSE > ( < ARGS > ); DECLARAÇÃO E CRIAÇÃO JUNTAS: < ID-CLASSE > < ID > = new < ID-CLASSE > ( < ARGS > ); 14
Programa que cria e manipula uma conta class CriaConta { /** Criando um objeto do tipo Conta */ public static void main (String [] args) { Conta conta1 = new Conta (); conta1.numero = 21.342-7 ; conta1.saldo = 0; Criação de um objeto da classe conta. Acessando os atributos do objeto conta1. conta1.credito (500.87); conta1.debito (45.00); System.out.println(conta1.saldo); Utilizando os métodos do objeto conta1. Acessando os dados de um objeto... conta1.numero = 21.342-7 ;... Identificador. Nome do atributo. Ponto. 15
Utilizando métodos de um objeto... conta1.credito (500.87);... Identificador. Nome do método. Ponto. Classe Circle Nome da classe. class Circle { Atributos. double x, y, r; double circunferencia () {return 2 * 3.14159 * r; double area () {return 3.14159 * r * r; Métodos. 16
Acessando os dados de um objeto Circle c = new Circle( ); c.x = 2.0; c.y = 2.0; c.r = 1.0; Utilizando métodos de um objeto Circle c = new Circle( ); double a; c.r = 2.5; a = c.area( ); Definindo Construtores Construtores são métodos especiais chamados pelo sistema no momento da criação de um objeto; Servem para inicializar objetos de forma organizada; Devem ter o mesmo nome da respectiva classe; Não possuem valor de retorno; Pode haver mais de um construtor por classe (overloading ou sobrecarga de métodos); 17
Exemplo de Construtores class Conta { String numero; double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; Conta (String n) {numero = n; saldo = 0; Método Construtor. Criando Objetos com Construtores... Conta conta1; conta1 = new Conta( 21.342-7 ); conta1.credito(500.87); conta1.debito(45.00); System.out.println(conta1.saldo);... 18
Criando Objetos com Construtores... Conta conta1; conta1 = new Conta(); conta1.credito(500.87); conta1.debito(45.00); System.out.println(conta1.saldo);... O construtor default foi perdido. Sobrecarga de Métodos Em java, os métodos são diferenciados pelo nome, e pelo número, tipo e posição dos argumentos; Isto vale para qualquer método e não apenas para os construtores; 19
Sobrecarga de Métodos class Conta { Construtor default. String numero; double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; Conta () {saldo = 0; Conta (String n) {numero = n; saldo = 0; Conta (String n, double v) {numero = n; saldo = v; Sobrecarga de Construtores. Sobrecarga de Métodos class CriaConta { public static void main (String[] args) { Conta conta1 = new Conta ( 123-4 ); Conta conta2 = new Conta ( 21.342-7, 300); Conta conta3 = new Conta (); System.out.println(conta1.saldo); System.out.println(conta2.saldo); 20
Sobrecarga de Métodos class CriaConta { public static void main (String [] args) { Conta conta1 = new Conta ( 678-9 ); Conta conta2 = new Conta (300, 21.342-7 ); Conta conta3 = new Conta (900); System.out.println(conta1.saldo); System.out.println(conta2.saldo); Sobrecarga de Métodos class Conta { String numero; double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; void debito () {saldo = saldo - (int)saldo; Conta (String n) {numero = n; saldo = 0; 21
Sobrecarga de Métodos class CriaConta { public static void main (String[] args) { Conta conta1 = new Conta ( 678-9 ); conta1.credito(500.86); conta1.debito(100); System.out.println(conta1.saldo); conta1.debito(); System.out.println(conta1.saldo); Sobrecarga de Métodos class Conta { String numero; double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; void debito (double v) { if (saldo >= v) saldo = saldo - v; Conta (String n) {numero = n; saldo = 0; 22
Sobrecarga de Métodos class Conta { String numero; double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; boolean debito (double v) { if (saldo < v) return false; else {saldo = saldo - v; return true Conta (String n) {numero = n; saldo = 0; Sobrecarga de Métodos class Conta { String numero; double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; boolean debito () { if (saldo < 0) return false; else {saldo = saldo - (int)saldo; return true Conta (String n) {numero = n; saldo = 0; 23
Encapsulamento Encapsulamento Consiste em separar os aspectos externos de um objeto, que são acessíveis para outros objetos, dos detalhes internos de implementação do objeto [ Rumbaugh ]; Qualquer mecanismo que nos permita esconder a implementação do objeto fazendo com que outros componentes do sistema não tenham conhecimento do conteúdo interno dos dados armazenados no objeto [ Yourdon ]; 24
Encapsulamento É o resultado (ou ato) de se esconder os detalhes de implementação de um objeto do usuário [ Martin ]; Information hiding; A comunicação entre objetos é feita através de mensagens enviadas para as operações; A implementação de um objeto pode ser mudada sem afetar as aplicações que o usam; Facilidade de manutenção; Encapsulamento Métodos públicos Métodos privados Atributos públicos Atributos privados 25
Controle de Acesso Normalmente, é conveniente proibir o acesso a certos atributos (ou mesmo métodos); Controle de Acesso Public: permite acesso a partir de qualquer classe; Private: permite acesso apenas na própria classe; Protected: permite acesso apenas a objetos da mesma classe e de suas sub-classes; Default: permite acesso a todas as classes do mesmo pacote; 26
Classe conta com atributos privados class Conta { Atributos privados. private String numero; private double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; Conta (String n) {numero = n; saldo = 0; Consequências de tornar um atributo privado class CriaConta { public static void main (String[] args) { Conta conta1 = new Conta ( 123-4 ); conta1.saldo = 1000; conta1.numero = 27.548-7 ; System.out.println(conta1.saldo); Atributos privados não podem ser diretamente acessados fora de sua classe. 27
Consequências de tornar um atributo privado Tentar acessar um componente privado (de fora da classe) resulta em erro de compilação; Mas como torná-lo acessível apenas para consulta (leitura)? Isto é possível definindo-se um método que retorna o atributo (na própria classe onde o atributo se encontra); Classe conta com atributos privados class Conta { private String numero; private double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; String getnumero() {return numero; double getsaldo() {return saldo; Conta (String n) {numero = n; saldo = 0; 28
Recuperando o valor de um atributo privado class CriaConta { public static void main (String[] args) { Conta conta1 = new Conta ( 123-4 ); conta1.credito(1000); System.out.println(conta1.getSaldo()); O método getsaldo() retorna o valor do atributo privado saldo. Métodos Destrutores A presença de coleta automática de lixo torna o conceito de destrutores um pouco diferente de seus equivalentes em outras linguagens OO; Em Java destrutores são métodos chamados pelo sistema quando a memória de um objeto está para ser liberada pelo coletor automático de lixo (não quando está para ser coletada); Você pode chamar o destrutor, mas isso não implica que o objeto será deletado; 29
Exemplos de Destrutores protected void finalize{ this.my_database.close( ); Os destrutores são úteis para limpar a casa quando um objeto deixa de ser usado; Atributos x Variáveis Estáticas Cada instância de uma classe tem seus próprios atributos; As variáveis estáticas (ou de classe) são compartilhadas por todas as instâncias da classe; As variáveis de classe são usadas como variáveis globais; 30
prox_num = 132 Classe conta com variável estática Exemplo de Variável Estática class ContaComGerador { private String numero; private double saldo; private static int proxnum = 1; void credito... ContaComGerador () { numero = String.valueOf(proxNum); saldo = 0; proxnum = proxnum + 1; 31
Exemplo de Variável Estática class CriaContaComGerador { public static void main (String[] args) { ContaComGerador conta1 = new ContaComGerador(); ContaComGerador conta2 = new ContaComGerador(); System.out.println(conta1.getNumero()); System.out.println(conta2.getNumero()); conta1.credito(400); System.out.println(conta1.getSaldo()); Exemplo de Variável Estática class CriaContaComGerador { public static void main (String[] args) { ContaComGerador conta1 = new ContaComGerador(); ContaComGerador conta2 = new ContaComGerador(); System.out.println(conta1.getNumero()); System.out.println(conta2.getNumero()); System.out.println( Número da próxima conta: + ContaComGerador.proxNum); A variável deve ser visível (no caso public). 32
Acessando Variáveis Estáticas Fora da classe ContaComGerador. System.out.println( Número da próxima conta: + ContaComGerador.proxNum); System.out.println( Número da próxima conta: + conta1.proxnum); ContaComGerador () { numero = proxnum; saldo = 0; proxnum = proxnum + 1; Dentro da classe ContaComGerador. Dados Finais Não podem ser alterados (constantes); Devem ser inicializados na declaração; Exemplos public final int a = 10; // atributo final public static final string nome = pedro ; // variável estática final 33
Exemplo de um Atributo Final class Circle { public final double pi = 3.14159; double x, y, r; double circunferencia () {return 2 * pi * r; double area () {return pi * r * r; Exemplo de um Atributo Final class Circle { public final double pi = 3.14159; double x, y, r; double circunferencia () { pi = 3.14; return 2 * pi * r; double area () {return pi * r * r; 34
Exemplo de um Atributo Final class CriaCirculo { public static void main (String[] args) { Circulo c1 = new Circulo(); System.out.println(c1.area()); System.out.println(c1.circunferencia()); c1.pi = 3.14; Mét. de Instância x Mét. de Classe Os métodos de classe também são chamados de métodos estáticos; Os métodos estáticos pertencem à classe e não às instâncias; Os métodos estáticos acessam apenas as variáveis estáticas da classe; 35
Exemplo de Métodos Estáticos class Maior { private static int maior (int x, int y) { if (x > y) return x; else return y; public static void main (String [] args) { int m, x, y; x = Util.readInt(); y = Util.readInt(); m = maior (x,y); // m = Maior.maior (x,y); System.out.println(m); Acessando Métodos Estáticas int x, y, resp; x = 10; y = 5; resp = Maior.maior(x, y); Maior m = new Maior(); resp = m.maior(x,y);... resp = maior(x,y); Fora da classe Maior. Dentro da classe Maior. 36
Métodos Finais Não podem ser redefinidos em sub-classes (versão final do método); Exemplos public final void draw( Graphics g ) ; // Método de Instância public final static void draw( Graphics g ) ; // Método de Classe Inicializadores Estáticos Um inicializador estático é um método utilizado para a inicialização das variáveis estáticas; 37
Exemplo de Inic. Estáticos public class Circle{ static private double sines[ ] = new double [ 1000 ]; static private double cosines[ ] = new double [ 1000 ]; static { double x, delta_x; int i; delta_x = (Circle.PI/2)/(1000-1); for (i = 0, x = 0.0; i < 1000; i++ ; x + = delta_x) { sines[ i ] = Math.sin( x ); cosines[ i ] = Math.cos( x);... Ainda estou para ver um problema que, por mais complicado que seja, ao analisa-lo pelo modo correto, não se tornasse ainda mais complicado. Paul Anderson 38
Exercícios Defina uma classe para representar um candidato a uma eleição, com atributos para armazenar o nome do candidato e o número de votos, ambos privados. Defina um método de acesso para cada atributo, um método para incrementar o número de votos do candidato e um construtor para a classe que recebe como argumento o nome do candidato e inicializa o número de votos com zero. Exercícios Desenvolva um programa que cria um candidato com nome de sua escolha. Em seguida, deve ser lido um nome. Se o nome lido for o do seu candidato, incrementar o contador de votos. No final, imprimir o nome do candidato e o total de votos. 39
Ousar é perder o equilíbrio momentaneamente. Não ousar é perder-se Soren Kierkegaard 40