Programação Orientada a Objetos
Java
Introdução ao Java
Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior
Tecnologia Java
Java é tanto uma linguagem de programação
de alto nível quanto uma plataforma de
desenvolvimento de aplicações
Java como linguagem de programação
Aplicações locais, centralizadas e distribuídas Aplicações cliente/servidor que executam em
browsers
Java como ambiente de execução
Ambiente neutro (JRE – Java Runtime
Environment) para diferentes plataformas: SOs, browsers, celulares, palmtops,
Características Java
Linguagem de programação orientada a objetos
Familiar (sintaxe parecida com C)
Simples e robusta (minimiza bugs, aumenta
produtividade)
Suporte nativo a threads (+ simples, maior
portabilidade)
Dinâmica (módulos, acoplamento em tempo de
execução)
Com coleta de lixo (menos bugs, mais
produtividade)
Independente de plataforma
Características Java
Segura
(vários mecanismos para controlar
segurança)
Código intermediário de máquina virtual
interpretado
(compilação rápida,
execução + “lenta”, + produtividade no
desenvolvimento)
Sintaxe uniforme, rigorosa quanto a
SIMULA 1967 SmallTalk 1980 ALGOL 1960 Java 1995 C++ 1985 C 1972 Pascal 1973 ADA 1983 ADA 1995
Linguagens OO: genealogia
código
fonte
processador
da linguagem
código
objeto
linking
código
executável
Desenvolvimento de programas
Implementação de LP
Compilação
geração de código executável
dependente da plataforma de execução
tradução lenta X execução rápida
Interpretação pura
sem geração de código
execução lenta, independente de plataforma
Híbrida
geração de código intermediário
independente de plataforma de execução
tradução rápida X execução não muito rápida
fonte
Compilador
bytecode
Interpretador
JAVA
Browser
{HTML}
interpretador
JAVA
INTERNET
Ambiente de compilação e
execução
Compilação: Programa Java é compilado para um código intermediário conhecido como bytecode
Execução: Bytecodes são interpretados pela JVM
(Java Virtual Machine) executada no ambiente hospedeiro – arquitetura neutra
Compilação x Interpretação
Problema:
Para ter flexibilidade e segurança, abre-se mão
do tempo de execução
Um programa Java típico roda 10 vezes mais
lento que um programa equivalente em linguagem nativa
Solução: JIT (Just-in-time compiling)
Compiladores JIT convertem programas Java
para linguagem de máquina nativa assim que os mesmos são lidos
Penalidade: a leitura dos programas se torna
mais lenta
Vantagem: execuções subseqüentes são mais
rápidas
Ambientes de execução e
desenvolvimento
Java 2 System Development Kit (J2SDK)
Coleção de ferramentas de linha de comando
para, entre outras tarefas, compilar, executar e depurar aplicações Java
Para habilitar o ambiente via linha de comando é
preciso colocar o caminho $JAVA_HOME/bin no PATH do sistema
Java Runtime Environment (JRE)
Ambiente mínimo para executar aplicações Java Faz parte do J2SDK e das principais distribuições
Interfaces de Programação
de Aplicações – APIs
Java possui uma coleção de APIs (bibliotecas)
padrão que podem ser usadas para construir
aplicações:
Organizadas em pacotes (java.*, javax.* e
extensões)
Usadas pelos ambientes de execução (JRE) e de
desenvolvimento (SDK)
As principais APIs são distribuídas juntamente
com os produtos para desenvolvimento de
aplicações:
Java 2 Standard Edition (J2SE) Java 2 Enterprise Edition (J2EE) Java 2 Micro Edition (J2ME)
Ambientes Integrados de
Desenvolvimento – IDEs
Existem diversos IDEs construídos a partir
das ferramentas básicas de
desenvolvimento:
ambientes baseados em janelas
editores, visualizadores de classes,
prototipação ...
Exemplos: Eclipse, NetBeans (Sun), Visual
Studio (Microsoft), JBuilder (Borland),
Visual Café (Symantec), JCreator, BlueJ,
jGRASP...
CLASSE
Nome
CLASSE Nome1
CLASSE
Nome2
CLASSE
Nome1
Nome.java
Nome1.java
Um arquivo pode conter
várias classes
mesmo Nome
Programa Java: Classe
Uma classe é um arquivo fonte (texto)
Arquivo fonte
:
Escola.java
public class Escola {
{
class Aluno {
bytecodes
bytecodes
Escola.class
Aluno.class
Arquivos executáveis:
class
Convenção para Nomes
Java, como C/C++, distingue entre letras
maiúsculas e minúsculas
Exemplo: escola é diferente de Escola
Nomes de classes iniciam com maiúscula
Exemplo: class Bemvindo
Nomes de variáveis iniciam com minúsculas
Exemplo: int peso;
Nomes de métodos são verbos que iniciam
com minúscula e depois usam maiúsculas
Exemplo: alteraPeso
Representação: Unicode (16 bits - 65.536
caracteres)
Compilação e Execução:
SDK – linha de comando
Compilação: javac
A partir do
diretório local:
javac Nome.java
Vai produzir:
Arquivos .class
separados para
cada classe no
arquivo .java
coloca arquivos no
diretório corrente
Execução: java
A partir do
diretório local:
java Nome sendo Nome =
nome do arquivo
.class que contém
o main()
Executa a partir de
main():
java Nome
arg1,arg2, ...
HelloWorld.jav a
javac
Execução de programas Java
Verificação de bytecode
Etapa que antecede a execução do código em
classes carregadas através da rede
Class Loader distingue classes locais (seguras) de
classes remotas (potencialmente inseguras)
Verificação garante:
Aderência à especificação da JVM
Não-violação de políticas de acesso estabelecidas
pela aplicação
Não-violação da integridade do sistema Ausência de estouros de pilha
Tipos de parâmetros corretamente especificados Ausência de conversões ilegais de tipos
Editor
disco Programa é criado em um editor e
armazenado no disco
Compilador
disco Compilador gera os bytecodes e os
armazena no disco Carregador de classes disco O carregador de classes – Class Loader – coloca os bytecodes na memória _______ _______ _______ _______ __ memória Verificador de bytecodes O verificador de bytecodes – Bytecodes Verifier – confirma se todos os bytecodes estão corretos e não violam as restrições de segurança da linguagem Java _______ _______ _______ _______ __ memória Interpretador O interpretador lê os bytecodes e executa o programa _______ _______ _______ _______ __ memória
Proce
sso
de E
xecuç
ão
19Programas JAVA
Aplicações (puras)
são programas carregados e executados
localmente pelo interpretador Java
possuem acesso a todos os recursos do
ambiente local: diretórios, arquivos
sempre contêm um método principal (main),
de onde se inicia a execução do programa
podem fazer chamadas a programas em
código nativo (outras linguagens, como C,
C++)
Programas Cliente/Servidor
Applets: cliente
são programas inseridos em páginas HTML e
executados pelo browser (interpretador Java)
programas (classes) podem ser carregados
remotamente
restrições de segurança: não podem acessar
recursos locais, só podem comunicar-se com
o servidor de onde foram “baixados”
Servlets: servidor
executados sob o controle do servidor
classe carregada dinamicamente por
requisição de um cliente
Applets Java X JavaScript
Ambos são códigos executáveis inseridos
em páginas HTML
Código Java: classes compiladas e
carregadas remotamente
Código JavaScript: instruções fisicamente
dispersas ao longo da página HTML
Java é uma LP de uso geral, orientada a
objetos: classes, objetos, encapsulamento,
herança e polimorfismo
class Bemvindo {
public static void
main
(String[]
args) {
System.out.println(“Bem-vindo!”);
}
}
Atenção a maiúsculas
e minúsculas!
Classe Java: apenas o
método main()
System.out.
println
(“Bem-vindo!”);
objeto
método
parâmetro
System.out.
(“Bem-vindo!”);
objeto
método
parâmetro
Exemplo de chamada de
métodos
class Bemvindo {
public static void
main
(String[] args) {
System.out.println(“Bem-vindo ” +
args[0]);
}
}
Método main(): aceita argumentos para execução
class Bemvindo2 {
static
void imprime() {
System.out.println(“Bem-vindo!”);
}
public static void
main
(String[]
args) {
imprime();
}
}
método static: método de classe, não aplicável sobre objetos
Classe Java: dois métodos
class Bemvindo3 {
void imprime(){
System.out.println(“Bem-vindo!”);
}
public static void
main
(String[] args) {
Bemvindo3 obj = new
Bemvindo3();
// imprime();
// erro!
obj.imprime();
}
Classe Java: instanciando um
objeto
class Bemvindo3{ void imprime(){
System.out.println("Bem-vindo!"); }
public static void main(String[] args){
Bemvindo3 obj=new Bemvindo3(); Welcome outro=new Welcome();
obj.imprime(); outro.imprime(); } // main } // Bemvindo3 class Bemvindo3{ imprime() main(...) } class Welcome{ imprime() } class Welcome{ void imprime(){ System.out.println("Welcome!"); }} // Welcome
Duas classes: composição
Streams de entrada/saída
Em um programa, dados são lidos/gravados
através de streams (fluxos) de E/S
Fontes e destinos: console, arquivos, rede...
Chamada Parametrizada X
Entrada/Saída via Console
Chamada parametrizada:
programa inicia com valores armazenados
em um array
de Strings
não é uma forma usual de entrada de dados
Ao iniciar a execução de um programa, são
criados automaticamente os seguintes
streams:
System.in - standard input (teclado)
System.out - standard output (vídeo)
System.err - standard error (vídeo)
Podem ser redirecionados para disco, por exemplo
Entrada via Console
Classe BufferedReader
usada para leitura de um stream de
caracteres para um buffer
definida no pacote java.io
Método readLine()
definido em BufferedReader
faz a leitura de uma linha de texto até um
caracter „\n‟
causa uma exceção se ocorrer um erro
enquanto lê os dados da entrada
72 101 108 108 111 13
String msg = stdin.readLine();
InputStream72 101 108 108 111 13
leitura de bytes InputStreamReaderH e l l o \n
buffer de caracteres BufferedReaderH e l l o
msg StringEntendendo Entrada via
Console
L i n h a i n f o r m a d a = H e l l o
System.out.println(“Linha informada = ”+ msg);
PrintStreamEntrada via Console: String
1. import java.io.*;2. class Leitura {
3. public static void main(String[] args) throws
4. IOException{
5. BufferedReader stdin = new BufferedReader(
6. new InputStreamReader(System.in));
7. System.out.println(“Entre uma linha:”); 8. String msg = stdin.readLine();
9. System.out.println(“Linha informada = ”+ msg); 10. }
11. }
Entrada via Console: int
1. import java.io.*;2. class Leitura {
3. public static void main(String[] args) throws
4. IOException{
5. BufferedReader stdin = new BufferedReader(
6. new InputStreamReader(System.in));
7. System.out.println(“Entre um número:”); 8. int i = Integer.parseInt(stdin.readLine()); 9. System.out.println(“Número = ”+ i);
Usando Scanner() e printf()
JDK 1.5
1. import java.io.*;
2. import java.util.Scanner; 3. public class LeScanner {
4. public static void main(String[] args) {
5. Scanner input = new Scanner(System.in); 6. System.out.print("Digite seu nome: ");
7. String nome = input.next();
8. System.out.print("Digite sua idade: "); 9. int idade = input.nextInt();
10. System.out.printf("%s tem %d anos\n", nome, idade);
11. } }
Estruturas de Controle
Estruturas de
seleção
if, if-else, switch
Estruturas de
repetição
for, while, do-while
Desvios
(somente em estruturas de repetição) continue, break, rótulos Java não possui um comando goto, porém “goto” é uma palavra reservada
Expressões Booleanas
Uma condição usa
operadores relacionais
e
resulta em um valor booleano (
true
ou
false
):
== equal to
!= not equal to < less than
> greater than
<= less than or equal to
O operador condicional
? :
Mesma semântica da estrutura if-else
Único operador ternário da linguagem Java
o primeiro operando é uma expressão booleana
retorna o segundo operando se a expressão condicional
for true ou o terceiro operando se for false
Exemplos:
System.out.println( (media >= 7) ? “Aprovado” : “Reprovado” ); int x = (y != 0) ? 50 : 500;
String titulo = (sex == 'f') ? "Sra." : "Sr.“ ;
Sintaxe da instrução switch
switch(expr1) { case expr2: instruções; break; case expr3: instruções; break; default: instruções; }Na instrução switch (expr1), expr1 deve ser compatível com atribuições do tipo int, sendo permitidos os tipos de dados
short, int, byte ou char, pois pode ser feita a coerção (cast) para o tipo int, o que não é possível com os tipos long ou de ponto flutuante.
Exemplos while/do-while
int x = 0; while (x < 10) { System.out.println ("item " + x); x++; } int x = 0; do { System.out.println ("item " + x); x++; } while (x < 10); // loop infinito while ( true ) { ... } 43Exemplos for
for ( int x = 0; x < 10; x++ ) { System.out.println ("item " + x); }
for ( int x = 0, int y = 25; x < 10 && (y % 2 == 0); x++, y = y - 1 ) { System.out.println (x + y); } // loop infinito for ( ; ; ) { ... }
45
Comandos de desvio:
break e continue
break: interrompe a execução do bloco de repetição Continua com a próxima instrução após o bloco
continue: interrompe a iteração atual
Ignora as instruções restantes no bloco, testa a condição e reinicia com a próxima iteração
Usando rótulos
break e continue sempre atuam sobre o bloco de repetição onde são chamados
Em blocos de repetição contidos em outros blocos, pode-se usar rótulos para fazer break e continue atuarem em blocos externos
Os rótulos só podem ser usados antes de do, while e
for
As chamadas só podem ocorrer dentro de blocos de repetição
Tipos, Operadores e Literais
Identificadores
São palavras utilizadas para nomear variáveis, métodos e classes
Na linguagem Java, o identificador sempre
começa por letra, sublinhado(_) ou cifrão ($)
Não podem começar por números São “case sensitive”
Do segundo caractere em diante, pode conter
qualquer seqüência de letras, dígitos, sublinhados ou cifrões
Identificadores
Exemplos de identificadores válidos:
nomeAluno
saldo
lâmpada // não recomendável
User_name // fora do padrão
_sys_var1
Class // não recomendável
Java utiliza o padrão Unicode (16 bits)
Palavras reservadas em Java
abstract boolean break byte case
catch char class continue default
do double else extends
final finally float for if
implements import instanceof int interface
long native new return package
private protected public synchronized short
static super switch this try
throw throws transient void volatile
while enum
Palavras reservadas
Modificadores de Acesso
private, protected, public
Modificadores de classe, método e
variável
abstract, class, extends, final, implements,
interface, native, new, static, synchronized, transient, volatile
Controle de fluxo
break, case, continue, default, do, else, for, if,
instanceof, return, switch, while
Palavras reservadas
Tratamento de Erros
catch, finally, throw, throws, try, assert
Controle de Pacotes
import, package
Tipos de Dados
boolean, byte, char, double, float, int, long, short,
Tipos primitivos em Java
Armazenados na pilha (acesso rápido)
Não são objetos. Classe 'wrapper' faz transformação, se necessário (encapsula valor em um objeto)
Operadores
Atribuição
Incremento e Decremento
instanceof
Conversão de tipos primitivos
Coerção (cast)
As variáveis podem ser convertidas em tipos maiores
de maneira automática, mas não em tipos menores
Desta forma, uma expressão int pode ser tratada como
long, mas uma expressão long não poderá ser tratada como int sem que haja uma coerção explicita
Uma coerção é utilizada para persuadir o compilador a
reconhecer uma atribuição
Esse procedimento pode ser adotado, por exemplo,
para “comprimir” um valor long em uma variável int
Na coerção, o programador assume os riscos da
conversão de dados
public class Test {
public static void main(String args[]) {
int i = 16777473;
short s = (short) i;
byte b = (byte) i;
System.out.println(“Valor int:” + i); System.out.println(“Valor short:” + s); System.out.println(“Valor byte:” + b); } } A execução de código provoca duas conversões. Em ambas ocorre perda de informação
Coerção - Exemplo
i = 00000001 00000000 00000001 00000001 (int (4 bytes) - valor: 16777473)Coerção – Exemplo com
objetos
Array v = new Array( ); v.add(“Hello”);
String s = (String)v.get(0);
Como o método get sempre retorna um elemento do tipo Object, que não pode ser atribuído a uma String, torna-se necessário fazer o cast antes da
atribuição
Caso fosse feita a atribuição direta, teríamos um erro de compilação:
String s = v.get(0); // erro