Java é - Giuliano Prado
Transcrição
Java é - Giuliano Prado
A Plataforma Java Programação Orientada a Objetos em Java Programação Orientada a Objetos em Java Prof. Giuliano Prado de Morais Giglio, M.Sc. [email protected] http://www.giulianoprado.xpg.com.br OBJETIVOS DO CURSO n Fornecer uma visão geral da linguagem Java e apresentar suas potencialidades. n Capacitar os alunos a trabalhar com a linguagem de programação Java. n Introduzir as principais fundamentos de implementação de aplicações gráficas Java com pacote Swing. ORGANIZAÇÃO DO CURSO ü Introdução a linguagem JAVA; ü Estrutura da Linguagem; ü Java e Orientação a Objetos; ü Classes § § § § § Objetos (Instanciação) Atributos Métodos Encapsulamento; Sobrecarga; ü Herança e Polimorfismo; ü Coleção de Objetos; ü Classes especiais da API Java A Plataforma Java Programação Orientada a Objetos em Java Introdução a Linguagem Java Prof. Giuliano Prado de Morais Giglio, M.Sc. CONCEITOS DO JAVA Java é: – Uma Linguagem de Programação – Um Ambiente de Desenvlvimento – Um Ambiente de Aplicativos CONCEITOS DO JAVA J2SE – Contém as classes principais da plataforma Java, e é chamado às vezes de Core Java Plataform. n J2EE – É um conjunto de tecnologias que fornecem APIs e um ambiente para desenvolvimento e execução de aplicações coorporativas. n J2ME – É o Java para pequenos dispositivos, desde palms até celulares. n INTRODUÇÃO AO JAVA n Vantagens de Java como Linguagem de Programação: vOrientada a Objetos (O.O) vcódigo sem bugs: mais fácil em Java que em C++ vdesalocação manual de memória não existe vindependência de plataforma! JAVA n Simples ü Sintaxe similar a C / C++ ü Não possui os recursos “perigosos”, desnecessários ou pouco usados: ü Aritmética de ponteiros (*--pt = vet+5) ü Estruturas (struct) ü Definição de tipos (typedef) ü Pré-processamento (#define) ü Liberação explícita de memória (free) ü Eliminação de 50% dos erros mais comuns ü Interpretadores pequenos (256 Kb) COLETOR DE LIXO n A Linguagem Java realiza a liberação de memória, que antes era responsabilidade do programador. JAVA n Orientada a Objetos Utiliza tecnologia de objetos similar a de C++, com alguns acréscimos e simplificações. JAVA n Distribuída Implementa os protocolos da arquitetura TCP/IP, tais como: HTTP, SMTP, TCP, UDP, RTP, FTP, etc. JAVA n Robusta üPossui checagem em tempo de compilação e execução. üGerenciamento automático de memória (“garbage collector” ). üAusência de recursos “perigosos”. üExtensiva verificação do código JAVA n Robusta üO fonte é compilado para um código intermediário (“bytecode”). üO interpretador funciona como uma Máquina Virtual Java (JVM). INDEPENDÊNCIA DE PLATAFORMA JAVA n Interpretada Os bytecodes são executados por um interpretador (JVM) embora existam opções de compilação. JVM - JAVA VIRTUAL MACHINE n Cabe ao interpretador Java de cada plataforma de hardware específica assegurar a execução do código compilado para a JVM. AMBIENTE DE PROGRAMAÇÃO JAVA n Java 2 Standard Developers Kit (J2SDK) JVM mais todas as APIs, compilador e ferramentas (tudo o que você precisa para escrever programas Java) JVM mais as APIs (tudo o que você precisa para executar programas Java) Documentação das APIs (Application Programming Interface) AMBIENTE DE PROGRAMAÇÃO JAVA n Java 2 Standard Developers Kit (J2SDK) ØDisponível para download no Site Java da Sun (java.sun.com) ØVersão atual (J2SDK 1.6.23) ØPrincipais aplicativos: § javac (compilador) § java (interpretador) § applet viewer (visualizador de Applets) AMBIENTE DE PROGRAMAÇÃO JAVA n Documentação das APIs (Application Programming Interface) ØDescreve quais são as classes definidas pela linguagem, o que fazem e como elas devem ser usadas nos programas. ØDisponível para download ou on-line no Site Java da Sun (http://java.sun.com/docs/index.html) AMBIENTE DE PROGRAMAÇÃO JAVA n Existem editores (IDEs) específicos para o desenvolvimento de Aplicativos Java vSUN NetBeans vEclipse vBorland JBuilder vJCreator vBlueJ INSTALAÇÃO n n n n Fazer o download do J2SDK. Instalar o arquivo jdk-6u23-windows-i586.exe Somente após o passo seguinte que poderá ser instalado a IDE de sua preferência (JCreator) Recomendado incluir as seguintes variáveis de ambiente, porém, não obrigatório: Ø JAVA_HOME: apontará para o diretório onde o J2SDK foi instalado = C:\Arquivos programas\Java\jdk1.6.23 Ø CLASSPATH:responsável por definir um caminho de pesquisa para as classes do J2SE = ;.JAVA_HOME Ø PATH: responsável por definir um caminho de pesquisa para arquivos executáveis. Se está variável não for configurada, o processo de compilação dos programas feitos em Java somente poderá ser executado dentro da pasta “lib” do diretório de instalação do J2SE 6.0 JDK = C:\Arquivos programas\Java\jdk1.6.23\bin PRIMEIRO PROGRAMA JAVA Digite o programa “Teste.java”apresentado abaixo, utilizando o Bloco de Notas /*** Primeiro Programa Java ***/ class Teste { public static void main(String arg[]) { System.out.println(“Teste em Java”); } } PRIMEIRO PROGRAMA JAVA Hello.java PRIMEIRO PROGRAMA JAVA n Compilar o Programa javac Hello.java n Se o programa foi compilado corretamente, um novo arquivo (Hello.class) será criado. n Interpretar o programa java HelloWorldApp AMBIENTE DE PROGRAMAÇÃO JAVA ANATOMIA DO PROGRAMA n Comentários n Os comentários em Java seguem a mesma sintaxe de c. Ø /* texto */ Ø // texto Ø /*** Primeiro Programa Java ***/ n O compilador ignora estas linhas ANATOMIA DO PROGRAMA n Definição de Classe n É a unidade básica para uma linguagem OO como Java n class nome { ... } n class é a palavra reservada que marca o início da declaração de uma classe. ANATOMIA DO PROGRAMA n Delimitação Ø um de Blocos bloco está sempre entre chaves { } Ø Em Java as instruções terminam em ponto-e-vírgula (;) ANATOMIA DO PROGRAMA Método main n Toda aplicação java, exceto Applets e Servlets, deve possuir o método main. public static void main (String args[ ]){ System.out.println("Teste em Java!"); } n O método main indica o início de execução de qualquer programa Java. ANATOMIA DO PROGRAMA Ø Ø Ø Ø Ø Argumentos do Método main public - é um qualificador do método que indica que este é acessível externamente a esta classe. static - é um outro qualificador que especifica o método como sendo um método de classe. void - indica que não existe retorno a este método. main - é o nome do método. String args[ ] - Armazena valores passados por linha de comando. ANATOMIA DO PROGRAMA n System.out.println(“Hello World!”) üEscreve na tela o conteúdo nos parêntesis. üChamada do método println para o atributo out da classe System. üO argumento (“...”) é do tipo String. ANATOMIA DO PROGRAMA n System.out.println(sequência escape) § § § § § \n (nova linha) \t (tabulação horizontal) \r (retorno de carro) \\ (barra invertida) \” (aspas duplas) de DETALHES IMPORTANTES n Programa fonte tem extensão ‘.java’ n Programa compilado tem extensão ‘.class’ n A linguagem é “case-sensitive”, letras maiúsculas são diferentes de letras minúsculas n Cada programa é uma classe DETALHES IMPORTANTES n n n n n Nome da classe no programa tem que ser igual ao nome do arquivo físico ‘.java’ Sintaxe similar a linguagem C/C++ As classes podem estar agrupadas em package Package é um subdiretório. Exemplo: java.awt, java.math As classes podem ser compactadas (zip ou jar) ESTRUTURAS DE PROGRAMAÇÃO n Identificadores ØNomeiam variáveis, funções, classes e objetos ØPodem conter letras e/ou dígitos, “_” e “$” ØNão podem ser iniciados por dígito ØNão podem ser palavras reservadas ØNão tem tamanho máximo ESTRUTURAS DE PROGRAMAÇÃO VÁLIDOS n Nome n NumDepen n total_geral n NOME INVÁLIDOS n 1prova n total geral ESTRUTURAS DE PROGRAMAÇÃO ESTRUTURAS DE PROGRAMAÇÃO n Texto char: char representa um caracter Unicode de 16 bits (exemplos: ‘a’, ‘M’, ‘\t’, ‘\u02B1’) • \b • \t • \n • \r • \” • \’ • \\ • \u001B – – – – – – – – retrocesso tab avanço de linha retorno de carro aspas apóstrofo barra invertida indica o caracter unicode em hexadecimal ESTRUTURAS DE PROGRAMAÇÃO Texto n String: representa uma seqüência de caracteres char opcao; opcao = 'S'; opcao = 'N'; String frase; frase = “Ordem e Progresso”; ESTRUTURAS DE PROGRAMAÇÃO n Inteiro byte 8 bits 27…27-1 short 16 bits 215..215-1 int 32 bits 231..231-1 long 64 bits 263..263-1 ESTRUTURAS DE PROGRAMAÇÃO n Inteiro byte index = 50; short soma = 2000; int num carros = 5; long valor = 0XDADAL; ESTRUTURAS DE PROGRAMAÇÃO n Tipos Ponto Flutante (Real) • float 32 bits • double 64 bits n– • • • • Representações: 3.14 6.02E23 2.718F 123.4E+306D float pi = 3.1415f; double pi = 3.1415; ESTRUTURAS DE PROGRAMAÇÃO ESTRUTURAS DE PROGRAMAÇÃO n Declarações e atribuições de variáveis • As declarações podem ser exibidas em qualquer posição do código-fonte. int x, y; float z = 3.144f; double w = 3.1415; boolean verdade = true; char c, d; c = 'A'; d = '\u0013'; x = 6; y = 1000; ESTRUTURAS DE PROGRAMAÇÃO n Variáveis n Inicialização padrão Java • variáveis numéricas com zero • variáveis booleanas com false • outras variáveis com null OPERADORES n Lógicos • Comparação de valor: = = , !=, !, > e > • Junção de expressões: &, &&, |, || • Comparação de objetos: instanceof() OPERADORES n Aritméticos • • • • • Soma ( + ) Subtração ( - ) Multiplicação ( * ) Divisão ( / ) Resto ( % ) OPERADORES n Considere um operador @ qualquer n Expressões do tipo X = X @ Z podem ser substituídas por X @= Z x=x+3 x += 3 x=x*(9+y) x *= ( 9 + y ) OPERADORES n Atenção (programadores C/C++): • O operador + não é apenas aritmético (por ex. pode ser utilizado para inicialização e concatenação de strings) • Existe o tipo booleano, logo os operadores relacionais e lógicos NÃO geram inteiros • Não há conversões automáticas (por ex. real para inteiro) OPERADORES n Atenção • • • • (programadores C/C++): int i, j; float r; i = r / j; // ERADO! i = (int) r / j; // OK! CONTROLE DE FLUXO n Estrutura de Decisão - If / Else if (expressão booleana) { instrução ou bloco de comandos } else { instrução ou bloco de comandos } if (cont >= 0) { System.out.Println(“Erro !!!”); } else { System.out.println(“Ok !”); } CONTROLE DE FLUXO n Estrutura de Decisão - switch switch (expressão short, int, byte ou char) { case expressão2: comandos; break; case expressão3: comandos; break; default: comandos; break; } CONTROLE DE FLUXO n Estrutura de Decisão - switch switch (opcao) { case 0: valor = a + b; break; case 2: valor = (a * b) - c; break; default: valor = a; break; } n n A instrução break (opcional) impede que o fluxo de execução continue pelas opções seguintes A cláusula default é opcional CONTROLE DE FLUXO n Estrutura de Repetição – for for (expr_inicial; expr_booleana; expr_increm) { bloco de comandos } for (int x=0; x<10; x++) { System.out.println(" Valor do X : " + x); } CONTROLE DE FLUXO n Estrutura de Repetição - while while (expr_booleana) { bloco de comandos } int cont = 0 while (cont < 100) { System.out.println(" contando " + cont); cont++; } CONTROLE DE FLUXO n Estrutura de Repetição - do while do { bloco de comandos } while (expr_booleana) int x = 0; do { x++; } while (x <10); VETORES(Arrays) n n n n n n Declaração Podem ser declarados arrays de quaisquer dos tipos através dos símbolos “[” e “]”. A declaração não cria o array, isto é, não aloca memória. Isso é feito pela instrução new (arrays são objetos em Java). char s[ ]; // declaração s = new char[3]; // Criação s[0] = ‘A’; s[1] = ‘B’; s[2] = ‘C’; // atribuição VETORES(Arrays) n Declaração • Os colchetes podem ser usados antes ou depois da variável. • Exemplo: üchar s[ ]; üchar [ ]s; VETORES(Arrays) n Declarando, criando e iniciando um array char s[ ] = {'A', 'B', 'C'}; // declaração, criação e incialização n Em Java array é um objeto, mesmo quando é composto por tipos primitivos. Apenas a declaração não cria o objeto, sendo necessário o uso da palavra reservada new. int p[ ] = new int[5]; p[0] = 25; p[1] = 32; VETORES(Arrays) n Alocação de Memória n Quando um array é criado, todos os seus elementos são inicializados. VETORES(Arrays) n Arrays não podem ser dimensionados na definição: int vector[5]; //ERRADO! n Arrays não podem ser utilizados sem a criação: int vector[]; vector[0] = 4; //ERRADO! VETORES(Arrays) n Para determinarmos o seu tamanho podemos usar o método length: int lista [] = new int [10]; for (int j = 0; j < lista.length; j++) { System.out.println(lista[j]); } VETORES(Matrizes) n Multi-dimensionais int lista [] = new int [10]; int matriz [][] = new int [4][5]; matriz [0][0] = 300; matriz [1][3] = 600; For “aprimorado” n Esse for permite percorrer um array ou um enum (ou ainda uma Collection – que só veremos láááá na frente) de forma mais simples n Definimos o tipo que é retornado pelo array ou pelo enum, e pegamos a lista a percorrer Pra usar o for com array public class TestaFor { public static void main(String args[]) { int a[] = {4,5,6,3,4,2,1}; for (int i : a) { System.out.println(i); } } } A Plataforma Java Programação Orientada a Objetos em Java Java e Orientação a Objetos - Conceitos Principais Prof. Giuliano Prado de Morais Giglio, M.Sc. Orientação a Objetos n História da OO • Programação sob demanda • Programação estruturada • Orientação a Objetos n Diversos avanços foram realizados na área acadêmica ainda na década de 70 n A partir da década de 80 começou a ser adotada tomando seu espaço nos anos 90 Orientação a Objetos n O paradigma estruturado trata de funções e procedimentos aplicados a dados n O paradigma orientado a objetos trata de dados e comportamentos Paradigma Estruturado Paradigma OO dados funções funções dados Orientação a Objetos PCuidado ! Orientação a Objetos não elimina a programação estruturada. Dentro dos métodos (que definem o comportamento de um objeto) usamos a programação estruturada. Orientação a Objetos n Classes e Objetos – constituem a unidade de representação de dados para esse paradigma. E mantém uma relação muito próxima entre si. n Podemos pensar na Classe como a forma da peça ou do bolo, e nos objetos como peças prontas feitas de matéria prima. Orientação a Objetos Orientação a Objetos n Classes definem novos tipos de dados, tal como structs de C ou registers de Pascal. n A partir de novos tipos de dados torna-se mais fácil organizar a aplicação em questão. n Um objeto é uma instância de uma classe, ou seja, um exemplar do conjunto de objetos que seguem os moldes daquela classe Orientação a Objetos n Atributos – são os “campos” que contém as informações daquela classe. Ao conjunto de atributos preenchidos de um objeto damos o nome de “estado do objeto” n Existem atributos de classe e atributos de instância. Orientação a Objetos n Métodos – definem o comportamento dos objetos definidos pela classe. n Por comportamento entendemos o conjunto de reações ou atividades que os objetos podem desempenhar. n Exemplo: Classe Avião, método decolar, método pousar, etc... n Métodos podem ter parâmetros de entrada e retorno A Plataforma Java Programação Orientada a Objetos em Java Java e Orientação a Objetos - Implementação Prof. Giuliano Prado de Morais Giglio, M.Sc. DEFINIÇÃO DE UM OBJETO n Um objeto pode ser descrito por um conjunto de atributos (propriedades) e seu comportamento: DEFINIÇÃO DE UM OBJETO n Um cachorro possui um estado (nome, cor, raça) e um comportamento (latindo, mordendo, lambendo). ATRIBUTOS COMPORTAMENTO Pluto Dourado Vira-latas Descansando Uivando CLASSES DE OBJETOS n “Grupo de objetos com os mesmos atributos e o mesmo comportamento pertencem à mesma classe.” CLASSES DE OBJETOS n Uma classe é um modelo ou protótipo que define as propriedades e métodos (comportamento) comuns a um conjunto de objetos. n Classes são “moldes” que definem as variáveis e os métodos comuns a todos os objetos de um determinado tipo. CLASSES DE OBJETOS n No mundo real existem vários objetos do mesmo tipo. Por exemplo, a sua bicicleta é uma das milhares que existem no mundo. n Usando a terminologia de orientação a objetos, o objeto sua bicicleta é uma instância da classe de objetos bicicleta. CLASSES DE OBJETOS n Classes X Objetos Ø Uma classe é um “molde” a partir do qual vários objetos são criados. ORIENTAÇÃO A OBJETOS EM JAVA Programas em Java provavelmente irão criar diversos objetos de diversos tipos de classes. n Os objetos interagem entre si através da troca de mensagens. n Após o objeto ter realizado o trabalho proposto, o mesmo é eliminado através da “coleta automática de lixo”. n REPRESENTAÇÃO DE UMA CLASSE Classe Atributos Métodos ESTRUTURA DE UMA CLASSE EM JAVA class BirthDate { int daya; int month; int year; int getDay() { … REFERÊNCIA A UMA CLASSE EM JAVA BirthDate myBirthDate; CLASSES EM JAVA Declaração: class Ponto { ... } n Propriedades: dados que as instâncias da classe conterão: class Ponto { float x, y; } n CLASSES EM JAVA class Veiculo { // Propriedades private float velocidadeMaxima; protected float capacidadeTanque, consumo; protected int potencia, ano; protected String marca, modelo, cor; public String chassis, placa; ... // Métodos ... public float autonomia ( ) { return capacidadeTanque * consumo; } } CLASSE = “Molde de Objetos” Tempo de Compilação Tempo de Execução Classe: Carro Esportivo Objeto Carro: Instância 3 CRIAÇÃO DE OBJETOS (INSTANCIAÇÃO) n Um objeto de uma classe é criado utilizando-se a palavra new. Date mayBirthDate = new Date(); EXEMPLO REFERÊNCIAS PARA OBJETOS n Alocação de memória: Ponto p1; // cria apenas a referência Ponto p1 = new Ponto(); // aloca memória e atribui // endereço à referência DIFERENÇA COM TIPOS PRIMITIVOS n Quando se declara variáveis de qualquer tipo primitivo (int, float, char, etc.), o espaço na memória é alocado como parte da operação. n A declaração de uma variável de classe não aloca memória, somente quando a instrução new é chamada. DIFERENÇA COM TIPOS PRIMITIVOS REFERÊNCIA PARA OBJETOS n Alocação de memória Ponto p2 = p1; // cria outra referência // para o mesmo objeto ATRIBUIÇÃO DE VALORES n As propriedades dos objetos podem ser manipuladas diretamente pelo operador de ponto (.) Ponto p1 = p1.x = 1; p1.y = 2; // Ponto p2 = p2.x = 3; p2.y = 4; // new Ponto(); p1 representa o ponto (1,2) new Ponto(); p2 representa o ponto (3,4) p1 = p2; p1.x = 10; // p1 representa o ponto (10,4) // p2 representa o ponto (10,4) OBTENÇÃO DE VALORES n Os valores das propriedades podem ser obtidos facilmente System.out.pritln("p1.x = " + p1.x + "."); System.out.pritln("p2.x = " + p2.x + "."); // p1.x = 10. // p2.x = 10. MÉTODOS n n Definem o comportamento da classe. Declaração: class Ponto { int x, y; void mover (int dx, int dy) x += dx; y += dy; } } MÉTODOS n Implementam as funções de uma classe n Possuem sintaxe semelhante à sintaxe de definição das funções de um programa procedural n Determinam o comportamento da classe e a troca de mensagens com outras classes MÉTODOS ASSINATURA DE UM MÉTODO O tipo de retorno pode ser void CHAMADAS DE MÉTODOS n n A troca de mensagens entre os objetos é realizada através da chamada de métodos com passagem de argumentos Exemplo ... p1.mover(10,l0); //Deslocou p1 dez unidades, nos dois eixos. ... EXEMPLO class ProgramaPrincipal { public static void main (String args[]) { Funcionario func; func = new Funcionario(“Juca”,102); } MÉTODO “Main” class ProgramaPrincipal { public static void main (String args[]) { Funcionario func; func = new Funcionario(“Juca”,102); } } PALAVRA RESERVADA “This” n n As vezes é necessário que o objeto se referencie. Existe uma palavra reservada this que significa uma referência ao próprio objeto class Ponto { int x, y; void mover (int x, int y) { this.x = x; this.y = y; } } PALAVRA RESERVADA “This” n Quando o método é chamado, a palavra-chave ‘this’ refere-se ao objeto classStartDate PASSAGEM DE ARGUMENTOS n Tipos de argumentos n Objetos → passagem por referência. • Originais são sujeitos a alterações dentro do método. n Tipos primitivos → passagem por valor. • Originais não são sujeitos a alterações dentro do método. PASSAGEM DE ARGUMENTOS n Tipos de argumentos class Ponto { public int x, y; Ponto (int x, int y) { this.x = x; this.y = y; } public void teste (Ponto pt, int i) { pt.x = 3; pt.y = 4; i = 1; } PASSAGEM DE ARGUMENTOS n Tipos de argumentos ... public static void main (String args[]) { Ponto ponto = new Ponto(1,2); int i = 2; // Antes, ponto=(1,2) e i = 2. ponto.teste(ponto,i); // Depois, ponto=(3,4) e i = 1. } } VARIÁVEIS LOCAIS n Além das propriedades de um objeto, podem ser definidos outros tipos de variável, locais a um método ou a um bloco de operações. float calculaMedia(float p1, float p2) { float media = (p1 + p2)/2; return media; } VARIÁVEIS LOCAIS ... String alunos[]; float listaAprovados() { for (int i = 0; i < alunos.length;i++) { String nome = alunos[i]; System.out.println(i + ": " + nome); } } CONSTRUTORES n n n Devemos usar construtores quando queremos definir o estado inicial de objetos de uma classe (atribuir valores aos atributos de um objeto no momento de sua criação, por exemplo) Usados na criação de um objeto através do comando new Possuem o mesmo nome da classe e não têm tipo de retorno! CONSTRUTOR PADRÃO n n A linguagem Java declara um construtor padrão, vazio, que não recebe nenhum parâmetro Ponto p1 = new Ponto(); Quando declaramos um novo construtor, esse construtor padrão deixa de existir e é substituído pelo novo construtor class Ponto { int x; int y; Ponto () { } } CONSTRUTORES n n Podem receber parâmetros, que podem servir para inicialização dos atributos da classe Uma classe pode ter vários construtores class Ponto { int x; int y; Ponto (int x, int y) { this.x = x; this.y = y; } } CONSTRUTORES n Deve ser usado no momento da criação do objeto: Ponto p1 = new Ponto(1,2); Ponto p2; p2 = new Ponto(3,4); Ponto p3 = new Ponto(); CONSTRUTORES CONSTRUTORES STRINGS n Uma string não é um tipo primitivo, é uma classe pré-definida do Java. São seqüências de caracteres. n Pode ser criado com ou sem a palavra new. String String String nova = String e = ""; // uma string vazia alo = "Alo Pessoal"; nova; "Sou nova"; nome = new String("Antonio"); STRINGS n Operações com String new. // Concatenação String nova = alo + ", tudo Ok ? "; // Edição String substr = alo.substring(0,3); // "Alo" // Verificando tamanho int tam = alo.length(); // tamanho = 11 MEMBROS DE CLASSE n n Pode-se definir numa classe membros que sejam compartilhados por todas instâncias daquela classe. Esses membros são chamados de “membros de classe”. Podem ser: • propriedades (variáveis) • métodos n Todo membro de classe deve usar o qualificador static. VARIÁVEIS DE CLASSE n Exemplo: class Pessoa { static int numPessoas = 0; int id; Pessoa () { id = numPessoas; numPessoas++; } ... } VARIÁVEIS DE CLASSE VARIÁVEIS DE CLASSE n Exemplo: Pessoa joao = new Pessoa (); // joao.id = 0; // joao.numPessoas = 1; Pessoa ana = new Pessoa(); // ana.id = 1; // ana.numPessoas = 2; n Fazer este exemplo, imprimindo (id) e (numPessoas). VARIÁVEIS DE CLASSE n Os membros de classe podem ser acessados diretamente, sem necessidade da existência de um objeto. Pessoa.numPessoas = 100; // Próxima pessoa criada será 101 ESCOPO DE VARIÁVEIS n Ao utilizar o nome de uma variável dentro de um método, Java procurará a sua definição na seguinte ordem: bloco bloco mais externo método variável de instância ou classe super-classe MÉTODOS DE CLASSE class Example { .. static int multiply10(int value) { .. } } § Exemplo: int value = "100"; int new_value = Example.multiply10(value); System.out.println("n.v = " + new_value); CONSTANTES n Podem ser: • variáveis (de instância, de classe ou locais) • métodos n São declaradas com a palavra reservada final CONSTANTES class Teste { // Variáveis constantes final int ESQUERDA = 0; final int DIREITA = 0; // Método constante private final static void main (String args[]) { .. } .. } ENCAPSULAMENTO n Através dos métodos podemos atingir uma das principais características da orientação a objetos. O encapsulamento, que é a capacidade de esconder do mundo exterior as estruturas internas de uma classe. n O encapsulamento define que os atributos só são acessados através de métodos o que evita o acoplamento ENCAPSULAMENTO nÉ a forma de restringir o acesso aos métodos e propriedades de uma classe. n Protege os dados de um objeto contra uma modificação imprópria. n É necessário definir o controle de acesso aos métodos e propriedades de uma classe, de forma que não se interfira no seu funcionamento. CONTROLE DE ACESSO n Os membros de uma classe podem ser protegidos de acessos indevidos n Métodos de acesso: public e private • public: membros podem ser acessados livremente • private: membros só podem ser acessados pela própria classe (necessário definir os accessor methods - get e set) CONTROLE DE ACESSO n Exemplo class Pessoa { private nome; private idade; public obs; Pessoa (String nome, int idade){ this.nome = nome; } public imprimeNome() { System.out.println(“Nome: ” + nome); } } CONTROLE DE ACESSO n Exemplo Pessoa p1 = new Pessoa("Joao",10); p1.nome = "Raul";//ERRO DE COMPILAÇÃO! p1.obs = "bom garoto"; //OK! p1.imprimeNome(); //OK! // Nome: Joao SOBRECARGA DE MÉTODOS n Sobrecarregar um método significa definir dois ou mais métodos com o mesmo nome, porém com assinaturas diferentes. n Assinatura diferente pode ser: tipo de retorno, número ou tipos de parâmetros diferentes. SOBRECARGA DE MÉTODOS nA sobrecarga pode ser feita igualmente aos métodos construtores n Uma boa prática é usar a sobrecarga, somente, em métodos que possuam a mesma funcionalidade. SOBRECARGA DE MÉTODOS n Exemplo SOBRECARGA DE MÉTODOS n Exemplo class Ponto { ... void mover (int dx, int dy) { x += dx; y += dy; } void mover (int raio, float ang) { raio*Math.cos(ang); raio*Math.sen(ang); } } SOBRECARGA DE CONSTRUTORES n Exemplo class Ponto { int x; int y; Ponto () { } Ponto (int x, int y) { this.x = x; this.y = y; } ... } SOBRECARGA DE CONSTRUTORES n n A sobrecarga de construtores visa definir formas diferentes de criar um objeto Exemplo: Ponto p1 = new Ponto(); //p1 está em (0,0) Ponto p2 = new Ponto(1,2); //P2 está em (1,2) SOBRECARGA DE CONSTRUTORES n n n n Um construtor pode chamar outro construtor. Isso se chama “encadeamento de construtores”. Para isto é necessário usar a palavra reservada this. Uma chamada a outro construtor deverá ser a primeira linha do construtor! SOBRECARGA DE CONSTRUTORES n Exemplo: class Ponto { int x=0; int y=0; Ponto () { this(0,0); } Ponto (int x, int y) { this.y=y; } } O QUE É HERANÇA? O QUE É HERANÇA? n Herança é um mecanismo que permite a uma classe herdar todo o comportamento e os atributos de outra classe. n Uma classe que herda de outra classe é chamada subclasse e a classe que fornece a herança é chamada superclasse. O QUE É HERANÇA? n n n n A classe A é a superclasse de B A classe B é uma subclasse de A A classe B é a superclasse de C, D e E As classes C, D e E são subclasses de B HERANÇA n As superclasses definem atributos e métodos genéricos que são herdados pelas classes derivadas. n Um método herdado de uma superclasse pode ser redefinido pela classe derivada, mantendo o mesmo nome mas agindo de forma diferente. n Normalmente os atributos de um objeto só podem ser consultados ou modificados através dos seus métodos (accessor methods). HERANÇA EM JAVA n Java adota o modelo de árvore n A classe Object é a raiz da hierarquia de classes à qual todas as classes existentes pertencem; n Quando não declaramos que uma classe estende outra, ela, implicitamente, estende Object HERANÇA EM JAVA n Uma classe Java estende apenas uma outra classe (herança simples ou única) n Para criar uma sub-classe, usamos a palavra reservada extends HERANÇA EM JAVA n Como os métodos são organizados em uma hierarquia de classes: HERANÇA EM JAVA n Funcionamento quando uma subclasse define um método que possui o mesmo nome, tipo de retorno e argumentos que um método definido em uma superclasse. HERANÇA EM JAVA EXEMPLO DE HERANÇA EM JAVA SOBRECARGA E ANULAÇÃO n Sobrecarga de Métodos (overloading) • Definir mais de um método com mesmo nome mas com assinaturas (parâmetros) diferentes. n Anulação de Métodos (overriding) • Definir um novo método com mesmo nome e assinatura de outro de uma superclasse. n Métodos final não podem ser sobrepostos. EXEMPLO DE SOBRECARGA E ANULAÇÃO THIS e SUPER n Usados quando for necessário referenciar explicitamente a instância (this) ou a superclasse (super). CONTROLE DE ACESSO: ‘PROTECTED’ Java permite declararmos um membro (método ou atributo) que, embora não seja acessível por outras classes, é herdado por suas sub-classes n Para isso usamos o modificador de controle de acesso protected n RESUMO DE VISIBILIDADE n Resumindo: • private: membros que são vistos só pela própria classe e não são herdados por nenhuma outra • public: membros são vistos e herdados por qualquer classe • protected: membros que são vistos pelas classes do pacote e herdados por qualquer outra classe • package: membros que são vistos e herdados pelas classes do pacote ESPECIALIZAÇÃO X EXTENSÃO Uma classe pode herdar de outra para especializá-la redefinindo métodos, sem ampliar sua interface n Uma classe pode herdar de outra para estendê-la declarando novos métodos e, dessa forma, ampliando sua interface. n As duas coisas podem acontecer simultaneamente n POLIMORFISMO n Polimorfismo – as definições clássicas (e confusas) de polimorfismo são: A - “Capacidade que uma operação [método] assumir mais de uma implementação em classes diferentes” e B - “Capacidade de um determinado atributo referenciar objetos de diferentes tipos, assumindo assim várias formas” POLIMORFISMO nA situação “A” significa que se considerarmos uma hierarquia de classes as diferentes subclasses podem redefinir um determinado método da classe pai (ou base). n A situação “B” significa que podemos ter um atributo (ou variável) definido como do tipo base, mas referenciando objetos das subclasses. POLIMORFISMO n A importância do polimorfismo está no fato de que, em determinadas circunstâncias, podemos ter um atributo (ou variável) do tipo base referenciado objetos das classes derivadas [B] e executaremos um método definido na classe base porém redefinido nas subclasses [A]. POLIMORFISMO n É a capacidade de um objeto tomar várias formas n A capacidade polimórfica decorre diretamente do mecanismo de herança n Ao estendermos ou especializarmos uma classe, não perdemos compatibilidade com a superclasse POLIMORFISMO n Exemplo • Veículo é uma superclasse n Automóvel é subclasse de veículo • class Veiculo{...} • class Automovel extends Veiculo {...} n Sempre que precisarmos de um Veículo, podemos usar um Automóvel, ou um Caminhão, ou Ônibus em seu lugar POLIMORFISMO n Podemos criar um vetor de Veículos. Este poderá conter Automóveis: Veiculo [ ]veiculos = new Veiculo[5]; Veiculos[0] = new Veiculo(); Veiculos[1] = new Automovel(“JKL5098”); POLIMORFISMO n Exemplo: – public class Employee {} – public class Manager extends Employee – { private String department;} – Employee e = new Manager(); (OK) – e.department = “Financeiro”; (ERRADO) POLIMORFISMO n Polimorfismo é o nome formal para o fato de que, quando precisamos de um objeto de determinado tipo, podemos usar uma versão mais especializada dele. Esse fato pode ser bem entendido analisando-se a árvore de hierarquia de classes. OPERADOR ‘INSTANCEOF’ n Java mantém informações de tipo em tempo de execução e nos permite consultá-las através do comando instanceof Veiculo vc = new Veiculo( ); boolean b = vc instanceof Automovel; // b = false OPERADOR ‘INSTANCEOF’ n Utilizado para saber o real tipo do objeto usado. CONVERSÃO DE TIPOS n Exemplos: STRING ⇒ VALOR NUMÉRICO String str = "34"; int num_int = Integer.parseInt(str); float num_float = Float.parseFloat(str); double num_double = Double.parseDouble(str); VALOR NUMÉRICO ⇒ STRING String valor_str = Integer.toString(num_int); Float.toString(num_float); Double.toString(num_double); CLASSES ABSTRATAS n Ao criarmos uma classe para ser estendida, às vezes, codificamos alguns métodos para os quais não sabemos dar uma implementação, ou seja, um método que só subclasses saberão implementar. n Uma classe deste tipo não pode ser instanciada pois sua funcionalidade está incompleta. Tal classe é dita abstrata. CLASSES ABSTRATAS EM JAVA n Java suporta o conceito de classes abstratas: podemos declarar uma classe abstrata usando o modificador abstract. n Métodos podem ser declarados abstratos para que suas implementações sejam adiadas para as subclasses. Da mesma forma, usamos o modificador abstract e omitimos a implementação desse método. CLASSES ABSTRATAS EM JAVA INTERFACES Java não permite herança múltipla com herança de código n Java implementa o conceito de interface n É possível herdar múltiplas interfaces n Em Java, uma classe estende uma outra classe e implementa zero ou mais interfaces n Para implementar uma interface em uma classe, usamos a palavra implements n INTERFACES INTERFACES n Uma vez que uma interface não possui implementação, devemos notar que: • seus campos devem ser públicos, estáticos e constantes • seus métodos devem ser públicos e abstratos n Como esses qualificadores são fixos, não precisamos declara-los (note o exemplo anterior) Enumerações n enum • Permitem criar um novo tipo de dado parecido com um primitivo que recebe um conjunto de constantes ordenadas e separadas por “,” • Exemplo üenum Meses { Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez }; Enumerações n “Tá, mas... Pra que eu quero isso ??” n Enumerações simplificam o trabalho de criar certos domínios que não precisam estar em banco de dados, como por exemplo constantes que definem mensagens do sistema, status de objetos, entre outros. Enumerações n Quando usamos enumerações não precisamos comparar com números inteiros, o próprio nome da constante definida é utilizado. n Exemplo: • if ( mes == Meses.Jan) ... Enumerações n Mas não é só isso ! Em Java você ainda recebe uma incrível forma de criar enumerações com objetos ! É isso mesmo! Com direito a atributos e métodos! n Ligando agora você ainda recebe esse incrível kit compilador, ele até flutua na água ! Enumerações public enum Mes { Jan(“Janeiro”, “01”), Fev(“Fevereiro”, “02”), Mar(“Março” , “03”), Abr(“Abril”, “04”), Mai(“Maio”, “05”), Jun(“Junho”, “06”); private final String nome; private final String numero; Mes(String n, String num) { nome = n; numero = num; } public String getNome() { return nome; } public String getNumero() { return numero; } } Enumerações public class TestaMes { public static void main(String args[]) { for (Mes m : Mes.values()) { System.out.println(m + “ ” + m.getNome() + “ ” + m.getNumero()); } } } n Mas que for é esse ?? Collections nÉ um conjunto de classes e interfaces do pacote java.util que fornecem inúmeras facilidades para trabalhar com coleções de objetos n Existem vários algoritmos de ordenação e detalhes no uso de Collections. Vamos ver as principais características para o uso de coleções. Collections n Collections é uma interface que conta com os seguintes métodos : • isEmpty() – indica se a coleção está vazia • contains(Object o) – true/false para o caso da coleção conter o objeto • iterator() – retorna o objeto para iteração pela coleção Collections – percorrendo import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class TesteCollections { public static void main(String[] args) { ArrayList a = new ArrayList(); percorre(a); } private static void percorre(Collection c) { Iterator i = c.iterator(); while(i.hasNext()) { System.out.println(i.next()); } } } Collections – ArrayList n Permite a criação de um “Array” que funciona como uma lista. A grande vantagem é que pode aumentar o tamanho de forma automática, não é estático como os arrays tradicionais. n Além disso, é recomendado para criarmos uma Lista de objetos de um determinado tipo. Collections – ArrayList n Principais métodos: • add(Object o) – adiciona o objeto passado • add(int i, Object o) – adiciona o objeto na posição indicada. • clear() – limpa o arraylist • get(int i) – retorna o objeto na posição passada • remove(int i) – remove o objeto na posição indicada • size() – retorna o tamanho do arraylist ArrayList - Exemplo List<Funcionario> list = new ArrayList <Funcionario>( ); list.add(new Funcionario(nome,endereco,telefone,estado) ); Funcionario f; for (int i = 0; i < list.size(); i++) { f = list.get(i); f.aumentarSalario(30); } Collections – HashMap n n n Permite criar um hash onde teremos pares de chave/valor. Podemos incluir objetos com suas chaves e as chaves não serão repetidas. Além disso aceita null como chave. Permite retornar um iterator para percorrermos tanto chaves quanto valores. Collections – HashMap n Principais métodos: • containsKey(Object o) – verifica se o objeto passado é uma chave • containsValue(Object o) – verifica se o objeto passado é um valor • get(Object key) – retorna o valor da chave passada • put(Object key, Object val) – insere na chave key o valor val. • values() – retorna uma Collection com os valores • keySet() – retorna um Set com as chaves (permite o iterator) Collections – percorrendo import java.util.Collection; import java.util.HashMap; import java.util.Iterator; public class TesteHashMap { public static void main(String[] args) { HashMap hm = new HashMap(); hm.put("primeiro", 1); hm.put("segundo", 2); System.out.println("containsKey(primeiro)" + hm.containsKey("primeiro")); System.out.println("containsValue(segundo)" + hm.containsValue("segundo")); System.out.println("get(primeiro)" + hm.get("primeiro")); System.out.println("put(terceiro, 3)" + hm.put("terceiro",3)); Collection c = hm.values(); percorre(c); Collection c2 = hm.keySet(); percorre(c2); } private static void percorre(Collection c) { Iterator i = c.iterator(); while(i.hasNext()) System.out.println(i.next()); } } Tratamento de Exceções O tratamento de exceções é uma importante etapa do desenvolvimento de software. n Em outras linguagens esse mecanismo é complexo e/ou confuso. n Em Java usamos um bloco try/catch que “tenta” executar um conjunto de instruções e caso aconteça uma exceção ele a “pega” e provê o tratamento adequado. n Tratamento de Exceções Os blocos try/catch são complementados pelos blocos finally (que são opcionais). n Blocos finally são *sempre* executados, somente uma instrução System.exit() pode impedir um bloco finally de executar. n Usamos blocos finally para executar instruções de “limpeza” tal como fechar statements, resultsets e conexões a banco. n Tratamento de Exceções public int getInteiro() { int i = 0; try { String str = JOptionPane.showInputDialog (“digite um numero”); i = Integer.parseInt(str); } catch (NumberFormatException e) { System.out.println(“string nao pode ser convertida”); i = -1; } finally { System.out.println(“esta e a ultima parte”); } return i; } Java – Datas n Usamos as seguintes classes: • Calendar • Date • DateFormat n As datas são contadas a partir de January 1, 1970 00:00:00.000 GMT (Gregorian) baseado no padrão POSIX n Procurem na Internet – problemas com o ano 2038... Java – Datas n A classe Calendar não pode ser instanciada diretamente, para isso usamos o método getInstance() como a seguir : Calendar c = Calendar.getInstance(); n Com esta instancia em mãos temos a representação do instante em que o código foi executado e podemos referenciar data e hora Java – Datas n Uma atividade comum é usar o método getTimeInMillis() para recuperar o instante atual em milissegundos para contabilizar quanto tempo uma certa atividade tomou: long l = c.getTimeInMillis(); n Se fizermos isso antes e depois de uma determinada tarefa, podemos subtrair os tempos obtidos, mas medir uma única instrução pode não gerar diferença. Java – Datas n Na classe Calendar ficam definidas várias constantes que permitem acessar as informações relativas a dia, mês, ano, hora, minutos, segundos entre outros. Calendar public static void main (String args[]) { Calendar c = Calendar.getInstance(); System.out.println(c.get(Calendar.DAY_OF_MONTH)); System.out.println(c.get(Calendar.DAY_OF_WEEK)); System.out.println(c.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println(c.get(Calendar.DAY_OF_YEAR)); System.out.println(c.get(Calendar.HOUR)); System.out.println(c.get(Calendar.HOUR_OF_DAY)); System.out.println(c.get(Calendar.MINUTE)); System.out.println(c.get(Calendar.MILLISECOND)); System.out.println(c.get(Calendar.MONTH)); System.out.println(c.get(Calendar.SECOND)); System.out.println(c.get(Calendar.WEEK_OF_MONTH)); System.out.println(c.get(Calendar.WEEK_OF_YEAR)); System.out.println(c.get(Calendar.YEAR)); } Java – DateFormater n Para formatar uma String como Date ou converter um Date para String usamos a classe DateFormater. DateFormater public static void main (String args[]) { Calendar c = Calendar.getInstance(); DateFormat df = DateFormat.getDateInstance(DateFormat.FULL); // podemos usar FULL, LONG, MEDIUM ou SHORT System.out.println(df.format(c.getTime())); try { df = DateFormat.getDateInstance(DateFormat.SHORT); c.setTime(df.parse("05/05/2007")); c.set(Calendar.HOUR,13); c.set(Calendar.MINUTE,15); df = DateFormat.getDateInstance(DateFormat.SHORT); System.out.println(df.format(c.getTime())); System.out.println(df.parse("05/05/2006")); df = DateFormat.getTimeInstance(DateFormat.SHORT); System.out.println(df.format(c.getTime())); System.out.println(df.parse("10:10 pm")); df = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT); System.out.println(df.format(c.getTime())); System.out.println(df.parse("05/05/2006 10:34 am")); } catch (ParseException e) { e.printStackTrace(); } } Exercício n Escreva um programa que receba uma data de nascimento (formato americano) através de um JOptionPane e calcule a idade em segundos.