Você está na página 1de 10

Linguagem de Programao Orientada a Objetos

NOTAS DE AULA
Paulo A. Pagliosa

Captulo 4
Introduo a Java
Java um sistema de programao orientado a objetos (POO) caracterizado por uma
linguagem e seu compilador, um conjunto de bibliotecas de classes, ou API (application
programming interface), e uma mquina virtual.
A API Java uma coleo de pacotes, cada pacote uma coleo de classes compiladas. A
API que acompanha o JDK (Java development kit) bastante extensa, com pacotes de
classes para programao de entrada/sada (incluindo arquivos), estruturas de dados,
funes matemticas, comunicao via rede, interfaces grficas, acesso a banco de dados,
persistncia de objetos, programao distribuda, grficos 2D e 3D, reflexo computacional,
web, entre muitas outras coisas. A mquina virtual Java (JVM, Java virtual machine) um
programa responsvel pela carga de um arquivo Java compilado e pela execuo do cdigo
objeto deste arquivo.
Caractersticas de Java
Java dito independente de plataforma e arquitetura porque um programa Java
executado por outro programa que a JVM. Ento, a independncia s ocorre se
houver uma JVM disponvel para determinada plataforma e arquitetura.
Java compilada e interpretada. O compilador Java toma como entrada um
programa fonte codificado em um arquivo texto com a extenso .java e gera como
sada um arquivo com o mesmo nome, mas com a extenso .class. Este arquivo
contm o cdigo objeto gerado pelo compilador, o qual consiste de uma seqncia
de bytes, cada byte representando uma operao que pode ou no ter outros bytes da
seqncia como argumentos. Esta seqncia de bytes chamada bytecode. Cada
mtodo em uma classe Java ter o seu bytecode em um arquivo .class. A JVM
carrega o arquivo .class e interpreta o bytecode.
4.1 Resumo da Sintaxe da Linguagem Java
Um arquivo .java denominado unidade de compilao. Em uma unidade de compilao,
podem ser declarados, na ordem:
1. Importao de classes (opcional);
2. Tipos, os quais podem ser classes ou interfaces.
A sintaxe :

UnidadeDeCompilao:
DeclaraoDeImportao*
DeclaraoDeTipo*

Uma declarao de importao define quais classes de quais pacotes sero utilizadas ao
longo da unidade de compilao. H classes da API (tais como java.lang.Object,
java.lang.String e java.lang.Exception) que so automaticamente importadas pelo
compilador, no sendo necessrio explicitar a declarao de importao. A sintaxe
DeclaraoDeImportao:
IMPORT Nome ";"
| IMPORT Nome "." "*" ";"

onde IMPORT a palavra reservada import e Nome o nome qualificado da classe ou


pacote. Um nome qualificado Q.s formado pela concatenao do nome qualificado Q
(chamado qualificador) seguido de ponto e do nome simples dado pelo identificador s:
Nome:
IDENTIFICADOR ("." IDENTIFICADOR)*

Uma declarao de tipo pode ser uma declarao de classe ou de interface.


DeclaraoDeTipo:
DeclaraoDeClasse | DeclaraoDeInterface

A declarao de uma classe com nome simples IDENTIFICADOR e superclasse Nome em Java
obedece a seguinte sintaxe:
DeclaraoDeTipo:
Modificador* CLASS IDENTIFICADOR (EXTENDS Nome)?
"{"
Membro*
"}"

onde CLASS e EXTENDS so as palavras reservadas class e extends, respectivamente. Os


modificadores podem ser:
Modificador:
PUBLIC
| PROTECTED
| PRIVATE
| STATIC
| ABSTRACT
| FINAL
| SYNCHRONIZED

correspondentes s palavras reservadas: public, protected, private, static, abstract,


final e synchronized. Em uma declarao de classe so vlidos os modificadores:

PUBLIC, indicando que a visibilidade da classe pblica, ou seja, pode ser acessada
de qualquer outra unidade de compilao (se omitido a visibilidade da classe
restrita ao pacote no qual a unidade de compilao foi declarada).

indicando que a classe abstrata (independentemente desta possuir ou


no mtodos abstratos).

FINAL,

