Elementos Básicos da Linguagem Java Prof. Ricardo Linden Programação Orientada a Objeto Java Básico 1 Conceitos básicos do Java • Java é uma boa linguagem de programação, mas não é a panacéia para todos os males computacionais do mundo. • Núcleo da linguagem bastante estável melhoramentos ocorrem em sua maioria nas bibliotecas Compatibilidade Retroativa! Programação Orientada a Objeto - Java Básico 2 Vantagens da Linguagem Java • Independência de plataforma Sintaxe similar à linguagem C++ • Linguagem totalmente orientada a objetos • Linguagem menos sujeita a erros de programação Fim da alocação de liberação manuais de memória Fim da aritmética de ponteiros Fim da confusão da atribuição com o teste de igualdade Fim da herança múltipla Programação Orientada a Objeto - Java Básico 3 Palavras chaves do Java • Simples – Nós quisemos elaborar um sistema que pudesse ser programado facilmente sem muito treinamento esotérico e que facilitasse a prática padrão atual. Assim, embora achássemos que a linguagem C++ não fosse adequada, nós projetamos a linguagem Java o mais parecida possível com o C++ a fim de tornar o sistema mais compreensível. Java omite recursos raramente usados e pouco compreendidos do C++ que, em nossa experiência, trazem mais dificuldades que benefícios. Programação Orientada a Objeto - Java Básico 4 Palavras chaves do Java • Orientada a objeto – Definido de forma simples, um projeto orientado a objetos é um atécnica de programação que concentra-se nos dados e nas interfaces de projetos. (...) Os recursos de programação orientada a objetos da linguagem Java são, essencialmente, os da linguagem C++. Programação Orientada a Objeto - Java Básico 5 Palavras chaves do Java • Distribuída – A linguagem Java tem uma biblioteca extensa de rotinas para lidar com protocolos TCP/IP, como o HTTP e o FTP. Os aplicativos Java podem abrir e acessar objetos na Internet através de URLs com a mesma facilidade com que se acessa um arquivo no sistema local. Programação Orientada a Objeto - Java Básico 6 Palavras chaves do Java • Robusta – Java tem a intenção de escrever programas que precisam ser confiáveis de várias formas. O Java coloca muita ênfase na verificação antecipada de possíveis problemas, na verificação dinâmica em tempo de execução e na eliminação de situações sujeitas a erros. A única e grande diferença entre o Java e o C++ está em que o Java usa um modelo de ponterios que elimina a possibilidade de sobrescrita de memória e conseqüente destruição de dados. Programação Orientada a Objeto - Java Básico 7 Palavras chaves do Java • Segura – A linguagem Java tem a intenção de ser usada em ambientes de rede/distribuídos. Nesta direção, grande ênfase tem sido colocada na segurança. O Java permite a construção de sistemas livres de vírus e adulterações. Programação Orientada a Objeto - Java Básico 8 Palavras chaves do Java • Arquitetura Neutra – O compilador gera um formato de arquivo objeto neutro em relação à arquiteura - o código compilado é executável em muitos processadores, dada a presença do sistema Java em tempo de execução. O compilador Java daz isso gerando instruções em bytecodes que nada têm a ver com uma arquitetura particular de um computador específio. Em vez disto, elas são projetadas para serem fáceis de interpretar em qualquer máquina e convertidas facilmente para o código nativo da máquina em tempo real. Programação Orientada a Objeto - Java Básico 9 Palavras chaves do Java • Portável – Diferente das linguagens C e C++, não há aspectos “dependentes da implementação” na especificação da linguagem Java. Os tamanhos dos tipos de dados primitivos são especificados, assim como o comportamento da aritmética que os utiliza. Programação Orientada a Objeto - Java Básico 10 Palavras chaves do Java • Interpretada – O interpretador Java pode executar bytecodes Java diretamente em qualquer máquina para a qual tenha sido escrito. Como a ligação é um processo mais incremental e leve, o processo de desenvolvimento pode ser muito mais rápido e exploratório. Programação Orientada a Objeto - Java Básico 11 Palavras chaves do Java • Alto desempenho – Embora o desempenho dos bytecodes interpretados seja geralmente mais do que adequado, há situações em que é necessário um desempenho superior. Os bytecodes podem ser convertidos em tempo real para o código de máquina da CPU particular onde o aplicativo está executando. Programação Orientada a Objeto - Java Básico 12 Palavras chaves do Java • Múltipla execução – Os benefícios das múltiplas linhas d execução (threads) são melhor capacidade de resposta interativa e melhor comportamento em tempo real de execução. Programação Orientada a Objeto - Java Básico 13 Índice de temas •Palavras chaves •Literais •Statements •Constantes •Expressões •Operadores •Separadores •Comentários •Strings •Objetos •Arrays •Identificadores Programação Orientada a Objeto - Java Básico 14 Estrutura básica de um programa Java • Um programa Java básico tem uma estrutura similar à seguinte: Existe uma associação de pacote c/ diretório package <nome_pacote>; import <classes_importadas>; Equivalentes às bibliotecas do C Todo programa Java é uma coleção de classes, ao menos uma das quais é pública e tem um função main class <nome_classe> { public static void main (String[] args) A função main é onde começa: o processamento em Java Mais a frente nós veremos : tudo isto com mais detalhes } } Programação Orientada a Objeto - Java Básico 15 Palavras Chave • As palavras chaves do Java são palavras reservadas. – Isto quer dizer que não podem ser usadas em nenhum outro contexto que não aquele para o qual foram definidas. – Isto quer dizer que não podem ser usadas como nomes de variáveis, classes ou métodos. • Combinadas com a sintaxe dos operadores e separadores formam a definição da linguagem Java. Programação Orientada a Objeto - Java Básico 16 Palavras Chave do Java abstract boolean break byte byvalue case cast catch char class const continue default do double else extends false final finally float for future generic goto if implements import inner instanceof int interface long native new null operator outer package private protected public rest return short static super switch synchronized this throw throws transient true try var void volatile while Programação Orientada a Objeto - Java Básico 17 Palavras Chaves do Java Como no C, o núcleo da linguagem é relativamente pequeno, sendo extendido usandose bibliotecas (neste caso, de classes) Entretanto, não se espera que se decore todas as palavras chaves imediatamente. Com o tempo e o uso, elas vão aos poucos entrando em nossa cabeça. Programação Orientada a Objeto - Java Básico 18 Statements • Todo programa Java é composto de statements. • Todas as statements são sensíveis a caso • Todas as statements teminam com um ponto-e-vírgula (;). • As statements são similares àquelas do C. • Statements mais importantes : – atribuições – declarações de variáveis – estruturas de repetição – condicionais Programação Orientada a Objeto - Java Básico 19 Identificadores • Identificadores são usados para nomear variáveis, classes, métodos e quaisquer outros elementos do Java. • Um identificador pode ser montado de acordo com as seguinte regras: – O primeiro caracter deve ser uma letra. – A partir da segunda posição, pode-se usar livremente letras ou numerais. – O sublinhado (_) e o cifrão ($) são considerados letras e podem ser usadas em qualquer posição, incluindo a primeira. • É de bom alvitre utilizar nomes descritivos. – Salario é mais compreensível do que s – ClasseAutomovomeis é mais compreensível do que CA1 Programação Orientada a Objeto - Java Básico 20 Exemplos de Identificadores • Válidos: – xpto – x123 – $123 $ e _ são considerados como letras – _x • Inválidos – 1xpto Identificadores têm que começar com letras – x-y – x^ Uso de caracteres inválidos – y@ Programação Orientada a Objeto - Java Básico 21 Convenções usadas normalmente para nomes • Classes: Primeira letra maiúscula, resto minúsculo • Métodos e variáveis de objetos públicos : primeira letra minúscula e maiúscula para próxima palavra descritiva parseInt, nextItem, currentValue, taxRate • Variáveis locais e privadas: letras minúsculas e sublinhado next_value, temp_value • Constantes (final) : tudo maiúsculo TAXRATE_CA, CURRENCY_US Programação Orientada a Objeto - Java Básico 22 Tipos Primitivos de Dados • Existem exatamente oito tipos primitivos de dados em Java • Quatro representam inteiros: – byte, short, int, long • Dois representam números em ponto flutuante: – float, double • Um para representar caracteres: – char • Um para representar valores lógicos (booleanos) : – boolean Programação Orientada a Objeto - Java Básico 23 Tipos Primitivos Numéricos • A diferença entre os vários tipos numéricos primitivos é o seu tamanho e conseqüentemente os valores que eles podem armazenar: Tipo Tamanho Valor Mínimo Valor Máximo byte short int long 8 bits 16 bits 32 bits 64 bits -128 -32,768 -2,147,483,648 < -9 x 1018 127 32,767 2,147,483,647 > 9 x 1018 float double 32 bits 64 bits +/- 3.4 x 1038 com 7 dígitos significativos +/- 1.7 x 10308 com 15 dígitos significativos Programação Orientada a Objeto - Java Básico 24 Caracteres • Uma variável do tipo char armazena um único caracter do conjunto de caracteres Unicode • Um conjunto de caracteres é uma lista ordenada de caracteres e cada caracter corresponde a um único número • O conjunto de caracteres Unicode usa 16 bits por caracter, permitindo armazenar 65,536 caracteres diferentes • É um conjunto de caracteres internacional, contendo símbolos e caracteres de várias línguas mundiais (mas não todas ) Programação Orientada a Objeto - Java Básico 25 Caracteres • O conjunto de caracteres ASCII é mais velho e menor que o Unicode, mas ainda é bastante popular. • Os caracteres ASCII são um subconjunto dos caracteres Unicode, incluindo: Letras maiúsculas Letras minúsculas Pontuação Dígitos Símbolos especiais Caracteres de Controle A, B, C, … a, b, c, … ponto, ponto-e-vírgula, … 0, 1, 2, … &, |, \, … carriage return, tab, ... Programação Orientada a Objeto - Java Básico 26 Importante • Atenção, programadores de C: Em Java não existem tipos unsigned O tipo char não é um tipo numérico - para converter de char para inteiro precisamos de um cast explícito. Programação Orientada a Objeto - Java Básico 27 Boolean • Um valor boolean representa uma condição verdadeira ou falsa • Um boolean pode ser usado também para representar dois estados, tais como ter uma lâmpada estar ligada ou desligada. • As palavras reservadas true e false são os únicos valores válidos para o tipo boolean boolean done = false; Programação Orientada a Objeto - Java Básico 28 Expressões • Uma expressão é a forma mais simples de statement em Java. • É uma combinação de operadores e operandos. • São usadas, por exemplo, no lado direito de atribuições e como parte de testes em statements condicionais. • Atribuições : <lado_esquerdo> = <expressão> – onde <lado_esquerdo> é uma variável ou atributo. Programação Orientada a Objeto - Java Básico 29 Expressões • Exemplos : – yearEndBalance = 1788.555 –x=2+3*4 – objeto1.atributo1=2*x/y; •E se y for igual a zero? •Geraremos uma exceção •Aprenderemos a tratá-las mais tarde! Programação Orientada a Objeto - Java Básico 30 Operadores • Como dissemos antes, uma expressão é uma combinação de operandos e operadores para executar uma operação • Operandos : variáveis, valores literais ou expressões (definição recursiva!). • Operadores : símbolos especiais para realizar operações aritméticas e lógicas. Programação Orientada a Objeto - Java Básico 31 Operadores Aritméticos • Java tem quatro operadores matemáticos básicos (+, -, *, /) e um operador de módulo (%) para realizar a aritmética básica: Operador + * / % Significado Adição Subtração Multiplicação Divisão Módulo Programação Orientada a Objeto - Java Básico Exemplo 3+4 5-7 5*5 14 / 7 20 % 7 32 Operadores Aritméticos de Atribuição • Cada uma das operações aritméticas tem uma forma associada que tem uma atribuição associada que simplifica um tipo expecífico de operação • Forma geral: variável operador = expressão • Equivale a: variável = variável operador expressão Operador += -= *= /= %= Significado Atribuição c/ adição Atribuição c/ subtração Atribuição c/ multiplicação Atribuição c/ divisão Atribuição c/ módulo Programação Orientada a Objeto - Java Básico Exemplo a += 5 (a = a + 5) b -= 3 (b = b - 3) c *= 2 (c = c * 2) d /= 7 (d = d /7) e %= 10 (e = e % 10) 33 Operadores incremento e decremento • Assim como em C e C++, os oepradores ++ e -- podem ser usados para incrementar ou decrementar o valor de uma variável em 1. • Por exemplo, a++ incrementa em 1 o valor de a, como se fizéssemos a = a + 1. • Os operadores incremento e decremento podem ser prefixados ou pós-fixados; isto é, o ++ ou o -- podem aparecer antes ou depois dos valores a serem incrementados ou decrementados. • O comportamento de ambas é distinto: no caso pré-fixado, primeiro incrementa (ou decrementa) e depois usa o valor enquanto que no pós-fixado, o incremento (ou decremento) é feito a posteriori. Programação Orientada a Objeto - Java Básico 34 Operadores incremento e decremento package exemplos; import java.lang.*; public class Class3 { public static void main (String[] args) { int a,b; a=5; b=1+ ++a; System.out.println("b="+b); System.out.println("a="+a); a=5; b=1+a++; System.out.println("b="+b); System.out.println("a="+a); } } Programação Orientada a Objeto - Java Básico 35 Operadores de Comparação • Java tem vários operadores para testar igualdade e magnitude. Todas estas expressões retornam uma valor lógico(verdadeiro ou falso) Operador < > <= >= == != Significado Menor que Maior que Menor ou igual que Maior ou igual que Igual Diferente Exemplo x<3 x>3 x <= 3 x >= 3 x == 3 x != 3 Não valem para objetos (que são ponteiros) nem para strings (que são classes) Programação Orientada a Objeto - Java Básico 36 Operadores Lógicos • Expressões que resultam em valores lógicos podem ser combinados usando os operadores lógicos – Operadores de comparação – Variáveis lógicas – Funções que retornem valores lógicos – etc. Resultado • Estão disponíveis: Operador & | ^ && || ! AND lógico OR lógico XOR lógico (ou exclusivo) AND “curto circuitado” OR “curto circuitado” NOT unário lógico Programação Orientada a Objeto - Java Básico 37 Operações lógicas curto-circuitadas • Usando &&, se o lado esquerdo da expressão for falso, toda a expressão é assumida falsa. O mesmo vale para o || quando o lado esquerdo é assumido como verdadeiro. • Um caso interessante evitado é quando o lado direito da expressão gera um erro - usando operadores curto-circuitados, este erro é evitado. • Exemplo: if (demo != 0 && num / demon > 10) if (demo != 0 & num / demon > 10) error message: java.lang.ArithmeticException: / by zero Programação Orientada a Objeto - Java Básico 38 Avaliação de expressões • Há três fatores de avaliação, em ordem: – Precedência do operador : algumas operações têm precedência sobre outras. – Associatividade do operador: se houver empate na regra acima, vê-se qual é a associatividade de operadores de precedência igual. – Regras de ordem de avaliação: dizem não quando os operadores são avaliados, mas sim quando os operandos são avaliados. Programação Orientada a Objeto - Java Básico 39 Precedência de operadores Operador [] () */% +<< >> >>> < > <= >= == != & ^ | && || ?: = op= Descrição Chamada de funções, arrays e parênteses em expressões Multiplicação, divisão e módulo Adição e subtração Shift de bits (multiplicação por potências de 2) Testes de comparação lógicos Testes de igualdade AND XOR OR AND lógico OR lógico versão mais curta do if...then...else operadores de atribuição Programação Orientada a Objeto - Java Básico 40 Associatividade de operadores • Os operadores aritméticos Java (e suas versões do mundo real) são associativos da esquerda para a direita. • Isto significa que se o mesmo operador aparece mais de uma vez na expressão, a ocorrência mais à esquerda é avaliada primeiro, seguida por aquela da direita, e assim por diante. • Exemplos: – x=a+b+c – y=a*b*c Não se aplica o conceito (não é o mesmo operador) – z=a+b*c Vocês se lembram de algum operador da vida real que não segue esta regra? Programação Orientada a Objeto - Java Básico 41 Ordem de avaliação • Para todos os operadores binários, o operando à esquerda é avaliado antes do operando à direita do operador. • Todos os operandos são avaliados integralmente antes do operador ser avaliado. • Se vários argumentos são mandados para um método/procedimento, eles são avaliados da esquerda para a direita. • Exemplos – a = x + y == 4 | a * b == 5 – Celsius = Fahrenheit – 32 * 5 / 9 – Celsius = ( Fahrenheit – 32 ) * 5 / 9 Programação Orientada a Objeto - Java Básico 42 Literais • Um literal é um valor que é colocado diretamente no código, que respeita a regra de que “o que você digita é o que você obtém.” • Um literal consiste em uma constante que tem um tipo de dados associado a ele. • Estes tipos podem ser: – Inteiros: usados para representar números inteiros (subconjunto de Z). – Ponto flutuante: representa números decimais com componentes fracionários (subconjunto de Q). – Booleanos: também chamados de lógicos, representam os valores true (verdadeiro) ou false (falso). – Caracter: são expressados por um único caracter cercado por aspas simples (plics). – String: são combinações de caracteres. Em Java strings são uma classe que será discutida com todo o cuidado mais à frente. Programação Orientada a Objeto - Java Básico 43 Literais Numéricos • Literais inteiros são representados simplesmente por uma seqüência de dígitos. Exemplos: – 123 ; -345 ; 2846556 ; 0 ; etc. • Já literais de ponto flutuante normalmente têm duas partes : a parte inteira e a parte fracionária. • Pode-se forçar um número inteiro a ser do tipo ponto flutuante colocando-se a letra f (ou F) ao fim daquele número. • Também podemos usar notação científica, definindo um expoente antecedido pela letra e ou E • Exemplos: – Notação padrão: 1003.45 ; 2f ; -13.873 – Notação científica: 1.00345e3 ; 0.345E+11 ; 00345e-2 ; .00100345e6 ; etc. Programação Orientada a Objeto - Java Básico 44 Literais booleanos • Usados para representar valores lógicos • As palavras chave, true e false, podem ser usadas em qualquer lugar que for necessário usar um valor lógico. • Estes são os dois únicos valores que podem ser assumidos por uma variável booleana. É importante entender que não há correspondência entre valores lógicos e numéricos, como havia no C. Programação Orientada a Objeto - Java Básico 45 Literais Caracter • Um literal caracter é representado por um caracter dentro de um par de aspas simples (‘ ‘). • Exemplos: ‘a’ ; ‘z’ ; ‘9’ (diferente do número 9) • Alguns caracteres não visíveis, tais como o enter e o backspace, são representados, como em C, pelos caracteres de escape : – – – – – – – – \n \t \b \r \f \\ \’ \” CRLF Tab Backspace CR Form feed Barra invertida Aspas simples Aspas duplas Programação Orientada a Objeto - Java Básico 46 Literais strings • Um literal do tipo string é criado colocando-se qualquer texto entre aspas duplas. • Exemplos: – “abc” – “a” – “” – etc. • O interpretador Java automaticamente cria um objeto da classe String usando o valor do literal string como o valor armazenado neste objeto. A classe string será vista com detalhes! Programação Orientada a Objeto - Java Básico 47 Constantes • Como em todas as linguagens de programação, Java permite que definamos constantes que recebem um nome para evitar utilização de valores literais. • Afinal, é mais fácil entender porque o programador quis dizer quando ele usou C_SALARIO_MAXIMO do que quando ele usou 25000, não é mesmo? • Para definir que um identificador é uma constante, basta colocar a palavra chave final em frente a ele. Programação Orientada a Objeto - Java Básico 48 Constantes • Logo, a sintaxe fica final datatype CONSTANTNAME = VALUE; • Exemplos: final double PI = 3.14159; final int SIZE = 3; Programação Orientada a Objeto - Java Básico 49 Separadores Símbolo () {} [] ; , . Nome parênteses chaves colchetes ponto-e-vírgula vírgula Ponto Propósito precedência definição de métodos, blocos de código. vetores fim de statement identificadores consecutivos separador de pacote, classes, métodos e variáveis. Programação Orientada a Objeto - Java Básico 50 Comentários • Os símbolos /* e */ cercam comentários de múltiplas linhas e todo o texto entre eles é devidamente ignorado: /* This is the beginning of my Java program. ... Please read it carefully ... */ • Estes comentários não podem ser aninhados, isto é, não pode haver um comentário dentro de um comentário • Barras duplas (//) podem ser usados para uma única linha de comentário. Todo o texto daquele ponto até o fim da linha será ignorado pelo interpretador. taxrate = 0.075 // The tax rate for L.A. County Comentários com // têm a vantagem de servir quando usarmos Javadoc Programação Orientada a Objeto - Java Básico 51 Objetos • Vamos começar agora a ver os conceitos de objetos. • Não vamos ver profundamente, mas sim entender como as variáveis se relacionam com os objetos Veremos depois os conceitos de classes e orientação a objetos Programação Orientada a Objeto - Java Básico 52 Criando Objetos • Uma variável armazena um tipo primitivo ou uma referência para um objeto • Um nome de classe pode ser usado como um tipo para declarar uma variável de referência a um objeto String title; • Nenhum objeto foi criado com esta declaração • Assim como um ponteiro, uma variável de referência a um objeto armazena o endereço do objeto. • O objeto deve ser criado separadamente usando as declarações apropriadas. Programação Orientada a Objeto - Java Básico 53 Criando Objetos • Nós usamos o operador new para criar um objeto title = new String ("Java Software Solutions"); Este operador chama o construtor da classe String, que que é um método especial para inicializar o objeto • O ato de criar um objeto é chamado de instanciação • Um objeto é chamado de instância de uma classe particular Programação Orientada a Objeto - Java Básico 54 Criando Objetos da classe String • Dado que as strings são muito comuns, não precisamos usar o operador new para criar um objeto da classe String title = "Java Software Solutions"; • Esta é uma sintaxe especial que funciona apenas para as strings. • Uma vez que um objeto foi instanciado, podemos usar o operador ponto (dot operator) para chamar seus métodos title.length() Programação Orientada a Objeto - Java Básico 55 Métodos da classe string • A classe String tem vários métodos úteis para manipular strings, como por exemplo: – char charAt(int index) retorna o caracter na posição dada pelo índice – int compareTo(String str) compara a string com o parâmetro. O retorno é igual ao strcmp do C – String concat(String str) concatena a string com o parâmetro – boolean equals(String str) verifica se duas strings são iguais. Não podemos usar o sinal de igual para compará-las. – int length() retorna o comprimento da string. – String substring(int inicio, tam) retorna a string que começa na posição dada por início e tem comprimento tam. A primeira posição de uma string é zero (como em C) Programação Orientada a Objeto - Java Básico 56 Usando os métodos da classe String import javax.swing.JOptionPane; public class Max1 { public static void main (String[] args) { String senha=“Senha1”; String suaTentativa; int i=1; while ((i<=3)&&(!suaTentativa.equals(senha))) { suaTentativa=Integer.parseInt(JOptionPane.showInputDialog(“Senha:")); System.out.println(“Sua palavra tem ”+suaTentativa.length()+“letras”); i++; } if (i>3) {System.out.println(“Você não descobriu a senha.”); System.exit(0); } } Programação Orientada a Objeto - Java Básico 57 Usando os métodos da classe String • Lembre-se que quando usamos objetos, os métodos pertencem a eles • Algumas vezes os métodos pertencem às classes, mas isto veremos depois. • Logo, para chamar um método precisamos lembrar da sintaxe <objeto>.<método>({<parâmetros>}); Programação Orientada a Objeto - Java Básico 58 Usando os métodos da classe String • É isto que fizemos no exemplo: sempre que precisamos usar um método, precisávamos saber a quem este método se aplicaria. • Assim ,pudemos fazer as chamadas corretamente, sempre usando o formato: <objeto>.<método>({<parâmetros>}); • Exemplo : queremos saber o tamanho da string digitada. O método para isto é length(), mas a quem ele se aplica. • Resposta : ao objeto suaTentativa. Logo, a chamada correta é suaTentativa.length() Programação Orientada a Objeto - Java Básico 59 Bibliotecas de Classes • Uma biblioteca de classes é uma coleção de classes que podemos usar quando desenvolvemos programas. • Existe uma Biblioteca de Classes Padrão Java (standard class library) que é parte do ambiente de desenvolvimento Java. • As classes não são parte da própria linguagem Java, mas nós usamo-as fortemente. • Parecido com o que acontecia com o C! • O printf também não era parte da linguagem C padrão, mas sim de uma biblioteca. • Isto não impedia que nós o usássemos na maioria de nossos programas Programação Orientada a Objeto - Java Básico 60 Biblioteca de Classes • As classes System e String são parte da Biblitoeca Padrão Java. • Existem várias outras classes nesta biblitoeca. Vamos vendo-as aos poucos. • Outras bibliotecas podem ser criadas por vocês ou obtidas das mais diversas fontes, como no caso do livro texto ou de fornecedores que as vendem. Instalar uma classe é rapidinho : basta copiá-la para o HD e colocar seu diretório dentro da variável classpath Programação Orientada a Objeto - Java Básico 61 Pacotes • As classes na biblioteca padrão de classes estão organizadas em pacotes. • Pacotes são basicamente organizados em diretórios. • O ponto na declaração de import corresponde a um sub-diretório não podemos ter pontos nos nomes de classes. • Alguns dos pacotes na biblioteca padrão de classes são: Pacote Propósito java.lang java.applet java.awt javax.swing java.net java.util Suporte genérico Criação de applets para a web Interfaces gráficas e gráficos Componentes e capacidades gráficas adicionais Comunicação via rede Utilitários variados Programação Orientada a Objeto - Java Básico 62 Pacotes Vamos ver todos os pacotes no seu devido tempo! Programação Orientada a Objeto - Java Básico 63 A declaração import • Quando quisermos usar uma classe de um pacote, temos que usar seu nome completamente qualificado java.util.Random • Outra opção (a melhor delas!) é importar a classe usando uma declaração import no começo do programa e depois usar apenas o nome da classe import java.util.Random; • Para importar todas as classes em um determinado pacote, podemos usar o caracter de wildcard * (asterisco) import java.util.*; Programação Orientada a Objeto - Java Básico 64 A declaração import • Todas as classes no pacote java.lang são automaticamente importadas para nossos programas • Por isto não precisamos importar explicitamente este pacote ou qualificar completamente o nome das classes System ou String nos programas que usamos até agora. Programação Orientada a Objeto - Java Básico 65 Exemplo de Criação e Uso de Objetos import java.lang.*; class Ponto { int x,y; //Coordenadas de um ponto Ponto (int a, int b) {x=a; y=b;} Ponto () {x=0;y=0;} public double distancia (Ponto p); { int dx=this.x - p.x; int dy=this.y - p.y; return Math.sqrt(dx*dx+dy*dy);} } Construtor da classe (Método polimórfico) Como é uma classe pública, deve estar public class TestePonto { em um arquivo chamado TestePonto.java public static void main (String[] args) { Criação de um objeto (chamada Ponto p1=new Ponto(2,3); ao construtor da classe) Ponto p2=new Ponto(); System.out.println(p1.distancia(p2)); } } Programação Orientada a Objeto - Java Básico 66 Objetos em Java • Em Java, um objeto na verdade é um ponteiro para o seu conteúdo. • Ele funciona igual aos ponteiros em C, mas não têm a mesma “aparência” (eles agem como variáveis normais). • Seja a definição que vimos anteriormente Ponto p1=new Ponto(2,3); • A verdadeira representação do que acontece na memória é: p1 x 2 Objeto do tipo Ponto y 3 Programação Orientada a Objeto - Java Básico 67 Objetos em Java • Assim, imagine a seguinte seqüência de instruções Ponto p=new Ponto(2,3); Ponto b; b=a; b.y=b.x • Quanto vale a.y? Depois da criação de a x 2 a Logo, a.y=2 y 23 Depois da atribuição de b Depois da atribuição de b.y b Programação Orientada a Objeto - Java Básico 68 Mais objetos em Java • Assim, imagine a seguinte seqüência de instruções Ponto p=new Ponto(2,3); Ponto b; b=a; b=null; • Quanto vale a? Depois da criação de a x 2 a Logo, a permanece inalterado! y 3 Depois da 1a. atribuição de b b Depois da 2a. atribuição de b Programação Orientada a Objeto - Java Básico 69 Vetores (Arrays) • Um array é uma área contígua de memória que armazena zero ou mais elementos do mesmo tipo, endereçáveis através de um índice. meuArray Elemento1 Elemento2 Elemento3 Elemento4 • Assim como no C, os índices do array começam em zero e crescem. O primeiro elemento de um array é acessado como myArray[0] Ao contrário do C, arrays não são ponteiros disfarçados, pois não há ponteiros (explícitos) em Java Programação Orientada a Objeto - Java Básico 70 Arrays • Ao contrário do C, em Java os arrays são na realidade instâncias de objetos. O significado verdadeiro disto ficará claro mais à frente. • Existem duas maneiras de declarar um array: int[] integerArray; int integerArray2[]; Qual das duas é melhor? Use o segundo formato (int integerArray[]). É mais próximo ao C, logo mais compreensível para todos. Entretanto, muitas pessoas preferem o primeiro formato, logo vocês podem ver isto em códigos alheios. Programação Orientada a Objeto - Java Básico 71 Alocando um Array As declarações acima só criam a variável que se refere ao array, mas não aloca espaço para este. • Já que o array é um objeto, isto é esperado. Lembre-se que variáveis de objetos nada mais são que ponteiros disfarçados. • Nós temos que alocar espaço usando uma das seguintes maneiras: – Inicialização explícita – Usando o operador new Programação Orientada a Objeto - Java Básico 72 Alocando um Array • Se você inicializar explícitamente um array, o espaço necessário para ele é automaticamente alocado. int ponto[] = {4, 17, 13}; int ponto2[] = ponto; double velocidade[] = {12.1, 55.2, 70.4, 6}; ponto ponto2 4 17 13 Programação Orientada a Objeto - Java Básico 73 Alocando um Array • Se você não alocar espaço usando inicialização explícita, você pode fazê-lo usando o operador new. • Este operador aloca um pedaço contíguo de memória para armazenar os dados do array. int meuArray[] = new int[5]; double velocidade[] = new double[3]; • Usando o operador new, não é necessário inicializar os elementos do array. O JDK inicializa todos os elementos de arrays numéricos com zeros, mas não se deve confiar nisto. Programação Orientada a Objeto - Java Básico 74 Alocando um Array • Note-se que o seguinte C-ismo não é permitido em Java: int myArray[10]; Você receberá um erro de compilação se tentar fazer isto. As únicas maneiras de alocar espaço para um array são através de inicialização explícita e através do operador new. Programação Orientada a Objeto - Java Básico 75 Tamanho de um array • Podemos determinar o tamanho de um array em tempo de execução usando-se o atributo length (que é uma constante) do objeto Array em questão: myArray.length; • Isto aumenta a manutenibilidade do código. • Exemplo: qual dos dois códigos abaixo é mais fácil de manter se o tamanho do array for modificado? int myArray[] = {1, 2, 3, 4, 5}; for(int idx=0; idx < 5; idx++) System.out.println(myArray[idx]); for(int idx=0; idx < myArray.length; idx++) System.out.println(myArray[idx]); Programação Orientada a Objeto - Java Básico 76 Tamanho de um array • Lembre-se sempre que os índices de um array começam em zero. • Um erro comum é começar a contar em 1 e tentar acessar algo além do fim do array. • Em C/C++ isto pode causar problemas catastróficos (escrever por cima de dados valiosos, entre outros) e o programa pode passar a comportar-se misteriosamente. • Em Java todos os acessos a rrays são checados contra o tamanho limite antes de serem efetuados. Programação Orientada a Objeto - Java Básico 77 Verificação de Limites int myArray[] = {1, 2, 3, 4, 5}; for(int idx = 0; idx < 6; idx++) { System.out.println(myArray[idx]); } Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at Arrays.main(Arrays.java:34) Programação Orientada a Objeto - Java Básico 78 Verificação de limites • Podemos usar as capacidades de tratamento de erro do Java (que veremos com cuidado mais a frente), de forma que o programa não seja interrompido: try { for(int idx=0; idx < 6; idx++) { System.out.println(myArray[idx]); } } catch (ArrayIndexOutOfBoundsException indexException) { System.out.println(“Index out of bounds”); } Programação Orientada a Objeto - Java Básico 79 Arrays de mais de uma dimensão • Podemos criar arrays de mais de uma dimensão, como por exemplo um array bi-dimensional: int twoDimensions[][]= {{1, 2}, {3, 4}}; double map[][] = new double[4][8]; System.out.println(map.length); System.out.println(map[0].length); Podemos adicionar quantas dimensões forem necessárias para nosso programa. Programação Orientada a Objeto - Java Básico 80 Passando Arrays para Métodos • É importante entender algo: se passarmos um array como um parâmetro para um método, toda modificação de seu conteúdo será vista fora do método também. • Isto é, todos os arrays são passados por referência e podem ser modificados dentro do método para o qual são passados. • Isto, é claro, vale para todos os objetos. Já que eles na verdade são ponteiros, ao passá-los por valor, estamos fazendo uma passagem por referência do que eles apontam Programação Orientada a Objeto - Java Básico 81 Passando Arrays para Métodos Quando discutirmos classes e seus métodos, vamos voltar a este tópico que será então discutido exaustivamente. Entretanto, é sempre importante lembrar: objetos são, na realidade, ponteiros. Saber isto vai evitar que sejamos enganados e cometamos erros bobos. Programação Orientada a Objeto - Java Básico 82 Arrays Dinâmicos? • Não é permitido modificar o tamanho de um array uma vez que ele já foi alocado. • O atributo length é do tipo final (constante). • Não dá para fazer um array ser mais curto ou mais longo. • Para fazer isto, temos que alocar um novo array e copiar os dados do original para o novo. Programação Orientada a Objeto - Java Básico 83