Java - DI PUC-Rio

Propaganda
Java – Parte I
Linguagens de Programacão I
[email protected]
1
Introdução
LP OO desenvolvida pela Sun no início da década de
90 com sintaxe semelhente a C\
C\C++.
Todos os programas Java são compilados e
interpretados.
O compilador transforma o programa em um forma
intermediária independente da plataforma
(bytecodes).
O interpretador (JVM) testa e executa os bytecodes.
Linguagens de Programacão I
[email protected]
2
1
Introdução
Para cada plataforma é necessário uma JVM
específica.
Entretanto, um mesmo programa pode ser
executado em qualquer plataforma.
Linguagens de Programacão I
[email protected]
3
Classes em Java
Em Java, a declaração de novas
classes é feita através da construção
class.
class Circulo {
int x,y;
float raio;
...
}
Linguagens de Programacão I
[email protected]
4
2
Instanciação
Uma vez definida uma classe, uma nova
instância (objeto) pode ser criada através do
comando new.
new.
Circulo c = new Circulo();
Os atributos desta classe podem ser
manipulados diretamente:
c.x = 5; c.y = 5;
c.raio = 3.5;
Linguagens de Programacão I
[email protected]
5
Métodos
Além de atributos, uma classe deve declarar os
métodos que irá disponibilizar.
class Circulo {
int x,y;
float raio;
...
void setRaio(float r){
raio = r;
}
float getArea(){
return 3,14*raio*raio;
}
void move (int dx, int dy){
x = x+dx;
y = y+dy;
}
}
Linguagens de Programacão I
[email protected]
6
3
Declaração de Variáveis e Escopo
Java permite que uma variável seja declarada em
qualquer lugar dentro de um método.
O escopo da variável se estende do momento da sua
declaração até o fim do bloco no qual foi definido.
int fatorial (int n){
if n <= 1 then
return 1
else {
int f = n*fatorial(nn*fatorial(n-1)
return f
}
}
escopo de f
Linguagens de Programacão I
[email protected]
7
Envio de Mensagens
O envio de uma mensagem para um
objeto é feito através da invocação de
métodos deste objeto com a eventual
passagem de parâmetros.
Circulo c = new Circulo();
c.setRaio(3);
float a = c.getArea();
Linguagens de Programacão I
[email protected]
8
4
Referências
Java adota um modelo de valor por
referência.
Com exceção de tipos primitivos, a
atribuição entre duas variáveis cria uma
nova referência
Circulo c1 = new Circulo();
Circulo c2 = c1;
Î c1 e c2 conté
contém referências para o mesmo objeto Circulo
Linguagens de Programacão I
[email protected]
9
this
Dentro de um método, o objeto pode precisar
de sua própria referência.
A palavra reservada this denota uma
referência ao próprio objeto.
class Circulo {
int x,y;
void setXY (int x, int y){
this.x = x;
this.y = x;
}
}
Linguagens de Programacão I
[email protected]
10
5
Inicialização de Objetos
Em várias circunstâncias é interessante inicializar um objeto
com valores.
Por exemplo, poderíamos querer que todo Círculo recém criado
estivesse em (0,0).
Esse tipo de inicialização pode ser feito especificandoespecificando-se
valores iniciais para os atributos:
class Circulo {
int x = 0;
int y = 0;
...
}
Linguagens de Programacão I
[email protected]
11
Construtores
Ao invés de criar pontos sempre em (0,0),
poderíamos querer especificar a posição do
ponto no momento de sua criação.
O uso de construtores permite isso.
Construtores são mais genéricos do que
simples atribuições de valores iniciais aos
campos: podem receber parâmetros e fazer
um processamento qualquer.
Linguagens de Programacão I
[email protected]
12
6
Exemplo
Î class Circulo {
int x,y;
float raio;
Circulo (int x, int y, float Raio){...}
}
Î
Circulo c1 = new Circulo(3,3,5.5);
Circulo c2 = new Circulo(0,0,4);
Neste exemplo para criar um Circulo é
sempre necessário especificar sua posição e
o seu raio.
Linguagens de Programacão I
[email protected]
13
Construtor Padrão
Quando não especificamos nenhum
construtor a linguagem Java declara
implicitamente um construtor padrão vazio,
que não recebe parâmetros.
Se declararmos algum construtor, esse
construtor padrão não será mais declarado.
declarado.
No exemplo anterior:
Circulo c3 = new Circulo(); Î erro!!
Linguagens de Programacão I
[email protected]
14
7
Sobrecarga
Java permite a sobrecarga de métodos,
inclusive de construtores.
class Point {
int x, y;
Point() {
this(0,0);
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
...
}
Linguagens de Programacão I
[email protected]
15
Gerência de Memória
Java possui uma gerência automática de memória
com coleta de lixo.
Quando um objeto não é mais referenciado pelo
programa ele é automaticamente coletado
(destruído) e a memória correspondente é
desalocada.
Qualquer objeto Java é criado sempre na heap.
Apenas tipos primitivos são alocados na pilha ou,
eventualmente, na memória estática.
Linguagens de Programacão I
[email protected]
16
8
Destrutores
Quando um objeto Java vai ser coletado, ele
tem seu método finalize chamado.
Esse método deve efetuar qualquer
procedimento de finalização que seja
necessário antes da coleta do objeto.
objeto.
Como Java possui gerenciamento automático
de memória, a utilização de destrutores não é
muito comum .
Linguagens de Programacão I
[email protected]
17
Encapsulamento
A definição da interface de objetos é feita
através dos modificadores public e private.
private.
Métodos e atributos declarados como public
são visíveis para outros objetos Java.
Métodos e atributos declarados como private
só podem ser acessados dentro do próprio
objeto.
Linguagens de Programacão I
[email protected]
18
9
Exemplo
interface
class Circulo {
private int x,y;
não são acessíveis por
private float raio;
outros objetos
...
public void setRaio(float r){
raio = r;
}
public float getArea(){
return 3,14*raio*raio;
}
public void move (int dx, int dy){
x = x+dx;
y = y+dy;
}
}
Linguagens de Programacão I
[email protected]
19
Atributos de Classes e
Métodos Estáticos
Classes podem declarar membros (atributos e
métodos) que sejam comuns a todas as instâncias,
ou seja, membros compartilhados por todos os
objetos da classe.
Este mecanismo equivale a definição de variáveis e
funções globais comuns em LPs não OO.
Java suporta a definição de membros de classe
através do qualificador static.
static.
Linguagens de Programacão I
[email protected]
20
10
Exemplo
public class Math{
static double pi = 3.14;
static double cos(){
...
}
...
}
public class Produto{
static int produzidos = 0;
static float getProducao(){
return produzidos;
}
public Produto(){
++produzidos;
}
...
}
Linguagens de Programacão I
[email protected]
21
Acesso a Membros de Classe
Não é necessário que uma instância da
classe exista pra que membros (atributos e
métodos) da classe possam ser acessados.
O acesso a membros de classe em Java é
feito diretamente através do nome da classe.
float perimetro = 2*Math.pi*r;
float x = Math.cos(2.3);
int n = Produto.getProducao();
Linguagens de Programacão I
[email protected]
22
11
Tipos Básicos de Java
boolean
true ou false
char
caracter UNICODE (16 bits)
byte
número inteiro com sinal (8 bits)
short
número inteiro com sinal (16 bits)
int
número inteiro com sinal (32 bits)
long
número inteiro com sinal (64 bits)
float
número em pontoponto-flutuante (32 bits)
double
número em pontoponto-flutuante (64 bits)
Linguagens de Programacão I
[email protected]
23
Strings e Arrays
Em Java strings e arrays são definidos
através de classes específicas.
Exemplos:
String texto = “Exemplo”;
int[]
int[] lista = {1, 2, 3, 4, 5};
String[] nomes = {“João”, “Maria”};
System.out.
println(nomes[0]);
(nomes[0]); // Imprime “João”.
System.out.println
Linguagens de Programacão I
[email protected]
24
12
Operadores
Operadores Aritméticos
Descrição
Operador
Adição
+
Subtração
-
Multiplicação
*
Divisão
/
Resto divisão inteiro
%
Menos unário
-
Linguagens de Programacão I
[email protected]
25
Operadores
Operadores Relacionais
Descrição
Operador
Igual
==
Diferente
!=
Menor
<
Menor ou igual
<=
Maior
>
Maior ou Igual
>=
Operadores lógicos Î and (&&
), or (||
(&&),
(||)) e not (!
(!)
Linguagens de Programacão I
[email protected]
26
13
Controle de Fluxo
ifif-else
switchswitch-casecase-default
while
dodo-while
for
break
return
Linguagens de Programacão I
[email protected]
27
if-else
float m;
if (a>0 && b>0)
m = a*b;
else {
System.out.println(“Erro”);
m = 0;
}
Linguagens de Programacão I
[email protected]
28
14
switch-case-default
int i = f();
switch (i){
(i){
case -1:
...
break;
break;
case 0:
...
break;
break;
default:
default:
...
}
Linguagens de Programacão I
[email protected]
29
while
int i = 0;
while (i<10){
(i<10){
i++;
System.out.
println(i);
(i);
System.out.println
}
Linguagens de Programacão I
[email protected]
30
15
do-while
int i = 0;
do{
i++;
System.out.
println(i);
(i);
System.out.println
}while (i<10);
Linguagens de Programacão I
[email protected]
31
for
for (int
(int i=1; i<=10; i++)
System.out.
println(i);
(i);
System.out.println
Linguagens de Programacão I
[email protected]
32
16
break
int i = 0;
while (true){
if (i==10) break;
break;
i++;
System.out.
println(i);
(i);
System.out.println
}
Linguagens de Programacão I
[email protected]
33
label
início:
for (int
(int i=0; i<10; i++)
for (int
(int j=0; j<10; j++)
{
if (v[i][j] < 0) break início;
...
}
...
Linguagens de Programacão I
[email protected]
34
17
Herança em Java
Java suporta o conceito de herança simples, mas não
o de herança múltipla na forma tradicional.
PodePode-se declarar uma subclasse através da palavra
reservada extends:
extends:
public class Pixel extends Point {
int color;
public Pixel(int x, int y, int c) {
super(x, y);
color = c;
}
}
Linguagens de Programacão I
[email protected]
35
super
Uma subclasse pode acessar o construtor da
superclasse através da chamada super().
super().
Caso a subclasse não invoque explicitamente o
construtor da superclasse, Java fará isso
automaticamente.
Entretanto caso a superclasse não possua um
construtor padrão, a subclasse necessariamente
deverá fazer uma invocação explícita de um
construtor qualquer da superclasse.
Linguagens de Programacão I
[email protected]
36
18
Polimorfismo
Em Java o comportamento padrão dos
objetos é polimórfico, e a ligação de
métodos ocorre de forma dinâmica (late
binding).
Conforme veremos adiante, é possível
modificar este comportamento quando
necessário.
Linguagens de Programacão I
[email protected]
37
Î public class Point {
...
public void print() {
System.out.println(“Point (”+x+“,”+y+“)”);
}
}
Î public class Pixel extends Point {
...
public void print() {
System.out.println(“Pixel (”+x+“,”+y+“,”+color+“)”);
}
}
Î Point pt = new Point();
// ponto em (0,0)
Point px = new Pixel(0,0,0); // pixel em (0,0)
pt.print(); // Imprime: “Point (0,0)”
px.print(); // Imprime: “Pixel (0,0,0)”
Linguagens de Programacão I
[email protected]
38
19
Valores Constantes
Constantes em Java são declaradas
através da palavra reservada final.
final força uma ligação estática entre
um valor e uma variável.
class Math {
final float pi = 3.14; ...
}
Linguagens de Programacão I
[email protected]
39
final e Polimorfismo
Por razões de eficiência, Java permite a
especificação de métodos cuja ligação deve ser
sempre estática.
Esta especificação é feita através da declaração de
um método como final.
final.
public class A {
public final int f() {
...
}
}
Linguagens de Programacão I
[email protected]
40
20
Type Casting
O mecanismo de typecasting é importante
em LPs OO para acessar os métodos
específicos de objetos polimórficos:
Point pt = new Pixel(0,0,1);
Pixel px = (Pixel)pt;
pt = new Point();
px = (Pixel)pt; Î ERRO! pt agora contém um ponto.
pt = new Pixel(0,0,0);
px = pt; Î ERRO! pt não é sempre um pixel.
Linguagens de Programacão I
[email protected]
41
instanceof
Permite verificar em tempo de
execução a classe real de um objeto.
Exemplo:
if (pt instanceof Pixel) {
Pixel px = (Pixel)pt;
…
}
Linguagens de Programacão I
[email protected]
42
21
Classes Abstratas
Java suporta o conceito de métodos e
classes abstratas através da palavra
reservada abstract.
abstract.
Uma classe pode ser declarada abstrata sem
conter nenhum método abstrato.
Uma classe que contenha ao menos um
método abstrato deve sempre ser declarada
abstrata.
Linguagens de Programacão I
[email protected]
43
Exemplo de Classe Abstrata
public abstract class Instrumento {
public String nome;
...
public abstract void tocar();
public abstract void afinar(int ajuste);
public void getNome() {
System.out.println(nome);
}
}
Linguagens de Programacão I
[email protected]
44
22
Interfaces
Java não suporta o mecanismo de herança múltipla.
Î Uma subclasse pode estender apenas uma única
superclasse.
Entretanto Java permite que uma subclasse
implemente várias interfaces.
Interfaces Java podem ser entendidas como classes
abstratas puras, ou seja, classes que contém apenas
métodos abstratos.
Para herdar de uma interface uma subclasse deve
ser declarada com a paravra reservada implements.
implements.
Linguagens de Programacão I
[email protected]
45
Membros de Interfaces
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.
Como esses qualificadores são fixos, não
precisamos declarádeclará-los.
Linguagens de Programacão I
[email protected]
46
23
Exemplo
interface Instrumento {
String marca = ‘Yamaha’; Î static
void tocar(); Î abstract e public
void afinar(int ajuste);
}
e final
class Tambor implements Instrumento{
void tocar(){
...
}
void afinar(int ajuste){
...
}
}
Linguagens de Programacão I
[email protected]
47
Interfaces
Apesar de uma interface não ser uma classe,
podemos declarar variáveis como sendo de
um tipo de interface específico.
Instrumento i = new Tambor();
A partir daí aplicamaplicam-se todas as regras de
polimorfismo e o mecanismo de typecast
padrão.
Linguagens de Programacão I
[email protected]
48
24
Interfaces
Uma classe pode concomitantemente
estender uma subclasse e implementar
diversas interfaces, de forma análoga ao
mecanismo de herança múltipla.
Exemplo:
public class SuperHomen extends SuperHeroi
implements Voador, VisaoRaioX, SuperForca {
...
}
Linguagens de Programacão I
[email protected]
49
Programas Java
A estrutura de um programa Java consiste
exclusivamente na especificação de classes.
A execução de um programa em Java
consiste na execução de uma classe.
Executar uma classe significa executar seu
método estático main.
main.
O método main deve portanto especificar o
programa a ser executado.
Linguagens de Programacão I
[email protected]
50
25
Olá Mundo!
class Mundo {
public static void main(String[]
main(String[] args)
args) {
System.out.
println(“Olá
(“Olá Mundo!”);
System.out.println
}
}
Linguagens de Programacão I
[email protected]
51
Programas Java
Um programa em Java usualmente é composto por
várias classes.
A unidade de compilação em Java é a classe.
Cada classe deve ser declarada em um arquivo
separado tendo como nome o nome da classe
declarada mais a extensão .java.
.java.
Por exemplo, o arquivo Tambor.java deve conter a
definição da classe Tambor.
Linguagens de Programacão I
[email protected]
52
26
Pacotes
Para organizar as classes e facilitar a
modularidade de código, Java suporta o uso
de pacotes.
Um pacote é um conjunto de classes e outros
pacotes.
Pacotes permitem a criação de espaços de
nomes, além de mecanismos de controle de
acesso.
Linguagens de Programacão I
[email protected]
53
Pacotes
O nome do pacote qualifica os nomes de
todas as classes e outros pacotes que o
compõem, criando portanto um espaço de
nomes independente.
Se todos as classes declarando instrumentos
fossem agrupados no pacote instrumentos,
poderíamos acessar a classe Tambor através
de uma declaração como:
instrumentos.Tambor t = new instrumentos.Tambor();
Linguagens de Programacão I
[email protected]
54
27
Pacotes
Pacotes são tipicamente implementados como
diretórios e os arquivos das classes pertencentes ao
pacote devem ficar em seu diretório.
Hierarquias de pacotes são construídas através de
hierarquias de diretórios.
Por exemplo o pacote java.tools.instrumentos deve
estar localizado numa hierarquia de diretórios com a
forma \java\
java\tools\
tools\instrumentos.
instrumentos.
Linguagens de Programacão I
[email protected]
55
Pacotes
Para declararmos uma classe como
pertencente a um pacote devemos:
DeclaráDeclará-la em um arquivo dentro do
diretório que representa o pacote;
Declarar, na primeira linha do arquivo, que
a classe pertence ao pacote, utilizando
para isso a palavra reservada package.
package.
Linguagens de Programacão I
[email protected]
56
28
Exemplo
package instrumentos;
class Tambor implements Instrumento{
void tocar(){
...
}
void afinar(int ajuste){
...
}
}
Linguagens de Programacão I
[email protected]
57
Encapsulamento Revisitado
Quando não declaramos explicitamente a visibilidade
dos membros de uma classe, Java assume que a
visibilidade é do tipo “friendly”.
Membros “friendly” funcionam como public para
classes dentro de um pacote e como private para
classes fora do pacote.
Java disponibiliza ainda o modificador protected,
protected, que
permite a visibilidade de membros de uma classe
apenas em subclasses desta classe.
Linguagens de Programacão I
[email protected]
58
29
Visibilidade de Classes
Todas as classes de um pacote
“enxergam” as demais classes do
mesmo pacote.
Classes de outros pacotes só são
visíveis em uma classe se forem
explicitamente importadas através da
declaração import.
Linguagens de Programacão I
[email protected]
59
Exemplo
package instrumentos;
import Java.util.ArrayList;
import meuPacote.*;
importa a classe ArrayList
do pacote java.util
importa todas as classes
do pacote meuPacote
class Tambor implements Instrumento{
void tocar(){
...
}
void afinar(int ajuste){
...
}
}
Linguagens de Programacão I
[email protected]
60
30
Visibilidade
É possível declarar uma classe como privada,
usando o modificador private.
private.
Neste caso a classe deve ser declarada no mesmo
arquivo da classe principal que irá utilizar esta
classe.
O nome do arquivo é o mesmo da classe principal.
Quando uma classe for declarada sem um
modificador ela será considerada “friendly”.
Linguagens de Programacão I
[email protected]
61
Exceções
Java possui dois tipos de exceções:
Checked Exceptions - são exceções que devem
ser usadas para modelar falhas contornáveis.
Devem sempre ser declaradas pelos métodos que
as lançam e precisam ser tratadas (a menos que
explicitamente passadas adiante).
Unchecked Exceptions - são exceções que
devem ser usadas para modelar falhas
incontornáveis. Não precisam ser declaradas e
nem tratadas.
Linguagens de Programacão I
[email protected]
62
31
Exceções
O tratamento de exceções é feito através de
estruturas de controle delimitadas pelas
palavras reservadas trytry-catchcatch-finally.
Todo trecho de código no qual podem ser
lançadas exceções do tipo checked deve ser
declarado dentro de um bloco try.
try.
As rotinas responsáveis pelo tratamento de
exceções são declaradas em um bloco catch.
catch.
Linguagens de Programacão I
[email protected]
63
Exemplo
FileReader f = null;
try {
f = new FileReader(args[0]);
...
f.close();
abre um arquivo - pode
}
lançar uma exceção do
catch (IOException e){
tipo IO
System.out.println(e);
if (f != null)
f.close();
captura a exceção
}
...
Linguagens de Programacão I
[email protected]
64
32
Exceções
Um bloco try pode conter vários tratadores de
exceção.
O bloco finally permite especificar um trecho
de código que sempre deve ser executado
independentemente da ocorrência de
exceções.
Se uma exceção não for tratada pelo bloco
que a lançou, ela irá se propagar seguindo a
pilha de chamadas (cadeia dinâmica).
Linguagens de Programacão I
[email protected]
65
Exemplo
FileReader f = null;
try {
f = new FileReader(args[0]);
...
}
catch (IOException e){
System.out.println(e);
}
catch (OutraException e){
...
System.out.println(e);
}
finally{
if (f != null)
sempre executa
f.close();
}
...
Linguagens de Programacão I
[email protected]
66
33
Exemplo
FileReader f = null;
try {
f = new FileReader(args[0]);
...
}
catch (IOException e){
System.out.println(e);
}
catch (OutraException e){
...
System.out.println(e);
}
finally{
if (f != null)
sempre executa
f.close();
}
...
Linguagens de Programacão I
[email protected]
67
Exceções
Pode-se ainda definir novas exceções
através da especialização da classe
Exception ou de qualquer uma de suas
subclasses.
Métodos que não tratam uma exceção
do tipo checked devem declarar isso
explicitamente em sua assinatura
através do modificador throws.
Linguagens de Programacão I
[email protected]
68
34
Exemplo
public void metodoX() throws IOException{
FileReader f = null;
try {
f = new FileReader(args[0]);
...
indica o possível lançamento
f.close();
desta exceção
}
catch (Exception e){
System.out.println(e);
if (f != null)
f.close();
captura qualquer exceção
trow e;
}
...
relança a exceção
}
Linguagens de Programacão I
[email protected]
69
35
Download