ABSTRACT,

indicando que a classe no pode ser derivada, ou seja, no pode ser


superclasse de outra.

Em Java, apenas herana simples admitida. Se a superclasse no for especificada, a classe


sendo declarada deriva implicitamente da classe java.lang.Object.
Um membro de uma classe pode ser uma declarao de: atributo, mtodo, construtor ou de
um tipo interno:
Membro:
DeclaraoDeAtributo
| DeclaraoDeMtodo
| DeclaraoDeConstrutor
| DeclaraoDeTipo

(Em Java no h declarao de destrutor: todo objeto que no pode ser alcanado pela JVM
automaticamente destrudo pelo coletor de lixo da mquina virtual.) A declarao de um
atributo com nome simples IDENTIFICADOR obedece a seguinte sintaxe:
DeclaraoDeAtributo:
Modificador* Declarao
Declarao:
Tipo Declaradores ";"
Declaradores:
Declarador ("," Declarador)*
Declarador:
IDENTIFICADOR ("[" "]")* Inicializador?

Os modificadores vlidos na declarao de um atributo so:

ou PRIVATE, indicando a visibilidade do atributo (a ausncia


indica que o atributo visvel no pacote onde a classe declarada).

FINAL,

indicando que o atributo uma constante, ou seja, seu valor no pode ser
modificado (neste caso, Inicializador deve ser obrigatrio).

STATIC,

PUBLIC, PROTECTED

indicando que o atributo um atributo de classe.

O tipo de um atributo pode ser um tipo definido pelo programador (classe) ou um tipo
primitivo definido pelas seguintes palavras reservadas da linguagem:
boolean: true ou false;

byte:

double:

float:

nmero inteiro com sinal de 8 bits;


char: caractere UNICODE de 16 bits;
nmero real de 64 bits;

nmero real de 32 bits;


int: nmero inteiro com sinal de 32 bits;

long:

short:

nmero inteiro com sinal de 64 bits;


nmero inteiro com sinal de 16 bits.

Alm de classes e tipos primitivos, outros tipos podem ser definidos atravs de vetores uni
ou multidimensionais. Por exemplo, int[] representa o tipo vetor de inteiros e X[][]
representa matriz de objetos da classe X. Em Java, uma instncia de um tipo vetorado um
objeto daquele tipo. A sintaxe de tipo :
Tipo:
NomeDeTipo ("[" "]")*
NomeDeTipo:
NomeDeTipoPrimitivo
| Nome // nome de classe
NomeDeTipoPrimitivo:
BOOLEAN
| BYTE
| CHAR
| DOUBLE
| FLOAT
| INT
| LONG
| SHORT

Os nomes de tipos primitivos correspondem s palavras reservadas: boolean, byte, char,


double, float, int, long e short.
O inicializador define o valor inicial do atributo (obrigatrio se o atributo final). Pode ser
um inicializador simples ou, se o atributo for de um tipo vetorado, um inicializador de
vetor. A sintaxe :
Inicializador:
"=" (InicializadorSimples | InicializadorDeVetor)
InicializadorSimples:
Expresso
InicializadorDeVetor:
"{" ListaDeElementosDeVetor? "}"
ListaDeElementosDeVetor:
ElementosDeVetor ("," ElementosDeVetor)*
ElementosDeVetor:
Expresso
| InicializadorDeVetor

A sintaxe de declarao de um mtodo com nome simples IDENTIFICADOR :


DeclaraoDeMtodo:
Modificador* TipoDeRetorno IDENTIFICADOR "(" Parmetros? ")"
EspecificadorDeExcees?
(CorpoDeMtodo | ";")

TipoDeRetorno:
Tipo | VOID

onde VOID a palavra reservada void (se usada na especificao do tipo de retorno, indica
que o mtodo no possui valor de retorno). Os modificadores vlidos na declarao de um
atributo so:

PUBLIC, PROTECTED ou PRIVATE, indicando a visibilidade do mtodo (a ausncia


indica que o mtodo visvel no pacote onde a classe declarada).

FINAL, indicando que o mtodo no pode ser sobrescrito em classes derivadas. (Em
Java, todos os mtodos no estticos, exceto os construtores, so virtuais). Se a
classe foi declarada como final, ento todos os seus mtodos so finais.

