Programação Orientada a Objetos Utilizando Java Pedro de Alcântara dos Santos Neto e-mail: pasn@ufpi.edu.br Home Page: http:// www.ufpi.br/pasn Relevância e Motivação Técnicas a serem utilizadas na prática Desenvolver software de qualidade Impacto econômico e social Objetivos Discutir aspectos de qualidade e modularidade de software Introduzir conceitos de POO e Java Indicar como programas em Java podem ser adequadamente escritos e estruturados Utilizar ambientes de programação em Java Desenvolver uma aplicação de médio porte Qualidade do Software Impacto Econômico e Social» Segurança de pessoas» Disponibilidade de serviços essenciais» Competitividade: produtores/consumidores» Melhores produtos a um menor custo Crise de Software 25% dos projetos são cancelados O tempo de desenvolvimento é bem maior do que o estimado 75% dos sistemas não funcionam como planejado A manutenção e reutilização são difíceis e custosas 10240 5120 2560 1280 640 320 160 80 40 20 10 0 Cancelamentos 0 10 20 30 40 50 %
Atrasos Causas da Crise 10240 5120 2560 1280 640 320 160 80 40 20 10 0 Planejado Real Essências e Acidentes Má qualidade das linguagens, ferramentas e metodologias Complexidade dos sistemas Dificuldade de formalização 0 10 20 30 40 50 60 Meses Qualidade do Software Impacto de Qualidade em Manutenção Correção Robustez Extensibilidade Reusabilidade Compatibilidade Eficiência Portabilidade Testabilidade Integridade Adequação ao uso 70% do custo de software corresponde a manutenção Essência: modificação de requisitos Acidente: depuração Melhorias 9% Debugging 12% Manutenção Hw 6% Outros 3% Requisitos 41% Programação record Pessoa nome : string; idade : integer; end procedure aniversario begin... Urgências 12% Formato dos Dados 17% abstração nome idade nascimento Pedro 25 14/11/1974 formalização
Programação Orientada a Objetos Objeto Conta Bancária Foco nos dados (objetos) do sistema, não nas funções Estruturação do programa é baseada nos dados, não nas funções As funções mudam mais do que os dados Estados do Objeto Conta Histórico de JAVA (20) 895,32 21.342-7 Iniciou como uma linguagem de programação para equipamentos eletrônicos (microondas, PDA s,...) Inicialmente denominada OAK» Pequena, confiável e portável Ideal para a Internet! Sua afirmação se deu com o surgimento do HotJava Java Uma Linguagem Moderna» Java é uma linguagem simples, orientada a objetos, distribuída, interpretada, robusta, segura, independente de arquitetura, portável, de alto desempenho, suportando multithreads e dinâmica. Sun Microsystems, 1995 Java é Simples Sintaxe familiar a vários programadores (baseada em C e C++) Elimina várias redundâncias de C++ Simples para algumas aplicações, desde que se conheça alguns pacotes Simples dado tudo que a linguagem oferece
Java Eliminou... Java é Orientada a Objetos Variáveis e funções globais Ponteiros goto, struct e union Número variável de argumentos Tipos fracos Remoção de objetos Classes parametrizadas! Objetos e Classes Encapsulamento de dados e operações Subtipos e Herança Polimorfismo Ligações dinâmicas (dynamic binding) Criação e remoção dinâmica de objetos Implementações de Java Java é Portável Interpretada» Bytecodes da JVM» Independente de plataforma Compilada» Código nativo em C ou C++ Alta performance? Em tese, redução de custos com migração, instalação, treinamento, etc. Na prática, ainda é necessário depurar programas antes de migrar para outra plataforma Java é Distribuída Java é Robusta Oferece suporte de alto nível para acesso a Internet / WWW (pacote java.net) Objetos distribuídos com RMI e CORBA Suporte para acesso a arquivos remotos, banco de dados, etc. Ausência de ponteiros Fortemente tipada Coleta de lixo automática Exceções tipadas Acesso a arrays é verificado Variáveis são inicializadas automaticamente
Programa em Java Compilando e Executando Formado por 3 elementos» Declaração de Pacotes» Utilização de imports» Definições de classes O Programa HelloWorld class HelloWorld { public static void main (String args[]){ System.out.println( Hello World! ); Compilação:» javac NomedaClasse.java» Geração de um arquivo.class Execução:» java NomedaClasse Argumentos Execução de um Applet:» appletviewer ArquivoHtml.html Compilando e Executando Palavras Chaves Use uma IDE» Eclipse (recomendado)» NetBeans abstract, boolean, break, byte, case, catch, char, class, const, continue, defalt, do, double, else, extends, false, final, finally, float, for, goto, if, implements, import, intanceof, int, interface, long, native, new, null, package, private, protected, public, return, short, static, super, switch, syncronized, this, throw, throws, transient, true, try, void, volatile, while Identificadores Tipos de Dados Primitivos Nomear variáveis, métodos, classes e labels. Não pode ser palavra reservada e deve iniciar com letra, $ ou _.» louco // válido» intgrande // válido» $valor1 // válido» 3_variavel // inválido»!verdade // inválido Tipos Numéricos:» byte bt = 100; // -128..+127» short st = -4; // -32768..+32767» int it = 10; // -2 31..+2 31-1» long lg = 300L; // -2 63..+2 63-1» float ft = 2.5; // 32bit» double db = 6.5e10; // 64bit
Tipos de Dados Primitivos Caracteres e Cadeias (strings)» char ch = a ; // caracter» char ch1 = 48 // caracter a» Integer val = a ; // caracter com int» String st = Tipo ; // cadeia de carac.» char hx = 0xA; // valor hexadec 10» String b = Hello Java!\n ; //?» String c = Falaram \ Hello Java!\ ; //? Tipos de Dados Primitivos Códigos de escape para caracteres» \b backspace» \f formfeed» \n newline» \r car return» \t tab» \\ \» \» \» \xhh hexadecimal Tipos de Dados Primitivos Tipo boolean» boolean sougrande=true;» boolean verdadefalsa=false; Matrizes» Declaração (int inteiros[]; double d[];)» Construção (inteiros=new int[5];)» Inicialização inteiros[1]=1; inteiros[2]=2; Operadores Matemáticos» + a=a+1 adição» - b=b-1 subtração» * c=c*2 multiplicação» / d=d/4 divisão» % e=e%2 resto» - f=-f negação» ++ a++ incremento» -- b-- decremento Operadores Comparativos Exercício em Sala» == if (a==3) {... Igual»!= if (a!=5) {... não igual» < t = a < b; menor» > x = a > b; maior» <= if (a<=b) {... menor igual» >= j = ~a >= b; maior igual» && if (a=0 && b=2) AND» if (a<3 c>=5) OR Crie um pequeno programa em Java para testar as expressões anteriores, utilizando as variáveis a e b, com valores 3 e 6, respectivamente.
Operadores Binários» ~ a=~a; complemento binário» & a=a&0x22; AND» a=a b; OR» ^ a=a^b; XOR» << a=<<a; deslocamento esquerda» >> a=a<<2; deslocamento direita Exercício em Sala» Faça um pequeno programa em Java para testar o funcionamento dos operadores binários O Operador Ternário (?) O Operador Ternário (?)» a = x? b : c; class Ternario { public static void main(string args[]) { short v1 = 10; short v2 = 5; short menor; menor = (v1 < v2)? v1 : v2; System.out.println(menor); Fluxo de Controle (if.. else) class TernarioComIf { public static void main(string args[]) { short v1 = 10, short v2 = 5, menor=0; if(v1<v2) menor=v1; else menor=v2; System.out.println(menor); Switch (teste de múltipla escolha) class SwitchApp { public static void main(string args[]) throws Exception{ System.out.println( Tecle opcao ); char opt = (char)system.in.read(); switch (opt) { case 1 : System.out.println( Nada... ); break; case s : case S : System.out.println( Sim ); break; case n : case N : System.out.println( Não ); break; default: System.out.println( Erro ); break; Enquanto (While) class Whileapp { public static void main(string args[]) throws Exception{ System.out.println( Tecle um númeral: ); char nu = (char)system.in.read(); while (nu <> 5 ) { System.out.println( Tente novamente ); System.out.println( Tecle númeral: ); nu = (char)system.in.read(); System.out.println( Acertou!!!! ); Faça.. Enquanto (Do.. While) class DoWhileApp { public static void main(string args[]) throws Exception { char lt; do { System.out.println( Tecle uma letra: ); lt = (char)system.in.read(); while ( c!= f ); System.out.println( Acertou!!!! );
Para (For) class testeargs { public static void main(string args[]) { int i; System.out.println(args.length); for(i=0;i<args.length;i++) System.out.println(args[i]); Para (For) class ForLoopApp { public static void main(string args[]) { for (int i = 0; i < 10; i++) { if (i == 7) continue; // retorna ao for 1 System.out.println( for 1: i= + i); System.out.println( for 1 final i= + i); for (i = 10; i > 0; i--) { if (i == 3) break; // sai do for 2 System.out.println( for 2: i= + i); System.out.println( for 2 final: i= + i); Classes e Objetos Classe de Contas Objetos» métodos + atributos» estado encapsulado Classes» Agrupamento de objetos do mesmo tipo Classe de Contas: Assinaturas class Conta { void credito (double valor) { void debito (double valor) { String numero() { double saldo() { Conta (String n) { Classe de Contas: Descrição class Conta { private String numero; private double saldo; void credito (double valor) {saldo = saldo + valor; void debito (double valor) {saldo = saldo - valor; String numero() {return numero; double saldo() {return saldo; Conta (String n) {numero = n; saldo = 0;
Criação Dinâmica de Objetos... Conta conta1; conta1 = new Conta( 21.342-7 ); conta1.credito(500.87); conta1.debito(45.00); System.out.println(conta1.saldo());... Descrições de Classes Componentes abertos e fechados Podem ser facilmente estendidos, sem alterar os sistemas Podem ser prontamente utilizados para construir sistemas Classe de Bancos: Assinatura class Banco { void cadastro(conta c) { void credito(string num, double val) { void debito(string num, double val) { double saldo(string num) { void transfere(string d, String p, double v) { Banco () { Classe de Bancos: Descrição class Banco { private Conta[] contas; private int indice = 0; void cadastro(conta c) { contas[indice] = c; indice = indice + 1; Classe de Bancos: Descrição private Conta procurar(string n) { int i = 0; boolean achou = false; while ((! achou) && (i < indice)) { if (contas[i].numero() == n) achou = true; else i = i + 1; if (achou == true) return contas[i]; else return null; Classe de Bancos: Descrição void debito(string num, double val) { Conta c; c = this.procurar(num); if (c!= null) c.debito(val); else System.out.println("Conta Inexistente!");
Classe de Bancos: Construtor Mais Sobre Construtores Banco( )?» Construtor da Classe» Inicialização de um objeto da classe» Caso não sejam declarados construtores, utiliza-se o construtor default Banco( ) { contas=new Conta[50]; Múltiplos Construtores» Overloading (Sobrecarga) public class Circulo { double x, y, r; Circulo(double x, double y, double r) { this.x=x; this.y=y; this.r=r; Circulo(double r) {x=0.0; y=0.0; this.r=r; Circulo(Circulo c) {x=c.x; y=c.y; this.r=c.r; Circulo() {x=0.0; y=0.0; r=0.0; Exercício em Sala Completar a implementação da classe Banco com o construtor e os métodos transfere e saldo. Implementar um programa principal que crie objetos das classes definidas, testando sua utilização.