STATIC,

ABSTRACT, indicando que o mtodo abstrato. Neste caso, a classe tambm tem que
ser declarada com abstrata. Um mtodo abstrato no pode ser final ou esttico.

indicando que o mtodo um mtodo de classe.

A declarao dos parmetros do mtodo obedece a seguinte sintaxe:


Parmetros:
Parmetro ("," Parmetro)*
Parmetro:
FINAL? Tipo IDENTIFICADOR

(FINAL indica que o valor do parmetro constante dentro do corpo do mtodo) Se o


mtodo pode lanar excees (veja Seo 4.2), a lista com os nomes das classes de
excees que podem ser lanadas no mtodo devem ser informadas no especificador de
excees:
EspecificadorDeExcees:
THROWS Nome ("," Nome)*

Se o mtodo foi declarado como abstrato, ento no possui corpo e sua declarao termina
com ponto e vrgula. Caso contrrio, a declarao termina com o bloco que define o corpo
do mtodo:
CorpoDeMtodo:
Bloco
Bloco:
"{"
Sentena*
"}"

A sintaxe de sentenas e expresses em Java so muito similares a do C++. A sintaxe


comum de sentenas :
Sentena:
Declarao
| Bloco
| Expresso? ";"
| SentenaIf

|
|
|
|
|
|
|
|
|
|
|

SentenaWhile
SentenaDo
SentenaFor
SentenaSwitch
SentenaCase
SentenaBreak
SentenaContinue
SentenaReturn
SentenaThrow
SentenaTry
SentenaCatch

(H outras sentenas especficas de Java que no sero apresentadas aqui). Apenas para
exemplificar, a sintaxe de sentenas tipo IF-ELSE :
SentenaIf:
IF "(" Expresso ")" Sentena (ELSE Sentena)?

onde IF e ELSE so as palavras reservadas if e else, respectivamente.


A declarao de um construtor da classe IDENTIFICADOR obedece a seguinte sintaxe:
DeclaraoDeConstrutor:
Modificador* IDENTIFICADOR "(" Parmetros? ")"
EspecificadorDeExcees?
CorpoDeConstrutor

Os nicos modificadores vlidos na declarao de um construtor so: PUBLIC, PROTECTED


ou PRIVATE, indicando a visibilidade do mtodo (a ausncia indica que o construtor
visvel no pacote onde a classe declarada). O corpo do construtor um bloco, como o
corpo de um mtodo, mas com a diferena que a primeira sentena pode ser a invocao de
um dos construtores da superclasse (palavra reservada super) ou a invocao de outro
construtor da classe (palavra reservada this). A sintaxe :
CorpoDeConstrutor:
"{"
((SUPER | THIS) "(" ListaDeExpresses ")" ";")?
Sentena*
"}"
ListaDeExpresses:
Expresso ("," Expresso)*

onde SUPER e THIS so as palavras reservadas super e this, respectivamente, e a lista de


expresses so os argumentos do construtor sendo invocado.
Uma unidade de compilao Java pode ter vrias declaraes de tipo, mas deve declarar, na
prtica, uma classe cujo nome o mesmo nome da unidade de compilao. Esta classe
principal deve ser a nica classe pblica da unidade de compilao.
O ponto de entrada de execuo de uma aplicao Java o mtodo declarado na classe
principal da unidade de compilao cuja assinatura :

static public void main (String[] args)

O parmetro args so os argumentos passados para o mtodo na linha de comando.


Exerccio 4.1
Implemente uma lista de objetos em Java com mtodos para adicionar, procurar e remover
elementos, bem como obter um iterador para a lista.
Exerccio 4.2
Estude as classes java.lang.Object, java.lang.String e java.lang.Exception.

4.2 Tratamento de Excees


Em Java, uma exceo definida pelo programador um objeto da classe Exception ou dela
derivada. Como em C++, sentenas de um mtodo que podem resultar no lanamento de
uma ou mais excees ou (1) devem ser enclausuradas no bloco de uma sentena try no
corpo do mtodo, ou (2) o mtodo deve especificar em seu cabealho quais excees este
pode lanar (veja a sintaxe de declarao de mtodos na Seo 4.1).
Se uma exceo lanada dentro de um bloco try, o fluxo de controle transferido para a
primeira sentena do primeiro bloco catch cujo parmetro casar com o tipo da exceo
lanada. Por exemplo:
try
{
// tenta executar algumas sentenas aqui
...
}
catch (IOException e)
{
// trata erro de entrada e sada
...
}
catch (ClassCastException e)
{
// trata erro de converso de tipo
...
}

(IOException e ClassCastException derivam ambas de Exception). Observe agora:


try
{
// tenta executar algumas sentenas aqui
...
}
catch (Exception e)
{
// trata QUALQUER exceo
...
}

catch (IOException e)
{
// trata erro de entrada e sada
...
}
catch (ClassCastException e)
{
// trata erro de converso de tipo
...
}

Independentemente da exceo lanada no bloco try, o bloco a ser executado seria aquele
do primeiro catch, pois claro que qualquer exceo verificada do tipo Exception. Se
uma exceo lanada no casar em tipo ou parmetro de nenhum catch, esta ser tratada
internamente pela JVM.
Java ainda permite o uso opcional de uma sentena finally, cujo bloco deve suceder o
ltimo catch (a presena do bloco finally torna opcional a presena de blocos catch). Se
um bloco finally estiver presente, suas sentenas sempre sero executadas pela JVM,
independentemente de uma exceo ter ou no sido lanada no try e tratada em algum
catch.

4.2 Interfaces
Em Java, pode-se definir um novo tipo atravs de uma declarao de classe. Alm da
declarao de classe, um novo tipo pode ser definido atravs de uma declarao de
interface. Uma declarao de interface similar a uma declarao de classe contendo
apenas atributos estticos constantes e mtodos abstratos, como no exemplo a seguir:
public interface I
{
public void m1();
public void m2();
}

A interface I acima declara mtodos pblicos m1() e m2() (no necessrio uso explcito
do modificador abstract). No proibida a declarao de atributos em uma interface, mas
se houver esta deve ser final e static; no h atributos de instncia em uma interface. A
sintaxe de declarao de interface :
DeclaraoDeInterface:
Modificador* INTERFACE IDENTIFICADOR (EXTENDS Nome)?
"{"
Membro*
"}"

onde INTERFACE a palavra reservada interface, Nome o nome qualificado de outra


interface (note: uma interface pode entender outra interface, no uma classe) e Membro
uma declarao de mtodo (abstrato) ou de atributo (final static).

Uma classe Java pode implementar uma ou mais interfaces. Implementar uma interface
significa que todos os mtodos declarados na interface devem ser sobrecarregados na
classe. Note: uma classe pode entender somente outra classe (herana simples), mas pode
implementar vrias interfaces. Interfaces possibilitam a adio de mltiplas funcionalidades
a uma classe Java. Um objeto de uma classe X que implementa uma interface I
efetivamente do tipo X e tambm do tipo I.
A sintaxe revista de declarao de tipo :
DeclaraoDeTipo:
Modificador* (CLASS | INTERFACE) IDENTIFICADOR
(EXTENDS Nome)?
(IMPLEMENTS ListaDeNomes)?
"{"
Membro*
"}"
ListaDeNomes:
Nome ("," Nome)*

onde IMPLEMENTS a palavra reservada implements. O(s) nome(s) em ListaDeNomes


deve(m) ser nome(s) de interface(s).
Exemplo 4.1
A classe A abaixo estende a classe X e implementa a interface I.
public class A extends X implements I
{
public void m1()
{
...
}
public void m2()
{
...
}
...
}

Pode-se escrever X x = new A(), pois o objeto x do tipo X, uma vez que a classe A deriva
ou entende a classe X. Pode-se escrever tambm I i = new A(), pois o objeto i, um novo A,
do tipo I uma vez que a classe A implementa a interface I.
Tem-se tambm a seguinte equivalncia:
public abstract class X
{
public abstract void m1();
public abstract void m2();
}

equivalente a:

public interface I
{
public void m1();
public void m2();
}
public abstract class A extends X implements I
{
}