Sei sulla pagina 1di 56

Fundamentos da linguagem Java

e Orientao a Objeto
Autor: Lucas Medeiros de Freitas
Verso 1.0

Instrutor: Lucas Medeiros de Freitas | E-mail: lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto

ndice
I - Fundamentos da linguagem Java e Orientao a Objeto
1. Primitivos, Classes, Objetos e Enumeraes
1.1. Variveis

1
1
1

1.1.1. Primitivos

1.1.2. Variveis de Referncia

1.2. Classes x Objetos

1.2.1. Classes

1.2.2. Objetos

1.3. Array

1.4. Enumeraes

2. Converso de tipos primitivos (typecast)

10

2.1. Converso implcita

10

2.2. Converso explcita

10

3. Primitivos e Classes Wrapper


3.1 Mtodos de converso dos Wrappers
4. Identificadores, Conveno de Cdigo e Padro JavaBeans
4.1. Organizao dos arquivos

10
12
12
12

4.1.1. Extenso

12

4.1.2. Arquivo de cdigo fonte

13

4.2. Conveno de nomes


2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

14
i

Fundamentos da linguagem Java e Orientao a Objeto

4.2.1. Nomeando Classes e interfaces

14

4.2.2. Nomeando Mtodos

14

4.2.3. Nomeando Variveis

14

4.2.4. Nomeando Constantes

14

4.2.5. Especificao JavaBeans

15

5. Escopo de variveis

16

5.1. Variveis de Instncia

16

5.2. Variveis locais

17

5.3. Parmetros de mtodos

18

6. Controle de acesso e modificadores

19

6.1. Controle de acesso a Classes

19

6.1.1. Classes com controle de acesso default

19

6.1.2. Classes com o modificador de acesso public

20

6.2. Modificadores de classe no referentes a acesso

20

6.2.1. O modificador final

20

6.2.2. Modificador abstract

21

6.3. Controle de acesso a membros de classe

22

6.3.1. Membros public

22

6.3.2. Membros private

23

6.3.3. Membros default

24

6.3.4. Membros protected

25

6.3.5. Variveis locais e modificadores de acesso

25

7. Membros static

26

7.1. Variveis static

26

7.2. Mtodos static

26

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

ii

Fundamentos da linguagem Java e Orientao a Objeto

8. Membros final
8.1. Variveis final

27
27

8.1.1. Variveis final do tipo primitivo

27

8.1.2. Variveis final de referncia

28

8.2. Mtodos final

28

9. Controle de fluxo

29

9.1. Condicionais

29

9.1.1. if-else

29

9.1.2. switch

30

9.2. Loops

31

9.2.1. while

31

9.2.2. do-while

31

9.2.3. for

32

10. Construtores

32

10.1. Declarando construtores

32

10.2. Sobrecarregando construtores

33

11. Encapsulamento
11.1. Getters e Setters
12. Relacionamento entre classes

34
34
35

12.1. Associao

35

12.2. Agregao

36

12.3. Composio

36

12.4. Herana

36

13. Classes abstratas

39

14. Interfaces

40

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

iii

Fundamentos da linguagem Java e Orientao a Objeto

15. Classes concretas

42

16. Polimorfismo

42

17. Herana x Composio

44

18. Subscrevendo e sobrecarregando mtodos

49

18.1. Subscrevendo mtodos

49

18.2. Sobrecarregando mtodos

50

II - Referncias bibliogrficas

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

51

iv

Fundamentos da linguagem Java e Orientao a Objeto

I - Fundamentos da linguagem Java e Orientao a Objeto

1. Primitivos, Classes, Objetos e Enumeraes


1.1. Variveis
Em Java, existem dois tipos de variveis:
Primitivas: Contm valores bsicos (padres de bits simples). Um primitivo pode ser de oito tipos diferentes:
boolean, byte, short, int, long, char, float, double.
Variveis de referncia: So variveis usadas para se referir ou acessar um objeto.

1.1.1. Primitivos
Primitivos so os tipos mais bsicos de dados em Java, por isso possuem este nome. So eles que do origem a todos os
tipos de dados mais avanados, como os objetos. Um espao na memria reservado sempre que um primitivo
declarado, e cada tipo primitivo ocupa um determinado espao em bits na memria.
Variveis primitivas podem ser declaradas como variveis de classe (static), variveis de instncia, parmetros de mtodos
ou variveis locais.
Observao
Diferente das variveis de referncia, as variveis de tipo primitivo recebem como valor o real contedo da varivel.
O valor de um tipo primitivo sempre copiado.
Ex: int x = 1; // x recebe uma cpia do valor 1
int y = x; // y recebe uma cpia do valor de x
x = x + 2; // x vira 3 mas y continua valendo 1
Java possui oito tipos primitivos:
byte
short
int
long
char
double
float
boolean

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto


E so divididos em trs tipos:
Tipos inteiros: byte, short, int, long, char
Tipos de ponto flutuante: float, double
Tipo booleano: boolean
Observao
importante lembrar que os nomes dos tipos primitivos so palavras reservadas do Java, ou seja, no se pode
declarar variveis com seus nomes.
Aps declarado, um tipo primitivo nunca pode ser modificado (embora seu valor possa se modificar).
Para se obter o intervalo de um tipo primitivo basta seguir a frmula:
Valor mnimo: -2 nbits - 1
Valor mximo: 2 nbits - 1 - 1

* Obs: nbits = nmero de bits


Tipo

Uso

Bits

Bytes

Intervalo mnimo Intervalo mximo

boolean

true ou false

N/D

N/D

---

---

char

caractere Unicode

16

\u0000 (0)

\uFFFF (65535)

byte

inteiro

-2 7

2 7 -1

short

inteiro

16

-2 15

2 15 -1

int

inteiro

32

-2 31

2 31 -1

long

inteiro

64

-2 63

2 63 -1

float

ponto flutuante

32

n/d

n/d

double

ponto flutuante

64

n/d

n/d

Tabela 1. Intervalo de tipos primitivos em Java

Tipos inteiros
Todos os tipos inteiros em Java, com exceo do char, so assinalados, ou seja, podem ser positivos ou negativos. O bit
mais esquerda representa seu sinal ( 1 = negativo, 0 = positivo ). Em Java, h trs maneiras de representar inteiros:
decimal (base 10), octal (base 8) e hexadecimal (base 16).
Ex:
00010011: valor positivo
10010011: valor negativo
Declarando inteiros decimais:
int um = 1;
int seis = 6;
Os inteiros octais so representados adicionando um zero no incio e podem ter at 21 posies alm do zero:
int um = 01;
int dois = 02;
int oito = 010;
2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto

Hexadecimais tambm so declarados como int e podem ter at 16 dgitos alm do 0x:

int um = 0x01;
int dois = 0x02;
int oito = 0x08;
int x = 0x7fffffff;
int y = 0xDeadCafe;
Por padro, os literais inteiros so definidos como int. Para se declarar um inteiro como long basta adicionar o sufixo F ou
f.
Ex:
long x = 76098L; // repare o sufixo L no literal
long y = 0xDeadCafel; // repare o sufixo l no literal
Observao
Os hexadecimais no so case sensitive em Java, ou seja, tanto 0xDEAD quanto 0xdead so vlidos.
O primitivo char
O char classificado como um primitivo inteiro no assinalado. O primitivo char recebe como literal um nico caractere
Unicode de 16 bits entre aspas simples.
Declarando um char:
char a = a;
char x = x;
O char tambm pode receber como literal o valor Unicode do caractere. Para isto, basta acrescentar o prefixo \u ao valor.
Ex:
char z = \u005A; // valor Unicode do caractere Z
Observao
Por se tratar de um inteiro de 16 bits no assinalado, o char no aceita valor negativo como literal. Seu intervalo vai
de 0 a 65535.
Ex: char a = 0x982; // literal hexadecimal
char b = 786; // literal inteiro
char c = (char) 70000; // necessrio o typecast devido ao valor 70000 estar fora do intervalo do char
char d = (char) -41; // necessrio o typecast devido ao valor -41 estar fora do intervalo do char

O char tambm pode usar cdigo de escape como literal.


Ex: char e = \; // aspa dupla
char f = \n; // nova linha

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto


Tipos de ponto flutuante
Java possui dois tipos primitivos de ponto flutuante: float (de preciso simples) e double (de preciso dupla). O primitivo de
ponto flutuante padro o double, ou seja, para se declarar um float necessrio adicionar o sufixo F ou f ao valor literal.
Declarando primitivos de ponto flutuante:
float w = 27.345322F; // perceba o uso do sufixo F no valor literal
double x = 45.9734; // no necessrio adicionar sufixo ao literal por se tratar de um double (padro)
double y = 32.83433321D; // o sufixo D ou d opcional para o primitivo double
float z = 97.345322; /* Este exemplo gerar um erro de compilao por estarmos tentando adicionar um nmero em
um primitivo menos preciso. Faltou, ento, adicionar o sufixo F ou f */
Tipo booleano
O primitivo booleano em Java o boolean, e recebe apenas os valores: true ou false. Por se tratar de um tipo que recebe
apenas dois valores (true ou false) o boolean no possui um intervalo, e o seu tamanho em bits depende da mquina virtual.
Declarando o primitivo boolean:
boolean t = true;
boolean f = false;

1.1.2. Variveis de Referncia


Variveis de referncia so aquelas que fazem referncia a um objeto. Uma varivel de referncia no guarda o objeto em si,
ela apenas grava uma referncia ao mesmo, ou seja, ela grava uma maneira de como acessar um objeto. Aps declarada,
uma varivel de referncia nunca poder ter seu tipo modificado.
Variveis de referncia podem ser declaradas como variveis de classe (static), variveis de instncia, parmetros de
mtodos ou variveis locais.
Ex:

Object obj; // varivel de referncia obj do tipo Object

String s; // varivel de referncia s do tipo String

Pessoa pessoa; // varivel de referncia pessoa do tipo Pessoa

1.2. Classes x Objetos


1.2.1. Classes
Classe uma estrutura que descreve um objeto, ou simplesmente: o projeto de um objeto. Pense, por exemplo, na planta
de um edifcio e o edifcio em si: a planta seria o exemplo de uma classe, enquanto que o edifcio seria o objeto, ou seja, a
implementao desta classe. Classes so compostas basicamente de atributos e mtodos. Os atributos representam o
estado de um objeto e os mtodos representam seu comportamento.

1.2.2. Objetos
Objetos so instncias de classes concretas. Os objetos so tipos de dados mais avanados, que podem conter tipos
primitivos e outros objetos. Em Java, um objeto criado utilizando o operador new.
Ex:

public class Teste {

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto







public static void main(String[] args) {



Teste teste = new Teste(); // criao de um novo objeto Teste
}

A mquina virtual do Java (JVM) armazena todos os objetos em um espao de memria


chamado de heap 1. Este um espao de memria dinmico, ou seja, seu tamanho pode ser
expandido ou contrado de acordo com a necessidade.
O espao reservado para um objeto ser o suficiente para armazenar todas as suas variveis
de instncia.
Diferente da linguagem C, Java no possui aritmtica de ponteiros: o espao de memria
utilizado para os objetos (heap) reciclado automaticamente pela JVM atravs do coletor de
lixo (garbage collector).
Caso seu programa, em Java, precise de mais heap do que o disponibilizado, ir causar um
erro na JVM: OutOfMemoryError.
Figura 1. Esquema

A Figura 1 ilustra o esquema lgico de alocao de memria da JVM.

lgico de baixo nvel.


Fonte: Gerncia de
memria em Java Argonavis.

1.3. Array
Em Java, array um objeto que contm um conjunto de variveis de mesmo tipo, que podem ser primitivos ou referncias
a objetos.
No obrigatrio informar o tamanho do array em sua declarao. Declarando um array:

int[] var1; // array de inteiros

Object[] var2; // array de Object

Por ser um objeto, o array guardado no heap da JVM e para inicializ-lo utilizamos o operador new. O array tem tamanho
fixo e para inicializ-lo obrigatrio informar seu tamanho. Inicializando um array:

String[] var3 = new String[10]; // array de String com 10 posies

char[] var4;

var4 = new char[21]; // inicializando array de char com 21 posies

Definindo valores em um array:


int[] a = new int[3];

a[0] = 1;

a[1] = 1;

a[2] = 1;

Podemos tambm declarar, construir e inicializar um array na mesma linha:


String[] var5 = { "conteudo1", "conteudo2", "conteudo3" }; // array de String j construdo, com 3 posies

Carro vectra = new Carro("Vectra"); // objeto do tipo Carro

Carro[] carros = { vectra, new Carro("Astra"), new Carro("Celta") }; // array de Carro j construdo, com 3 posies

Para percorrer os itens de um array podemos, por exemplo, fazer um loop com o for:
1 heap a ra de dados onde todas as instncias de objetos e vetores so alocados, e compartilhada por todos os threads. O heap criado na inicializao

da mquina virtual (JVM). O heap tambm conhecido como Pilha de lixo coletvel.

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto


String[] var5 = { "conteudo1", "conteudo2", "conteudo3" };

for (String s: var5) {

System.out.println(s); // imprimir na tela o contedo da posio atual do array

Podemos definir os valores de um array em um loop:


Carro[] carros = new Carro[5];

for (int i = 0; i < carros.length; i++) {

carros[i] = new Carro();

Podemos tambm criar array de arrays, que so chamados de arrays multidimensionais:


int[][] meuArray = new int[3][];

int[] a = new int[2];

meuArray[0] = a;

meuArray[0][0] = 1;

meuArray[0][1] = 2;

int [] b = new int[3];

meuArray[1] = b;

meuArray[1][0] = 1;

meuArray[1][1] = 2;

meuArray[1][2] = 3;

No exemplo acima temos um array multidimensional de 3 posies.

1.4. Enumeraes
Um Enum (enumerao) um tipo especial de classe. basicamente uma lista de constantes enumeradas e est disponvel
a partir da verso 5 do Java. O Enum foi criado com o intuito de impedir que valores inesperados sejam recebidos em um
trecho do seu cdigo, impedindo com isso que erros sejam lanados em tempo de execuo.
Imagine, por exemplo, que voc tenha um Barco no rio Amazonas, no estado do Amap, e que este viaje apenas pelos
municpios deste estado. Voc dever ter na classe Barco um mtodo que recebe como parmetro a cidade para a qual o
barco deve se deslocar. Como voc faria? Bom, voc poderia usar como parmetro um objeto do tipo String, ou talvez um
inteiro com o cdigo da cidade. Seu cdigo ficaria parecido com esse:

class Barco {


public void viajaPara(String cidade) {


System.out.println("Viajando para " + cidade);

}

}

O cdigo funcionar perfeitamente, mas voc correria o risco de um usurio informar uma cidade inesperada, veja:

public class Exemplo1 {

public static void main(String[] args) {



Barco barco = new Barco();

barco.viajaPara("Goinia"); // ao executar, ser mostrado na sada: Viajando para Goinia
}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto


Sabemos que Goinia est fora da rota normal do barco e que no deveria ser aceita como parmetro, pois no uma
cidade do estado do Amap. Como evitar este problema? Com certeza criar um monte de blocos condicionais com if
para checar se trata-se de uma cidade do estado do Amap no seria a melhor das solues.
Pensando exatamente neste tipo de problema os desenvolvedores do Java criaram o Enum, nos possibilitando escolher um
item dentre vrios disponveis em uma lista enumerada.
Veja agora o exemplo anterior utilizando um Enum:



enum CidadesNavegaveis {

AMAPA, CALCOENE, FERREIRA_GOMES, LARANJAL_DO_JARI, MACAPA, MAZAGAO, OIAPOQUE,

PORTO_GRANDE, SANTANA, SERRA_DO_NAVIO, TARTARUGALZINHO, VITORIA_DO_JARI;
}

class Barco {


public void viajaPara(CidadesNavegaveis cidade) { /* perfeito! Impedimos um valor inesperado em





tempo de execuo! */


System.out.println("Viajando para " + cidade);

}

}

public class Exemplo1 {









}

public static void main(String[] args) {





}

Barco barco = new Barco();


barco.viajaPara(CidadesNavegaveis.MACAPA); /* enviando um item dentre os disponveis */

Agora sim podemos assegurar de que nosso barco navegar apenas entre as cidades desejadas.
Um Enum pode ser declarado em um arquivo Java separado ou como um membro de uma classe, mas nunca dentro de
um mtodo.
Declarando um Enum em um arquivo Java separado




Arquivo CidadesNavegaveis.java:
enum CidadesNavegaveis {

AMAPA, CALCOENE, FERREIRA_GOMES, LARANJAL_DO_JARI, MACAPA, MAZAGAO, OIAPOQUE,

PORTO_GRANDE, SANTANA, SERRA_DO_NAVIO, TARTARUGALZINHO, VITORIA_DO_JARI;
}

Declarando um Enum como membro de uma classe











Arquivo Barco.java:
class Barco {


enum CidadesNavegaveis {

AMAPA, CALCOENE, FERREIRA_GOMES, LARANJAL_DO_JARI, MACAPA, MAZAGAO, OIAPOQUE,

PORTO_GRANDE, SANTANA, SERRA_DO_NAVIO, TARTARUGALZINHO, VITORIA_DO_JARI;

}


public void viajaPara(CidadesNavegaveis cidade) {


System.out.println("Viajando para " + cidade);

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto




Cada item enumerado em um Enum uma instncia do prprio Enum. No exemplo acima, cada cidade enumerada
(MACAPA, MAZAGAO, OIAPOQUE, etc) uma instncia do tipo CidadesNavegaveis. Confuso, no?!? Para que voc
entenda melhor, o Enum algo parecido como isto:
class CidadesNavegaveis {



public static final CidadesNavegaveis AMAPA = new CidadesNavegaveis("AMAPA", 0);

public static final CidadesNavegaveis CALCOENE = new CidadesNavegaveis("CALCOENE", 1);

public static final CidadesNavegaveis FERREIRA_GOMES = new CidadesNavegaveis("FERREIRA_GOMES", 2);

public static final CidadesNavegaveis LARANJAL_DO_JARI = new CidadesNavegaveis("LARANJAL_DO_JARI", 3);

public static final CidadesNavegaveis MACAPA = new CidadesNavegaveis("MACAPA", 4);

// ...



public CidadesNavegaveis(String nome, int indice) {



// ...

}


}
Em um Enum todos os valores enumerados so static e final, portanto so constantes. Os valores so tambm
implicitamente public, e cada valor guarda seu prprio ndice, que definido na ordem em que o item declarado.
Alm de definir constantes enumeradas, no Enum podemos tambm criar construtores, variveis de instncia, mtodos e
algo muito estranho chamado corpo de classe especfico da constante.
Nosso barco agora sabe para quais cidades ele pode se deslocar, mas ainda no inteligente o bastante para saber aonde
fica cada cidade. Vamos ajudar no nosso barco relacionando cada cidade enumerada com sua respectiva coordenada
geogrfica. Podemos, para isto, utilizar um construtor para passar a coordenada como parmetro e preencher uma varivel
de instncia, caso precisemos recuperar este valor mais tarde. Nosso Enum ficaria assim:













enum CidadesNavegaveis {

AMAPA("2.051082,-50.794464"),

CALCOENE("1.933227,-50.736237"),

FERREIRA_GOMES("-0.116043,-51.28315"),

LARANJAL_DO_JARI("0.854155,-51.182556"),

MACAPA("0.034457,-51.066564"),

MAZAGAO("2.497911,-50.947037"),

OIAPOQUE("-0.906334,-51.965332");


CidadesNavegaveis(String coordenada) {


this.coordenada = coordenada;

}


private String coordenada;

public String getCoordenada() {



return coordenada;
}

Perceba que agora cada item enumerado passa como parmetro uma String contendo a coordenada geogrfica para o
construtor do Enum, e essa String armazenada em uma varivel de instncia. Essa varivel poder ser acessada
posteriormente pelo mtodo getCoordenada que criamos. Veja:

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto










class Barco {


public void viajaPara(CidadesNavegaveis cidade) {


System.out.println("Viajando para " + cidade);


System.out.println("Coordenada: " + cidade.getCoordenada()); /* Agora nossa classe Barco



imprime tambm a coordenada geogrfica da cidade enviada como parmetro. */

}

}

No possvel invocar diretamente um construtor de um Enum, ele acessado automaticamente pelo item enumerado,
que enviar os parmetros necessrios, como fizemos no item enumerado MACAPA("0.034457,-51.066564") que passa
uma String como parmetro ao construtor. O Enum aceita construtores com mais de um parmetro e tambm nos permite
sobrecarregar o construtor. [Falaremos sobre sobrecarga de construtores mais adiante]
Outro recurso importante em um Enum a possibilidade de criar um corpo de classe especfico da constante. Imagine
que nosso barco precise saber qual cidade a capital do estado. Ao invs de criar blocos condicionais com if podemos
criar um mtodo que retorne true caso a cidade seja capital e false caso no seja. Teremos ento um mtodo padro que
retornar sempre false, e para a cidade que capital iremos sobrecarregar este mtodo para que ele retorne true. Veja:

















enum CidadesNavegaveis {

AMAPA("2.051082,-50.794464"),

CALCOENE("1.933227,-50.736237"),

FERREIRA_GOMES("-0.116043,-51.28315"),

LARANJAL_DO_JARI("0.854155,-51.182556"),

MACAPA("0.034457,-51.066564") { // corpo de classe especfico da constante


public boolean isCapital() { // mtodo sobrecarregado, para a capital



return true;


}

},

MAZAGAO("2.497911,-50.947037"),

OIAPOQUE("-0.906334,-51.965332");


CidadesNavegaveis(String coordenada) {


this.coordenada = coordenada;

}


private String coordenada;

public String getCoordenada() {



return coordenada;
}
public boolean isCapital() { // mtodo padro, para cidades no-capital

return false;
}

Agora nosso mtodo viajaPara imprimir true caso a cidade informada como parmetro seja MACAPA, a capital do Amap.
Veja:








class Barco {


public void viajaPara(CidadesNavegaveis cidade) {


System.out.println("Viajando para " + cidade);


System.out.println("Coordenada: " + cidade.getCoordenada());


System.out.println(" capital: " + cidade.isCapital());

}

}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

Fundamentos da linguagem Java e Orientao a Objeto


No possvel estender explicitamente uma classe em um Enum. Ele estende implicitamente a classe java.lang.Enum, e
herda desta alguns mtodos, como o values() que retorna um Array contendo os itens enumerados definidos pelo
programador. Este mtodo nos permite, por exemplo, iterar entre nossos itens enumerados, veja:

public class Exemplo2 {

public static void main(String[] args) {






}

for (CidadesNavegaveis cidade: CidadesNavegaveis.values()) {



System.out.println(cidade);
}

O cdigo acima imprimir na tela todas as cidades enumeradas em nosso Enum CidadesNavegaveis.

2. Converso de tipos primitivos (typecast)


Converter um tipo primitivo significa transformar o valor de um tipo primitivo em outro tipo. A converso pode ocorrer de
forma implcita ou explcita.

2.1. Converso implcita


A converso implcita aquela que acontece de forma automtica, quando se faz um upcast, ou seja, quando se deseja
converter um literal de um continer menor para um maior.
Ex:
int x = 953;
long y = x; // converso implcita, um valor int sempre caber em um long
double z = 98L; // converso implcita, um valor long sempre caber em um double

2.2. Converso explcita


A converso explcita aquela onde se deseja converter um valor maior em um continer menor, ou seja, quando se faz um
downcast. Esta converso no ocorre de forma automtica, tornando-se necessrio escrever um cdigo para ela.
Ex:
float w = 47.9333F;
int x = (int) w; /* converso explcita (o valor perder os digitos depois do ponto decimal, ocorrendo perda de
informao) */
int y = (int) 98.6725888; // conveso explcita de double para int
byte z = (byte) 128; // conveso explcita de int para byte (o byte armazena de -128 a 127)

3. Primitivos e Classes Wrapper


Como vimos anteriormente, primitivos so os tipos de dados mais bsicos, e so uma das poucas coisas que no so
objetos em Java. Existem Classes Wrapper em Java para trabalhar com os primitivos, permitindo converter primitivos em
objetos, e vice-versa. O Wrapper nos permite encapsular os tipos primitivos para serem manipulados como objetos, alm
de fornecer mtodos e utilitrios para trabalhar com os primitivos.
Classes Wrapper para primitivos:
Byte

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

10

Fundamentos da linguagem Java e Orientao a Objeto


Short
Integer
Long
Double
Float
Character
Boolean
O Wrapper nos permite:
1.

converter de um objeto Wrapper para primitivo

2.

converter de String para primitivo

3.

converter de String para objeto Wrapper

Ex:

int x = 10; // varivel de tipo primitivo com valor 10

Integer y = new Integer(10); // objeto (Wrapper) da classe Integer

A partir do Java 5 os objetos Wrapper dos tipos primitivos possuem o recurso de auto-boxing, permitindo converter
primitivos para objetos Wrapper (e vice-versa) automaticamente. Desta maneira, o trabalho de fazer boxing e unboxing fica
transparente para o programador.
Na verdade, quando voc escreve o cdigo abaixo (por exemplo):

Integer x = 23;

o compilador Java sempre far o seguinte:


Integer x = Integer.valueOf(23);

O que o mtodo valueOf faz simplesmente receber um literal primitivo como parmetro e retornar um Wrapper
correspondente a esse primitivo.
Observao
O Wrapper imutvel (no possui um setter), portanto no se pode modificar seu valor literal:


Integer x = 23;
x = 50; // o valor inicial 23 no alterado para 50 mas sim um novo objeto Integer criado e atribudo varivel x
Na verdade o compilador far o auto-boxing nos bastidores:
x = Integer.valueOf(50); // o mtodo valueOf ir retornar um novo objeto Wrapper com o valor 50.

Por questes de otimizao (economia de memria) a JVM inicializa, em cache, os seguintes valores literais para os
Wrappers:
Byte: todo seu intervalo;
Boolean: true e false;
Integer e Short: a range -128 ~ 127;
Character: a range \u000 ~\u007f (ou seja, do decimal 0 ao 127)

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

11

Fundamentos da linguagem Java e Orientao a Objeto


ou seja, para literais dentro desse intervalo a JVM ir utilizar sempre o mesmo objeto com valor guardado em cache. Para
comparar objetos Wrapper de primitivos com valor abaixo ou acima desses valores deve-se utilizar o mtodo equals(), por
se tratar de objetos diferentes.
Ex:

... {

Integer w = 127;

Integer x = 127;

Integer y = 128;

Integer z = 128;

System.out.println(w==x); // imprime true

System.out.println(y==z); // imprime false

3.1 Mtodos de converso dos Wrappers


Como dito anteriormente, os Wrappers disponibilizam alguns mtodos para trabalhar com os tipos primitivos, facilitando o
seu uso.
xxxValue(): mtodo utilizado para converter um objeto wrapper em um tipo primitivo, onde xxx o tipo primitivo.
Ex:
Integer x = new Integer(23); // objeto do tipo Integer
int y = x.intValue(); // converso do objeto wrapper Integer para um primitivo int
double z = x.doubleValue(); // converso do objeto wrapper Integer para um primitivo double
parseXXX(): converte um objeto do tipo String para um wrapper.
Ex:
String s = 10.5;
Float x = Float.parseFloat(s); // converso de um objeto do tipo String para um objeto do tipo Float
valueOf(): converte um objeto do tipo String para um tipo primitivo
Ex:

float x = Float.valueOf(10.5); // converso de um objeto do tipo String para um primitivo float

4. Identificadores, Conveno de Cdigo e Padro JavaBeans


Praticamente 80% do tempo gasto no desenvolvimento de um software empregado na manuteno do mesmo. Imagina
se ao dar a manuteno em seu prprio cdigo de tempos atrs ou no cdigo de terceiros voc ter que enfrentar o
problema de ilegibilidade do cdigo, encontrando uma verdadeira baguna com nomes sem sentido, sem regras de
nomenclatura e cdigo sem uma sequncia lgica. Dureza, no?!? Por este motivo Java possui uma conveno de cdigo,
deixando-o mais legvel, limpo e de fcil manuteno: um cdigo mais profissional.

4.1. Organizao dos arquivos


4.1.1. Extenso

Extenso de arquivo de cdigo fonte: .java

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

12

Fundamentos da linguagem Java e Orientao a Objeto


Extenso de arquivo de bytecode: .class

4.1.2. Arquivo de cdigo fonte


No incio do arquivo de cdigo fonte pode-se inserir um comentrio inicial. Veja:






/*
* Nome da classe
*
* Verso
*
* Informao de Copyright
*/

Para classes que estejam dentro de um pacote (package) a declarao do pacote deve ser sempre a primeira linha
no comentada do arquivo de cdigo fonte, seguido das declaraes de import. Veja:



package cursojava; // declarao de pacote


import java.math.BigDecimal; // declarao de import
import java.util.List; // declarao de import

A declarao de classe ou interface deve vir aps as declaraes de import. Pode-se tambm adicionar um
comentrio da classe acima de sua declarao, incluindo tags do javadoc, e aps a declarao class ou interface
pode-se adicionar um comentrio da sua implementao. Veja:











/**
* Comentrios e tags javadoc para a classe
* @author lucasfreitas
*
*/
public class Exemplo1 { // declarao de classe

/*

* Comentrios da implementao

*/


// ...
}

A declarao das variveis de instncia vm logo aps a declarao de classe ou interface, e em seguida declaramos construtores e por ltimo os mtodos. Veja:

















/*
* Nome da classe
*
* Verso
*
* Informao de Copyright
*/
package cursojava; // declarao de pacote
import java.math.BigDecimal;
import java.util.List;
/**
* Comentrios e tags javadoc para a classe
* @author lucasfreitas
*
*/
public class Exemplo1 { // declarao de classe

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

13

Fundamentos da linguagem Java e Orientao a Objeto














/*
* Comentrios da implementao
*/
private BigDecimal var1; // varivel de instncia
private List<String> var2; // varivel de instncia
private long var3; // varivel de instncia
public static void main(String[] args) { // mtodo

// ...
}

4.2. Conveno de nomes


A conveno de nomes facilita a leitura do cdigo Java. Atravs dela podemos identificar facilmente uma declarao de
pacote, uma declarao de classe, uma constante, um mtodo e a implementao do cdigo em geral.

4.2.1. Nomeando Classes e interfaces


O nome de classes e interfaces deve ser um substantivo, claro e descritivo, contendo letras maisculas e minsculas. A
inicial de cada palavra deve ser sempre maiscula. Procure usar nomes inteiros, evitando abreviaes. Exemplo:

class Cachorro
class CarroConversivel
interface Veiculo
interface TelefoneFixo

4.2.2. Nomeando Mtodos


Nomes de mtodos devem ser verbos, iniciando sempre com letra minscula e mantendo cada palavra interna com a inicial
maiscula. Exemplo:

andar()

andarRapido()

voltar()

4.2.3. Nomeando Variveis


O nome de uma varivel pode iniciar por uma letra, smbolo de moeda ($) ou sublinhado (_), mas nunca deve ser iniciado com um nmero. Aps o primeiro caractere permitido usar qualquer combinao de letras, smbolo de moeda, sublinhado e nmeros. Com exceo das constantes, a letra inicial de uma varivel deve ser minscula e, assim como os mtodos, suas palavras internas devem ter a primeira letra maiscula. Uma varivel deve conter nome curto porm significativo,
de forma que qualquer programador consiga entender sua inteno de utilizao no cdigo. Exemplo:


String nome;
int tamanhoMaximo;
List<String> listaDeCompras;

Os identificadores so case-sensitive, ou seja, a varivel:


String nome;

diferente de:

String Nome;

4.2.4. Nomeando Constantes


O nome das constantes possui todas as letras maisculas, separando as palavras por sublinhado ( _ ). Exemplo:
2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

14

Fundamentos da linguagem Java e Orientao a Objeto




int TAMANHO_MAXIMO = 10;


double ALTURA_MINIMA = 1.72;
String NOME = "Jos Ruela";

4.2.5. Especificao JavaBeans


A especificao JavaBeans foi criada com a inteno de ajudar programadores a desenvolverem componentes que pudessem ser facilmente utilizados por outros desenvolvedores em um ambiente de desenvolvimento IDE (Eclipse ou Netbeans).
Desta forma possvel, por exemplo, baixar uma classe ou API da Internet, ou at mesmo comprar uma, e utiliz-la em seu
IDE de forma que este reconhea seus componentes, atravs de um padro de nomenclatura. JavaBeans so classes Java
que seguem um padro de nomenclatura, possuindo basicamente um construtor nulo, permite acesso s suas propriedades atravs de mtodos getter e setter e so serializveis.
As propriedades de um JavaBean seguem o padro abaixo:
Se a propriedade no for um booleano, seu mtodo acessor getter deve possuir o prefixo get. O mtodo getNome(),
por exemplo, possui um nome de getter vlido para uma propriedade chamada nome. Exemplo:

private String nome; // propriedade nome



public String getNome() { // metodo acessor da propriedade nome

return nome;
}
Se a propriedade for um booleano, seu mtodo acessor getter deve possuir o prefixo get ou is. Os mtodos getAtivo() e isAtivo(), por exemplo, possuem um nome de getter vlido para uma propriedade chamada ativo. Exemplo:

private boolean ativo; // propriedade "ativo"



public boolean isAtivo() { // metodo acessor da propriedade "ativo"

return ativo;
}

public boolean getAtivo() { // metodo acessor da propriedade "ativo"

return ativo;
}
O mtodo setter deve possuir o prefixo set. O mtodo setNome(), por exemplo, possui um nome de setter vlido
para uma propriedade chamada nome;
Para criar mtodos setter e getter vlidos para uma propriedade basta utilizar, para o mtodo, o mesmo nome da
propriedade com a inicial em maisculo e acrescentar os prefixos vlidos (get, is ou set);
O mtodo setter deve ser public e void, e deve receber como parmetro o mesmo tipo da propriedade;
O metodo getter deve ser public, sem parmetro, e deve retornar o mesmo tipo da propriedade.

Exemplo de um JavaBean:







class Pessoa {


private String nome;

private int idade;

private boolean maiorDeIdade;


public Pessoa() {} // construtor nulo

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

15

Fundamentos da linguagem Java e Orientao a Objeto
























public String getNome() { // metodo getter da propriedade "nome"



return nome;
}
public void setNome(String nome) { // metodo setter da propriedade "nome"

this.nome = nome;
}
public int getIdade() { // metodo getter da propriedade "idade"

return idade;
}
public void setIdade(int idade) { // metodo setter da propriedade "idade"

this.idade = idade;
}
public boolean isMaiorDeIdade() { // metodo getter da propriedade "maiorDeIdade"

if (this.idade >= 18)


return true;

return false;
}

5. Escopo de variveis
5.1. Variveis de Instncia
Variveis de instncia so variveis declaradas dentro do corpo da classe, mas fora do corpo de mtodo ou de
construtores.
Ex:







public class Pessoa {




private String nome; // varivel de instncia nome


private int idade; // varivel de instncia idade
private Sexo sexo; // varivel de instncia sexo

// mtodos aqui...

Variveis de instncia so inicializadas automaticamente com seu valor padro sempre que o objeto inicializado, no sendo obrigatrio inicializ-las.
Tipo

Valor padro

referncia a objeto

null (no referencia nenhum objeto)

byte, short, int, long

float, double

boolean

false

char

\u0000

Tabela 2. Valor padro para variveis primitivas e de referncia

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

16

Fundamentos da linguagem Java e Orientao a Objeto

5.2. Variveis locais


Variveis locais so variveis declaradas dentro de um mtodo. Estas variveis so temporrias e s existem enquanto o
mtodo estiver na pilha2 da JVM, ou seja, enquanto o mtodo estiver sendo executado. Elas podero ser utilizadas apenas
dentro do bloco onde foram declaradas e sempre devem ser inicializadas antes de usadas.
Ex:

public class Fibonacci {





public static void main(String[] args) {



int x = 0; // varivel local x

int y = 1; // varivel local y

int b = 1; // varivel local b

for (int i = 0; i <= 100; i++) {



System.out.print(x + " ");

b = x;

x = x + y;

y = b;

if (x > 100) {

break;
}

Utilizar uma varivel local sem antes inicializ-la resultar em erro em tempo de compilao. Veja o exemplo:
public static void main(String[] args) {


String var1;


var1 += "teste"; // no ir compilar pois var1 no foi inicializada


// ..

}
Ao tentar compilar o mtodo acima obteremos o seguinte erro do compilador:

Erro: The local variable var1 may not have been initialized

Tentar utilizar uma varivel local fora do bloco onde ela foi declarada tambm ir gerar erro em tempo de compilao. Veja o
exemplo:







public int quadrado(int x) {



return x * x;
}
public void testaQuadrado() {

quadrado(10);

System.out.println(x); // no ir compilar: a JVM simplesmente no ir reconhecer a varivel x
}

O cdigo acima tambm no ir compilar, gerando o seguinte erro do compilador:


Erro: x cannot be resolved to a variable

Para entender melhor o tempo de vida das variveis locais, vejamos outro exemplo:

pilha a rea de memria que a JVM utiliza para armazenar as chamadas de mtodos e as variveis locais.

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

17

Fundamentos da linguagem Java e Orientao a Objeto

























public static void main(String[] args) { // incio do PRIMEIRO bloco




int x = 0;

for (int i = 0; i < 30; i++) { // incio do SEGUNDO bloco


int y = 0;


x++;


y++;


{ // incio do TERCEIRO bloco



int a = 0;



x++;



y++;



a++;


} // final do TERCEIRO bloco


{ // incio do QUARTO bloco



int b = 0;



x++;



y++;



b++;


} // final do QUARTO bloco


// as duas variveis abaixo NO so as mesmas do TERCEIRO e QUARTO blocos


int a;


int b;



} // final do SEGUNDO bloco

} // final do PRIMEIRO bloco

Entendendo o cdigo:
O PRIMEIRO bloco tem acesso apenas varivel x;
O SEGUNDO bloco tem acesso s variveis x, i e y;
O TERCEIRO bloco tem acesso s variveis x, i, y e a;
O QUARTO bloco tem acesso s variveis x, i, y e b;
As variveis a e b ao final do SEGUNDO bloco NO so as mesmas do TERCEIRO e QUARTO blocos respectivamente.

5.3. Parmetros de mtodos


Parmetros de mtodos so variveis locais, passadas como argumento para um mtodo quando o mesmo chamado.
Essas variveis podem ser primitivas ou de referncia e so usadas dentro do bloco do mtodo que as recebem. Veja o
exemplo abaixo:


public int retornaQuadrado(int x) {



return x * x;
}

No exemplo acima x um parmetro de mtodo, e poder ser utilizado dentro do bloco do mtodo retornaQuadrado.
Sempre que chamarmos o mtodo retornaQuadrado devemos obrigatoriamente passar um int como argumento, justamente porque o mtodo foi declarado esperando um parmetro deste tipo.

Observao
Lembre-se de que Java uma linguagem fortemente tipada, ou seja, aps declarado, um tipo de dado no poder
ser modificado.

Ex: Dog x = new Dog();


Cat y = x; // no ir compilar, pois a varivel x do tipo Dog

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

18

Fundamentos da linguagem Java e Orientao a Objeto

6. Controle de acesso e modificadores


O controle de acesso determina a visibilidade de uma classe, mtodo ou varivel. Atravs dele podemos restringir ou permitir o acesso a classes e membros de classe.

6.1. Controle de acesso a Classes


O controle de acesso a classes determina se uma classe X tem acesso a uma outra classe Y, ou seja, determina se uma
classe X pode:
instanciar a classe Y;
estender a classe Y;
acessar determinados membros da classe Y.
Classes podem ter controle de acesso default ou public.
6.1.1. Classes com controle de acesso default
Uma classe tem acesso default quando no se declara explicitamente nenhum modificador de acesso para ela. Uma classe
default ser visvel apenas para outras classes que estejam dentro do mesmo pacote em que ela foi declarada, ou seja, se
uma classe X e uma classe Y estiverem em pacotes diferentes e a classe X tiver acesso default, a classe Y no poder
acessar a classe X.
O acesso default no considerado um modificador de acesso por no ser declarado explicitamente, logo ele apenas um
controle de acesso.
Exemplo:








package com.banco.agencia;
class Conta {


public double saldo;

public double limite;


// getters e setters aqui...
}

A classe Conta acima ficar visvel para todo o pacote com.banco.agencia, ou seja, qualquer outra classe dentro deste pacote poder instanci-la, estend-la ou acessar determinados membros pertencentes a ela.
Veja o que acontece quando tentamos acessar a nossa classe Conta, com acesso default, a partir de outro pacote:

package com.banco.teste; // diferente do pacote da classe Conta




import com.banco.agencia.Conta; // no ir compilar


public class TesteAcessoConta {




public static void main(String[] args) {



Conta conta = new Conta(); // No ir compilar. Para nossa classe TesteAcessoConta, a classe
Conta no existe.


}

}
Ao tentar compilar a classe TesteAcessoConta, o compilador ir nos retornar o seguinte erro:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:

Conta cannot be resolved to a type
2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

19

Fundamentos da linguagem Java e Orientao a Objeto


Conta cannot be resolved to a type

at com.banco.teste.TesteAcessoConta.main(TesteAcessoConta.java:8)

6.1.2. Classes com o modificador de acesso public


Uma classe com o modificador de acesso public visvel para todo o mundo Java, ou seja, acessvel a partir de qualquer pacote da aplicao. Se adicionssemos a palavra reservada public na declarao da classe Conta do nosso exemplo
anterior estaramos permitindo que qualquer outra classe, independente do pacote em que esteja, possa acess-la.
Nossa nova classe Conta ficaria assim:








package com.banco.agencia;
public class Conta {


public double saldo;

public double limite;


// implementaes aqui...
}

6.2. Modificadores de classe no referentes a acesso


Classes tambm podem ter modificadores no referentes a acesso. Estes modificadores podem ser final ou abstract.
6.2.1. O modificador final
Quando uma classe tem o modificar final significa que esta classe no pode ser estendida, ou seja, nenhuma outra classe
pode subclassificar (herdar) a classe final. Usar o modificar final em uma classe quebra todo o conceito de herana e
polimorfismo da linguagem orientada a objetos, e usado quando no queremos que nenhum dos mtodos da classe
sejam substitudos, ou seja, quando queremos deixar imutvel a nossa classe, impedindo que algum faa alguma
mudana nela.
Imagine por exemplo o cenrio onde temos uma classe Conta e no queremos que ningum modifique o comportamento
da nossa classe, afinal no iramos cometer o erro de permitir que algum possa burlar uma conta bancria, por exemplo.
Veja:

package com.banco.agencia;
public final class Conta {









public double saldo;


public double limite;
public void saca(double valor) {

if (valor > this.saldo + this.limite) {


System.out.println("Saldo insuficiente.");

} else {


this.saldo = this.saldo - valor;

}
}

Veja o que aconteceria se tentssemos estender nossa classe Conta para subscrever o mtodo saca, permitindo que
algum faa um saque acima do limite:

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

20

Fundamentos da linguagem Java e Orientao a Objeto












package com.banco.teste;
import com.banco.agencia.Conta;
public class TesteConta1 extends Conta {


public void saca(double valor) {


super.saldo = super.saldo - valor;

}
}

Ao compilar a classe TesteConta1 acima, o compilador exibiria um erro informando que no possvel estender a classe
Conta por se tratar de uma classe final.
6.2.2. Modificador abstract
O modificador abstract tem significado exatamente oposto ao modificador final. Enquanto o modificador final impede que
uma classe seja estendida, o modificador abstract define que a classe pode (e deve) ser estendida.
Uma classe abstrata tem o propsito nico de ser... abstrata! Imagine, por exemplo, que queremos criar uma classe
genrica Animal, com mtodos comuns a todos os animais especficos, mas ns no queremos que algum instancie um
objeto genrico do tipo Animal (no faria sentido, no mesmo?!). Para isto, basta declarar nossa classe Animal como
abstract.
Veja como ficaria nossa classe Animal:

public abstract class Animal {




private String especie;


public Animal(String especie) {


this.especie = especie;

}


public abstract void fazerBarulho();

public abstract void comer(Comida comida);

}

Nossa classe Animal acima no poder ser instanciada, mas podemos criar vrios objetos do tipo Animal a partir dela. Para
exemplificar, vamos criar um objeto Cachorro que um Animal:
















public class Cachorro extends Animal {




public Cachorro() {


super("cachorro");

}




@Override
public void fazerBarulho() {

System.out.println("Au au");

}

@Override
public void comer(Comida comida) {

System.out.println("Comendo " + comida);
}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

21

Fundamentos da linguagem Java e Orientao a Objeto


Perceba que nossa classe Cachorro extends a classe Animal, tornando-a um objeto do tipo... Animal ! Neste exemplo, a
classe Cachorro uma subclasse, enquanto que a classe Animal uma superclasse.
Veremos mais sobre classes abstratas no tpico Herana desta apostila. Por hora, tenha em mente que classes abstratas
so classes que tem o nico propsito de serem estendidas (herdadas).

6.3. Controle de acesso a membros de classe


Membros de classes so mtodos e variveis declarados internamente na classe. Enquanto as classes podem ter apenas
os controles de acesso default e public, os membros de classe podem ter os quatro controles de acessos do Java: public,
protected, default e private.

6.3.1. Membros public


Mtodos e variveis public so acessveis por qualquer classe, independente de seu pacote, desde que a classe do membro public em questo esteja visvel.
Vejamos por exemplo a nossa classe Cachorro que declaramos anteriormente:

package com.zoologico; // nossa classe est no pacote com.zoologico

public class Cachorro extends Animal {




public Cachorro() {


super("cachorro");

}

@Override
public void fazerBarulho() {

System.out.println("Au au");

}

@Override
public void comer(Comida comida) {

System.out.println("Comendo " + comida);
}

Os mtodos fazerBarulho() e comer() so pblicos e podem ser acessados a partir de qualquer classe, independente de seu
pacote. Veja:

package com.zoologico.teste; // nossa classe est no pacote com.zoologico.teste

public class TesteAnimal {




public static void main(String[] args) {


Comida comida = new Comida("carne");


Animal cachorro = new Cachorro();


cachorro.comer(comida); // acessamos perfeitamente o mtodo comer()


cachorro.fazerBarulho(); // acessamos perfeitamente o mtodo fazerBarulho()

}
}

Nossa classe TesteAnimal acima ir compilar perfeitamente, gerando o seguinte resultado ao ser executada:

Comendo carne
Au au

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

22

Fundamentos da linguagem Java e Orientao a Objeto


Na herana, os membros public de uma superclasse estaro visveis pela subclasse, logo sero herdados. Veja:


























public class Carro {




private String carro;


public Carro (String carro) {


this.carro = carro;

}


public void trocarMarcha(int marcha) {


System.out.println("Trocando para a marcha " + marcha);

}
}
public class BMW extends Carro {


public BMW() {


super("bmw");

}
}
public class TesteCarro {


public static void main(String[] args) {


BMW bmw = new BMW();


bmw.trocarMarcha(1);

}
}

Perceba que o mtodo trocarMarcha() da nossa classe Carro public e ser herdado pela classe BMW, permitindo-nos
cham-lo diretamente a partir de uma instncia da classe BMW.

6.3.2. Membros private


Membros private no podem ser acessados por nenhuma classe que no aquela na qual o membro private foi declarado.
Vamos voltar nossa famosa classe Conta, e modificar suas variveis de instncia para que sejam private, impedindo que
sejam modificadas por qualquer outra classe ( realmente o que queremos):





















public final class Conta {
















private double saldo; // varivel declarada como private: ficar acessvel apenas na prpria classe Conta
private double limite; // varivel declarada como private: ficar acessvel apenas na prpria classe Conta
public Conta(double saldo, double limite) {

this.saldo = saldo;

this.limite = limite;
}
public void saca(double valor) {

if (valor > this.saldo + this.limite) {


System.out.println("Saldo insuficiente.");

} else {


this.saldo = this.saldo - valor;

}
}

}
public class TesteConta2 {

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

23

Fundamentos da linguagem Java e Orientao a Objeto








car o saldo





}

public static void main(String[] args) {



Conta minhaConta = new Conta(100, 1000);

minhaConta.saldo = 200; // depois de instanciado o objeto minhaConta, no podemos modifi}

Declaramos nossas variveis de instncia saldo e limite como private, impedindo que sejam acessadas diretamente por
outra classe. Criamos tambm o construtor Conta() para inicializar os valores do saldo e do limite na criao do objeto. Desta forma estamos garantindo a segurana para que nenhuma outra classe possa modificar o valor do saldo e do limite,
aps instanciado o objeto.
A classe TesteConta2 est tentando modificar o contedo da varivel saldo que private, logo esta classe no ir compilar,
gerando o seguinte erro no compilador:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:


The field Conta.saldo is not visible

6.3.3. Membros default


Membros com o acesso default podem ser acessados apenas pelas classes que estiverem no mesmo pacote da classe em
que foram declarados.
Veja o exemplo:

package com.veiculo;

public class Carro {




private String carro;


public Carro (String carro) {


this.carro = carro;

}


void trocarMarcha(int marcha) { // classe com controle de acesso default


System.out.println("Trocando para a marcha " + marcha);

}

}

O mtodo trocarMarcha() da nossa classe Carro tem controle de acesso default por no possuir explicitamente nenhum
modificador de acesso, podendo ser acessado apenas a partir de classes que estejam no pacote com.veiculo.
Tentaremos acessar o mtodo trocarMarcha() a partir de uma classe que esteja fora do pacote com.veiculo, veja:










package com.teste; // pacote diferente


import com.veiculo.Carro;
public class TesteCarro1 {


public static void main(String[] args) {


Carro corsa = new Carro("corsa");


corsa.trocarMarcha(1); // no ir compilar

}
}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

24

Fundamentos da linguagem Java e Orientao a Objeto


A classe TesteCarro1 no ir compilar, gerando a seguinte exceo:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:



The method trocarMarcha(int) from the type Carro is not visible

6.3.4. Membros protected


O controle de acesso protected quase idntico ao default, com uma nica diferena fundamental: alm de serem visveis
apenas para classes do mesmo pacote, os membros protected so tambm visveis pelas subclasses (atravs da herana).
Para entendermos melhor, vejamos o exemplo abaixo:

package com.veiculo;

public abstract class Carro {




private String carro;

protected int marchaAtual;


public Carro (String carro) {


this.carro = carro;

}


public abstract void trocarMarcha(int marcha);

}

Nossa classe abstrata Carro possui uma varivel de instncia protected marchaAtual. Iremos agora implementar o mtodo
abstrato trocarMarcha() em uma subclasse da nossa classe Carro, localizada em pacote diferente:




package com.teste; // pacote diferente

public Corsa() {

super("corsa");
}

@Override
public void trocarMarcha(int marcha) {

super.marchaAtual = marcha; // ir compilar perfeitamente
}

import com.veiculo.Carro;
public class Corsa extends Carro {

A implementao do mtodo trocarMarcha() na classe Corsa acessa normalmente a varivel de instncia marchaAtual de
sua superclasse atravs da herana.

6.3.5. Variveis locais e modificadores de acesso


Variveis locais no podem ser aplicados a variveis locais. Veja o exemplo:





public class OperacaoMatematica {




public int quadrado(int valor) {


private int resultado = valor * valor; // no ir compilar


return resultado;

}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

25

Fundamentos da linguagem Java e Orientao a Objeto


A classe acima no ir compilar, pois tentamos utilizar o modificador de acesso private em uma varivel local.

7. Membros static
7.1. Variveis static
Variveis declaradas como static em uma classe so particularmente chamadas de variveis de classe e so diferentes das
variveis de instncia. Uma varivel static pertence classe, e no instncia da classe. Em outras palavras: ns no dependemos de instanciar uma classe para acessar suas variveis static.
Imagine, por exemplo, que precisamos contar o nmero de instncias de uma classe: isso no seria possvel fazer atravs
de uma varivel de instncia, uma vez que esta pertenceria apenas a uma instncia especfica. Para resolver este problema,
podemos simplesmente usar uma varivel static, veja:

class VariavelStatic {


static int contadorDeInstancia = 0;


public VariavelStatic() {


contadorDeInstancia++;

}

}

Note que nossa classe VariavelStatic possui uma varivel de classe chamada contadorDeInstancia que independe de qualquer instncia dessa classe. Vamos, ento, testar a nossa classe:












public class TestaVariavelStatic {










public static void main(String[] args) {



new VariavelStatic();

new VariavelStatic();

new VariavelStatic();

new VariavelStatic();


System.out.println("Nmero de instncias: "


+ VariavelStatic.contadorDeInstancia); // ir imprimir "Nmero de instncias: 4"
}

Perceba que a varivel static resolveu o nosso problema: registrar o nmero de instncias da nossa classe VariavelStatic.

7.2. Mtodos static


Assim como uma varivel static, um mtodo static no depende da instncia da classe em que foi declarado. Imagine, por
exemplo, que tenhamos a necessidade de implementar uma classe com mtodos utilitrios para outras classes, mtodos
estes que no dependem do estado da instncia (objeto) da classe: podemos simplesmente criar mtodos static !
Para exemplificar, imagine que tenhamos a necessidade de criar um mtodo que gere nmeros inteiros aleatrios e queremos reutilizar este mtodo em vrias classes em nosso projeto, como faramos? Podemos simplesmente criar um mtodo
static para isto, j que no iremos depender do estado da classe que o contm. Veja:

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

26

Fundamentos da linguagem Java e Orientao a Objeto









class Util {


public static int geraInteiroRandomico() {


Random r = new Random();


return r.nextInt();

}

}

Nossa classe Util nos disponibilizou um mtodo static para reutilizarmos em outras classes, sem a necessidade de termos
que instanciar a classe. Veja:







public class TestaMetodoStatic {





public static void main(String[] args) {



int numeroInteiro = Util.geraInteiroRandomico();

System.out.println(numeroInteiro); // ir imprimir um inteiro qualquer
}

Perceba que chamamos o mtodo geraInteiroRandomico() diretamente, sem precisarmos instanciar a classe Util.

8. Membros final
8.1. Variveis final
Declarar uma varivel como final significa impedir que esta seja reutilizada depois de inicializada com um valor explcito. Em
outras palavras: uma constante!

8.1.1. Variveis final do tipo primitivo


Uma varivel final do tipo primitivo depois de receber um valor no poder ter este valor alterado. Veja o exemplo abaixo:

















class Circulo {


final double PI = 3.141592;

final double RAIO;


public Circulo(double raio) {


this.RAIO = raio;

}


public double calculaCircunferencia() {


return 2 * PI * RAIO;

}


public double calculaArea() {


return PI * Math.pow(RAIO, 2);

}
}

Nossa classe Circulo acima possui duas variveis de instncia declaradas como final. Ambas as variveis, por serem final,
devem ser inicializadas antes de utilizadas. Veja agora o que acontece se tentarmos modificar o valor j inicializado de uma
varivel final:


public class TestaCirculo {




public static void main(String[] args) {

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

27

Fundamentos da linguagem Java e Orientao a Objeto








Circulo c1 = new Circulo(20);


c1.RAIO = 30; // No ir compilar! Tentamos modificar o valor de uma constante j inicializada
double circunferencia = c1.calculaCircunferencia();
System.out.println(circunferencia);

O cdigo da classe TestaCirculo no ir compilar, pois tentamos modificar o valor da varivel RAIO que j havia sido inicializada explicitamente.

8.1.2. Variveis final de referncia


Ter uma varivel de referncia declarada como final significa que esta varivel no poder ser reatribuda para referir-se a um
objeto diferente. Para entender melhor, veja o exemplo abaixo:

class Moto {



private String fabricante;


private String modelo;



public Moto(String nome, String modelo) {



this.fabricante = nome;



this.modelo = modelo;


}




public void ligar() {



System.out.println("Ligando a moto...");


}



}


class TestaMoto {




final Moto MOTO = new Moto("Honda", "Biz");




public void fazerAlgo() {



MOTO = new Moto("Suzuki", "CBR"); // No ir compilar. No podemos modificar a referncia
de uma varivel final.



MOTO.ligar();


}




}
Nossa classe TestaMoto possui uma varivel final de referncia apontando pra um objeto em memria. Ao tentar atribuir
outro objeto para esta mesma varivel o compilador ir reclamar, gerando um erro em tempo de compilao.
Lembre-se que no existem objetos final, mas sim referncias final.

8.2. Mtodos final


Ao declarar um mtodo como final, estamos impedindo que o mesmo seja subscrito em uma subclasse, ou seja, nenhuma
subclasse poder substitu-lo.
Veja o exemplo:

class Moto {

private String fabricante;


private String modelo;

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

28

Fundamentos da linguagem Java e Orientao a Objeto








// getters e setters aqui...


public final void ligar() {

System.out.println("Ligando a moto...");
}

Nossa classe Moto tem um mtodo final que no poder ser subscrito por uma subclasse. Vamos agora testar isso na prtica:






class HondaBiz extends Moto {




public void ligar() { // No ir compilar. Estamos tentando subscrever um mtodo final da superclasse


System.out.println("Ligando a moto de outra maneira...");

}


}

Perceba que nossa classe HondaBiz (subclasse da classe Moto) tenta subscrever o mtodo ligar(), e isto ir causar um erro
ao tentar compilar a classe.

9. Controle de fluxo
9.1. Condicionais
9.1.1. if-else
O if um dos elementos mais utilizados em uma linguagem de programao e tem o objetivo de testar se uma condio
verdadeira para executar (ou no) um trecho de cdigo.
A sintaxe bsica de um if-else a seguinte:




if (expressoBooleana) {

// cdigo aqui...
} else {

// outro cdigo aqui...
}

A expresso entre parnteses deve resultar obrigatoriamente em um booleano (true ou false). O bloco else opcional.
Veja abaixo um exemplo utilizando if em Java:






int x = 16;


if (x > 10) {

System.out.println("x maior que 10");
} else {

System.out.println("x menor que 10");
}

O cdigo acima ir imprimir (obviamente): x maior que 10.


9.1.1.1. if com atribuio
Java permite que voc utilize uma atribuio na expresso booleana de um if. No entendeu?!? Veja o trecho de cdigo a
seguir:

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

29

Fundamentos da linguagem Java e Orientao a Objeto







boolean x = false;
if (x = true) {

System.out.println("x true");
} else {

System.out.println("b false");
}

O cdigo acima resultar em: x true. Mas por qu?


O que acontece que, antes de mais nada, o valor true ser atribudo varivel booleana x e posteriormente feita a avaliao da expresso booleana. Como o valor true foi atribudo varivel x, logo o bloco if ser executado. Simples, no?!
Mas lembre-se que isto vlido apenas para variveis de tipo booleano. O cdigo abaixo est tentando usar como expresso booleana de um if uma atribuio a uma varivel no-booleana, veja:





int x = 10;
if (x = 10) { // No ir compilar

System.out.println("x vale 10");
} else {

System.out.println("b no vale 10");
}

O cdigo acima no ir compilar, pois estamos utilizando uma varivel no-booleana em um if com atribuio.
9.1.1.2. if com mltiplas condies
possvel tambm fazer um if com mltiplas condies. Veja:








int x = 10;

if (x > 10) {

System.out.println("x maior que 10");
} else if (x == 10) {

System.out.println("x igual a 10");
} else {

System.out.println("x menor que 10");
}

O cdigo acima vlido e ir imprimir na tela: x igual a 10.

9.1.2. switch
Uma maneira de simular mltiplas condies com if usando o switch. A sintaxe bsica de um switch a seguinte:







switch (expresso) {


case constante1:



cdigo


case constante2:



cdigo


default:



cdigo
}

Veja o exemplo de um bloco switch:

int x = 10;
switch(x) {

case 1:


System.out.println("x igual a 1");


break;

case 2:


System.out.println("x igual a 2");

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

30

Fundamentos da linguagem Java e Orientao a Objeto












break;
case 10:

System.out.println("x igual a 10");

break;
case 20:

System.out.println("x igual a 20");

break;
default:

System.out.println("no sabemos o valor de x");

O cdigo acima ir imprimir: x igual a 10. Note a presena do break dentro da instruo case: o break opcional mas,
nesse nosso caso, devemos utiliz-lo para evitar que os blocos seguintes (aps a condio verdadeira) sejam executados.
A expresso de um switch deve resultar sempre em um char, byte, short, int ou, a partir do Java 6, um enum. No podemos utilizar um tipo diferente de um inteiro ou um enum como resultado da expresso de um switch. Sendo assim, o cdigo abaixo no valido:

String t = "teste";
switch (t) { // no ir compilar

case "testa":


System.out.println("t = testa");

case "teste":


System.out.println("t = testa");

default:


System.out.println("no sabemos o valor de t");
}

O cdigo acima no ir compilar, pois estamos tentando utilizar uma String como expresso em um switch.

9.2. Loops
9.2.1. while
O while nos possibilita executar um loop enquanto uma expresso for vlida. A sintaxe bsica de um while a seguinte:


while (expresso) {

// faa algo
}

Em um while, a expresso deve resultar sempre em um booleano.


Veja um exemplo:




int x = 0;
while(x <= 3) {

System.out.println(x);

x++;
}

O cdigo acima ir imprimir o intervalo de 0 a 3.


9.2.2. do-while
O do-while semelhante ao while, com exceo de que seu cdigo ser sempre executado pelo menos uma vez. Veja um
exemplo de do-while:


do {

}

System.out.println("Imprima isto");

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

31

Fundamentos da linguagem Java e Orientao a Objeto


while(false);

O cdigo acima ir imprimir perfeitamente a String Imprima isto mesmo a condio sendo false.
9.2.3. for
O for um tipo especial de loop. A sintaxe bsica de um for a seguinte:


for (/*Inicializao*/ ; /*Condio*/ ; /* Iterao */) {



/* corpo do loop */
}

Veja o exemplo de um loop usando o for:




for (int i = 0; i < 10; i++) {



System.out.println(i);
}

O cdigo acima o mesmo que dizer imprima para mim o intervalo de 0 a 9.


possvel tambm fazer a inicializao da varivel e seu incremento fora da expresso do loop, mas no uma boa prtica.
Veja:




int i = 0;
for (;i<10;) {

i++;

System.out.println(i);
}

O cdigo acima vlido e ir imprimir o intervalo de 1 a 10.

10. Construtores
10.1. Declarando construtores
Em Java todas as classes tm um construtor, mesmo que voc no declare um explicitamente. Sempre que criamos um
objeto, pelo menos um construtor invocado.
Um construtor se parece com um mtodo, com a diferena de que um construtor nunca possuir um tipo de retorno.
Pode-se usar qualquer um dos modificadores de acesso em construtores, mas nunca podemos declarar um construtor
como final, abstract ou static.
Vejamos o exemplo de um construtor:








class Cachorro {


private String raca;

private String nome;


public Cachorro() { } // construtor sem argumentos


// mtodos aqui...
}

Nossa classe Cachorro tem um construtor sem argumentos. Sempre que criarmos um objeto do tipo Cachorro, este construtor ser chamado. Voc deve estar pensando: mas o construtor da classe Cachorro no faz sentido algum, ele no recebe argumentos e muito menos tem alguma implementao!. Sim, concordamos com voc, afinal utilizamos este cons-

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

32

Fundamentos da linguagem Java e Orientao a Objeto


trutor apenas como exemplo. Poderamos perfeitamente criar nossa classe sem construtor algum e, nesse caso, o Java se
encarregaria de criar automaticamente um construtor padro sem argumentos e sem implementao.
Podemos tambm declarar construtores com argumentos. Veja o exemplo:











class Cachorro {


private String raca;

private String nome;


public Cachorro(String raca, String nome) { // construtor


this.raca = raca;


this.nome = nome;

}


// mtodos aqui...
}

Nesse caso, a classe Cachorro tem um construtor que recebe dois parmetros do tipo String. Em Java todo construtor
deve ter o mesmo nome da classe em que foi declarado, e pode receber argumentos assim como os mtodos. Tenha em
mente que os objetos so construdos e no possvel criar um objeto sem chamar um construtor.
Agora nossa classe no possui nenhum construtor sem argumentos e sempre que formos criar um objeto a partir desta
classe seremos obrigados a passar os dois parmetros para o construtor. Veja:





public class TesteCachorro1 {




public static void main(String[] args) {


Cachorro toto = new Cachorro("Poodle", "Tot"); // ir compilar perfeitamente

}
}

Se tentssemos criar um objeto do tipo Cachorro sem passar os parmetros do construtor, obteramos um erro ao tentar
compilar a classe. Veja:





public class TesteCachorro2 {




public static void main(String[] args) {


Cachorro toto = new Cachorro(); // no ir compilar

}
}

Ao tentar compilar a classe TesteCachorro2 acima, obteremos o seguinte erro do compilador:



Exception in thread "main" java.lang.Error: Unresolved compilation problem:



The constructor Cachorro() is undefined

Agora voc deve estar pensando: mas o Java no cria automaticamente um construtor sem argumentos e sem implementao?. A resposta : depende! Um construtor padro s ser criado automaticamente caso a classe no tenha nenhum
construtor declarado.
Os construtores servem basicamente para inicializar as variveis de instncia, como pde ser visto no nosso ltimo exemplo
da classe Cachorro.

10.2. Sobrecarregando construtores


Assim como os mtodos, construtores tambm podem ser sobrecarregados, permitindo que sua classe tenha mais de uma
maneira de ser instanciada. Veja o exemplo abaixo:

class Carro {

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

33

Fundamentos da linguagem Java e Orientao a Objeto











private String nome;


Carro() { } // construtor sem argumentos
Carro(String nome) {

this.nome = nome; // construtor com argumento
}

A classe acima nos permite instanci-la passando uma String como parmetro ou sem informar parmetro algum. Veja:

public class TesteCarro1 {




public static void main(String[] args) {



Carro astra = new Carro("Astra");



Carro carroGenerico = new Carro();


}

}
Na nossa classe TesteCarro1 as duas maneiras de instanciar a classe Carro esto corretas.

11. Encapsulamento
Encapsulamento uma tcnica utilizada para proteger os dados armazenados em seus objetos, disponibilizando mtodos
para controle e proteo destes dados. tambm uma forma de prover modularizao e fexibilidade do cdigo. O encapsulamento nos permite ocultar detalhes da implementao do nosso cdigo, evitando a exposio de certas informaes.
Imagine, por exemplo, um telefone celular: se pudssemos ter acesso direto aos seus componentes internos e precisssemos saber como um celular funciona internamente para utiliz-lo, poderamos burlar o sistema ou modificar algo no desejado, o que acarretaria em um retorno ou resposta inesperada do aparelho. O teclado do celular o mtodo de acesso s
suas funcionalidades e foi criado justamente para interagirmos com o aparelho e consequentemente obtermos as respostas
desejadas, sem expor detalhes internos de seu funcionamento. Este o propsito do encapsulamento.

11.1. Getters e Setters


Getters e setters so mtodos acessores utilizados para controlar o acesso aos dados restritos de uma classe, ou seja, so
basicamente uma interface para leitura e manipulao destes dados. Restringir o acesso a dados de uma classe e utilizar
os mtodos getters e setters para manipular e controlar o acesso a estes dados uma forma de conseguir ocultar informaes de uma classe e obter os benefcios do encapsulamento.
Veja abaixo uma classe Pessoa que utiliza setters e getters para controlar o acesso s variveis privadas nome e idade:

class Pessoa {


private String nome;

private int idade;


public String getNome() {


return nome;

}


public void setNome(String nome) {


this.nome = nome;

}


public int getIdade() {


return idade;

}


public void setIdade(int idade) {

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

34

Fundamentos da linguagem Java e Orientao a Objeto





this.idade = idade;

Atravs dos setters e getters da classe Pessoa podemos modificar e ler o contedo das variveis nome e idade facilmente.
Veja:








public class Exemplo1 {




public static void main(String[] args) {


Pessoa pessoa = new Pessoa();


pessoa.setNome("Lucas Freitas");


pessoa.setIdade(27);

}

}

Definir as variveis como private e permitir seu acesso apenas atravs dos setters e getters nos d maior flexibilidade, facilitando pequenas modificaes em nossa classe. Se utilizssemos essa classe Pessoa em um cadastro e quisssemos restringir o cadastro apenas para pessoas maiores de idade, poderamos facilmente modificar o mtodo setter para aceitar
apenas idade maior ou igual a 18 anos. Veja como ficaria nosso setter modificado:




public void setIdade(int idade) {



if (idade >= 18) { // aceitamos apenas valor maior ou igual a 18 para idade


this.idade = idade;

}
}

Note que no teramos a mesma flexibilidade se permitssemos o acesso direto varivel idade, ou seja, se ela fosse public.

12. Relacionamento entre classes


Em linguagem orientada ao objeto, as classes no so ilhas isoladas. Elas se relacionam entre si atravs da associao, da
agregao, da composio e da herana. O que distingue um tipo de relacionamento do outro o grau de acoplamento
entre a classe agregada com a agregadora.

12.1. Associao
A associao possui uma relao de acoplamento mais fraco, onde um objeto no depende do ciclo de vida do outro, ou
seja, se a relao entre os objetos associados for rompida ambos os objetos continuam tendo um sentido lgico. usada
quando um objeto A usa um objeto B ou quando um objeto A tem um objeto B. Veja o exemplo abaixo:

Figura 2. Diagrama UML - Associao direta entre Navio e Container

Neste exemplo o Navio tem um Container. Se a relao entre eles for rompida, ambos os objetos continuam tendo um
sentido lgico, pois um no depende do outro para ter um significado.
Veja outro exemplo:

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

35

Fundamentos da linguagem Java e Orientao a Objeto

Figura 3. Diagrama UML - Associao direta entre Trem e EstradaDeFerro

Neste exemplo o Trem usa uma EstradaDeFerro. Ambos os objetos fazem sentido separadamente.

12.2. Agregao
A agregao considerada como um tipo de associao, onde um objeto faz parte de outro objeto. A agregao tambm
possui uma relao de acoplamento mais fraco, onde um objeto no depende do outro para ter um sentido lgico. Veja o
exemplo:

Figura 4. Diagrama UML - Associao por agregao entre Locomotiva e Farol

Neste exemplo o Farol faz parte da Locomotiva. Ambos os objetos fazem sentido separadamente.

12.3. Composio
A composio um tipo especial de associao, onde um objeto composto por outro objeto. A composio uma
relao de forte acoplamento, onde um objeto gerencia o ciclo de vida do objeto composto, de forma que se um objeto
deixar de existir o outro no ter mais um sentido lgico. Veja o exemplo abaixo:

Figura 5. Diagrama UML - Composio do objeto Trem

Neste exemplo o Trem composto por: um objeto do tipo Locomotiva e um ou mais objetos do tipo Vago. Um Trem no
existe sem estes dois objetos, ou seja, se a relao for perdida o objeto Trem perder seu sentido lgico.

12.4. Herana
Herana um conceito fundamental em linguagem de programao orientada ao objeto, como Java. A herana uma
relao do tipo um e trata-se de uma relao de acoplamento forte, menos flexvel que a composio e a associao.
Ela permite que classes mais especficas herdem estado e comportamento (variveis e mtodos) de classes mais genricas,
provendo dois benefcios:
Reutilizao de cdigo;
Uso do polimorfismo.
A herana uma relao do tipo um, e expressa quando se utiliza a palavra reservada extends (herana de classe) ou
implements (implementao de interface).
Veja o cdigo abaixo:
public class Carro {
2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

36

Fundamentos da linguagem Java e Orientao a Objeto


















public void ligar() { // ... }


public void acelerar() { // ... }
public void frear() { // ... }
public static void main(String[] args) {

Carro astra = new Carro();

Carro vectra = new Carro();


if (!astra.equals(vectra))


System.out.println("Objetos diferentes!");

if (astra instanceof Carro) /* o operador instanceof retorna true se a varivel testada for do mesmo tipo da




qual est sendo comparada */


System.out.println("Astra um Carro!");

if (astra instanceof Object)


System.out.println("Astra um Object!");
}

}
O cdigo acima ir compilar sem erro, e ao execut-lo obteremos o seguinte resultado:

Objetos diferentes!

Astra um Carro!

Astra um Object!

Voc deve estar pensando: Ok, realmente astra e vectra so variveis que apontam pra objetos diferentes, logo no
poderiam mesmo serem iguais. Mas... de onde veio esse mtodo equals? Ele no foi declarado na classe Carro!!! E como o
objeto da varivel astra um Object se ele do tipo Carro?!?!
A verdade que em Java todas as classes estendem Object implicitamente (herana), ou seja, todos os objetos em Java
so tambm do tipo Object. E a classe Object de Java possui o mtodo equals para fazer a comparao entre objetos, logo
a classe Carro tambm possuir esse mtodo, j que ela tambm do tipo Object. Voil!
A classe Object possui tambm outros mtodos utilitrios para facilitar nosso trabalho (mas isso assunto para outro
tpico). Se no tivssemos estes recursos que Object prov, teramos o trabalho de implementar o mtodo equals, por
exemplo, em nossas classes se quisssemos fazer a comparao de objetos.

Entendendo...
Se uma classe B estende uma classe A, ento a classe B uma classe do tipo A. Logo, a classe B ir possuir
todas as variveis e mtodos no privados da classe A.
Veja o cenrio abaixo:

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

37

Fundamentos da linguagem Java e Orientao a Objeto

Figura 2. Diagrama UML - Exemplo de herana entre classes

Na Figura 2, tanto Carro quanto Bicicleta herdam a classe Veculo. Dizemos ento que a classe Veculo uma
superclasse e as classes Carro e Bicicleta so suas subclasses. Todas as classes que herdam de Veculo iro possuir
suas variveis e mtodos no privados.
Vejamos outro exemplo de herana:

Figura 3. Diagrama UML - Herana: o Diretor um Funcionrio

Implementao:

class Funcionario { // ... }

class Diretor extends Funcionario { // ... }

Java no suporta herana mltipla, portanto s possvel estender uma nica classe. O exemplo abaixo no possvel
implementar em Java:

Figura 4. Diagrama UML - Herana mltipla (no possvel em Java)

Implementao:

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

38

Fundamentos da linguagem Java e Orientao a Objeto






class Radio { // ... }


class Relogio { // ... }
class RadioRelogio extends Radio, Relogio { // ... } // no ir compilar, pois Java no suporta herana mltipla

13. Classes abstratas


Classes abstratas so classes que podem ser apenas estendidas, e nunca instanciadas. Praticamente so usadas quando
se deseja criar uma classe mais genrica impedindo que a mesma seja instanciada, permitindo o uso do polimorfismo. Veja
o caso abaixo:

Figura 5. Diagrama UML - Herana usando classe abstrata Veiculo

public abstract class Veiculo {




public abstract void acelerar();

public abstract void frear();

public void ligar() { // ... }

// mtodo abstrato - termina com ponto-e-vrgula (no contm corpo)


// mtodo abstrato - termina com ponto-e-vrgula (no contm corpo)

}
public class Carro extends Veiculo {

public void acelerar() { // ... }

// implementao do mtodo abstrato da superclasse Veiculo

public void frear() { // ... } // implementao do mtodo abstrato da superclasse Veiculo

}
public class Astra extends Carro { // ... }

No exemplo acima impedimos que a classe Veiculo seja instanciada ao declar-la como abstrata usando a palavra
reservada abstract. Permitimos que apenas as classes mais especficas (Carro e Astra) sejam instanciadas.
As classes abstratas podem conter tanto mtodos abstratos como no abstratos. Suas subclasses devem
obrigatoriamente implementar todos os seus mtodos abstratos. J os mtodos no abstratos no necessitam ser
implementados: toda sua implementao herdada da superclasse, porm os mtodos no abstratos podem ser
subscritos pelas subclasses.
A vantagem de se utilizar uma classe abstrata que podemos obter a vantagem do polimorfismo e ter implementaes
genricas para classes mais especficas.

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

39

Fundamentos da linguagem Java e Orientao a Objeto

14. Interfaces
Uma interface semelhante a um contrato que deve ser seguido por todas as classes que a implementam. A diferena
entre uma classe abstrata e uma interface que a interface 100% abstrata. Para declarar uma interface basta usar a
palavra reservada interface.
Exemplo:

Figura 6. Diagrama UML - Classe Celular e TelefoneFixo implementando a interface Telefone

public interface Telefone {




public void discarNumero(int numero);

public boolean isLigacaoEmProgresso();
}
public class Celular implements Telefone {


private boolean ligacaoEmProgresso;


public void discarNumero(int numero) {



// ..
}

public boolean isLigacaoEmProgresso() {



return ligacaoEmProgresso;
}

}
public class TelefoneFixo implements Telefone {

private boolean ligacaoEmProgresso;

public void discarNumero(int numero) {



// ..
}

public boolean isLigacaoEmProgresso() {



// ..

return ligacaoEmProgresso;
}

A classe que implementa a interface deve obrigatoriamente implementar todos os seus mtodos. Perceba que na interface
Telefone os mtodos no possuem corpo, mas no foram declarados como abstract. Estranho, no? Na verdade todos os

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

40

Fundamentos da linguagem Java e Orientao a Objeto


mtodos de uma interface so implicitamente abstratos, no sendo necessrio usar explicitamente a palavra reservada
abstract, ou seja:
public interface Telefone {


public void discarNumero(int numero); // mtodo abstrato mesmo no declarado explicitamente como abstract

public boolean isLigacaoEmProgresso(); // mtodo abstrato mesmo no declarado explicitamente como abstract
}
o mesmo que:
public interface Telefone {


public abstract void discarNumero(int numero);

public abstract boolean isLigacaoEmProgresso();
}
No exemplo acima as duas interfaces so idnticas: mesmo no declarados explicitamente, todos seus mtodos so
abstract.
Com o uso de interface podemos declarar uma varivel com seu tipo e atribuir a ela qualquer um dos objetos que a
implementa, em outras palavras usar o polimorfismo. Veja:
public class Exemplo1 {


public static void main(String[] args) {


Telefone tel1 = new Celular(); // atribuindo um objeto do tipo Celular varivel do tipo Telefone


tel1.discarNumero(81231493);




Telefone tel2 = new TelefoneFixo(); // atribuindo um objeto do tipo TelefoneFixo varivel do tipo Telefone


tel2.discarNumero(81231493);

}
}
Java permite que voc implemente mais de uma interface por classe, como no exemplo abaixo:

Figura 7. Diagrama UML - Classe RadioRelogio implementando suas interfaces

public interface Radio { // ... }


public interface Relogio { // ... }
public class RadioRelogio implements Radio, Relogio { // ... } // classe implementando mais de uma interface
Uma interface pode estender uma ou mais interfaces. O cdigo abaixo vlido em Java:
public interface RadioRelogio extends Radio, Relogio {

// ...
}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

41

Fundamentos da linguagem Java e Orientao a Objeto

15. Classes concretas


Classes concretas so classes especficas, que podem ser instanciadas. So estas classes que do origem a objetos, e
podem ser pblicas ou privadas. [Falaremos sobre modificadores de acesso de classes e mtodos mais adiante]
Para declarar uma classe concreta basta utilizar a palavra reservada class.
Declarando uma classe concreta:

public class Cachorro {




public void late() {


System.out.println("Au, au!");

}



public static void main(String[] args) {



Cachorro cachorro = new Cachorro(); // instanciando a classe concreta Cachorro

cachorro.late();
}

16. Polimorfismo
Tudo bem, mencionamos sobre polimorfismo alguns tpicos antes nesta apostila mas, afinal de contas, o que o
polimorfismo? Polimorfismo o princpio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem
invocar mtodos que tm a mesma identificao (assinatura) mas comportamentos distintos, especializados para cada
classe derivada, usando para tanto uma referncia a um objeto do tipo da superclasse. (Ivan Luiz Marques Ricarte, 2002,
Unicamp). No entendeu? Tudo bem, vamos mostrar na prtica! Veja o cdigo abaixo:
abstract class Animal {

public abstract void fazBarulho();
}
class Cachorro extends Animal {




}

public void fazBarulho() {



System.out.println("au au");

}

class Gato extends Animal {





}

public void fazBarulho() {



System.out.println("miau");
}

public class Exemplo1 {




public static void main(String[] args) {


Animal animal = new Cachorro(); // atribuindo um objeto de tipo Cachorro a uma varivel de tipo Animal


animal.fazBarulho();




animal = new Gato(); // atribuindo um objeto de tipo Gato a uma varivel de tipo Animal


animal.fazBarulho();

}
}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

42

Fundamentos da linguagem Java e Orientao a Objeto


O cdigo acima produzir o seguinte resultado:

au au

miau

Perceba neste exemplo que declaramos uma varivel de tipo Animal e atribumos objetos de tipo Cachorro e Gato a ela, ou
seja, a referncia diferente do objeto. Isto polimorfismo! Quando voc declarar uma varivel de referncia, qualquer
objeto que passar no teste -UM quanto ao tipo declarado para ela poder ser atribudo a essa referncia. Em outras
palavras, qualquer coisa que estender o tipo declarado para a varivel de referncia poder ser atribuda a ela. (Java - Use
a Cabea, 2005).
Podemos nos beneficiar do poder do polimorfismo para deixar nosso cdigo bastante flexvel, como por exemplo:
Criar matrizes polimrficas:

Animal animais[] = new Animal[3];


animais[0] = new Cachorro();
animais[1] = new Gato();
animais[2] = new Passaro();

Decidir, em tempo de execuo, qual tipo de objeto usar:

Figura 8. Diagrama UML

Neste modelo, desenvolvido no Tribunal de Justia do Amap, temos uma interface AtoMagistrado e algumas

classes mais especficas para cada tipo de ato que um magistrado (Juiz, Desembargador) possa realizar. O usurio (nesse
caso, um Magistrado) ir solicitar ao sistema o tipo especfico de AtoMagistrado que ele deseja e o sistema se encarregar
de chamar o objeto especfico de acordo com a requisio do usurio, em tempo de execuo. Na prtica, o cdigo seria
algo como:














// ...
AtoMagistrado ato = null;

switch (tipoAtoRequisitado) {

case ACORDAO:


ato = new Acordao();


break;

case DECISAO:


ato = new Decisao();


break;

case DECISAOTERMINATIVA:


ato = new DecisaoTerminativa();


break;

case DESPACHO:


ato = new Despacho();

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

43

Fundamentos da linguagem Java e Orientao a Objeto














break;
case MANIFESTACAO:

ato = new Manifestacao();

break;
case PARECER:

ato = new Parecer();

break;
case SENTENCA:

ato = new Sentenca();

break;

// ...

No exemplo, percebemos que um objeto especfico criado e atribudo a uma varivel de um tipo mais genrico

AtoMagistrado. Ao fazer uma chamada de mtodo de AtoMagistrado, a JVM se encarregar de escolher o mtodo correto
contendo a implementao especfica para o tipo requisitado.

Podemos tambm beneficiar do polimorfismo em parmetros e tipo de retorno. Veja o cdigo abaixo:



















class Veterinario {


public void alimentar(Animal animal) { // aceita como parmetro qualquer objeto que seja um Animal


// ... implementao aqui

}

}

Perceba neste caso que um Veterinrio tem um mtodo para alimentar qualquer tipo de Animal, ou seja, qualquer

public class Exemplo2 {




public static void main(String[] args) {




Cachorro toto = new Cachorro();




Veterinario vet = new Veterinario();


vet.alimentar(toto);



}
}

objeto que estenda (ou implemente, caso seja uma interface) a classe Animal.

17. Herana x Composio


Como vimos, a herana um recurso muito poderoso em Java, mas deve ser usada com sabedoria. Muitos programadores
acabam utilizando a herana por preguia para ganhar tempo e acabam violando o princpio bsico de Orientao a Objeto:
alta coeso e baixo acoplamento. Uma situao onde seria boa a utilizao de herana quando se deseja o polimorfismo.

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

44

Fundamentos da linguagem Java e Orientao a Objeto


Dica
Quando se deseja reutilizar uma classe, a composio deve ser a escolha preferencial, mas no quer dizer que a
herana deva ser descartada. Isso porque a herana aumenta muito o acoplamento entre classes e prov um fraco
encapsulamento, portanto uma mudana na superclasse pode custar muitas linhas de cdigo a serem tambm
alteradas na subclasse e nas classes que a utilizam.
Veja:
Herana

Figura 5. Herana

public class Automovel {



// ...
}
public class Carro extends Automovel {

// ...
}

O exemplo acima mostra o relacionamento entre Carro e Automovel atravs da herana.


Composio

Figura 6. Composio

public class Automovel { // ... }


public class Carro {


private Automovel automovel = new Automovel();


// ...
}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

45

Fundamentos da linguagem Java e Orientao a Objeto


O exemplo acima mostra o relacionamento entre Carro e Automvel atravs da composio.
Na herana, a superclasse um tanto frgil, pois uma pequena mudana em sua estrutura pode acarretar em mudanas
tambm na subclasse e nas classes que as utilizam. Se mudssemos um tipo de retorno de um mtodo na superclasse,
por exemplo, as subclasses e as classes que as utilizam seriam quebradas, e uma exception seria lanada na compilao.
Usando herana:
Vejamos o exemplo onde um Carro um Automvel:
public class Automovel {


public int retornaMarcha(int velocidade) { // retorna a marcha de acordo com a velocidade (cmbio automtico)


if (velocidade >= 0 && velocidade < 40)



return 1; // primeira marcha


else if (velocidade >= 40 && velocidade < 60)



return 2; // segunda marcha


else if (velocidade >= 60 && velocidade < 80)



return 3; // terceira marcha


else if (velocidade >= 80 && velocidade < 100)



return 4; // quarta marcha


else if (velocidade >= 100)



return 5; // quinta marcha


else



return -1; // marcha r

}
}
public class Carro extends Automovel { }
public class Astra {





public static void main(String[] args) {



Carro carro = new Carro();

int marcha = carro.retornaMarcha(63);

System.out.println("Marcha atual: " + marcha); // imprime: Marcha atual: 3
}

O cdigo acima ir compilar sem erro, e, ao executar o mtodo main da classe Astra, teremos impresso na sada padro a
marcha atual de acordo com a velocidade do carro (trata-se de um carro automtico). O mtodo retornaMarcha retorna um
tipo inteiro (int) representando a marcha atual do carro. Se por algum motivo precisssemos mudar o retorno do mtodo
retornaMarcha para outro tipo primitivo ou para um objeto, o cdigo da classe Astra quebraria.
Para exemplificar, vamos criar uma classe para a marcha, chamada (coincidentemente) de Marcha:
public class Marcha {


private int marcha;


public Marcha(int marcha) {



this.marcha = marcha;
}

public int getMarcha() {



return marcha;
}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

46

Fundamentos da linguagem Java e Orientao a Objeto

Agora vamos modificar o tipo de retorno do mtodo retornaMarcha, para que este retorne um objeto do tipo Marcha ao
invs de um primitivo int:
public abstract class Automovel {


public Marcha retornaMarcha(int velocidade) { // o mtodo agora ir retornar um objeto Marcha


if (velocidade >= 0 && velocidade < 40)



return new Marcha(1); // retorna objeto Marcha referente a marcha 1


else if (velocidade >= 40 && velocidade < 60)



return new Marcha(2); // retorna objeto Marcha referente a marcha 2


else if (velocidade >= 60 && velocidade < 80)



return new Marcha(3); // retorna objeto Marcha referente a marcha 3


else if (velocidade >= 80 && velocidade < 100)



return new Marcha(4); // retorna objeto Marcha referente a marcha 4


else if (velocidade >= 100)



return new Marcha(5); // retorna objeto Marcha referente a marcha 5


else



return new Marcha(-1); // retorna objeto Marcha referente a marcha r

}
}

public class Carro extends Automovel {



// a classe Carro continua sem alteraes
}
public class Astra { // no ir compilar, lanando a exception: Type mismatch: cannot convert from Marcha to int


public static void main(String[] args) {


Carro carro = new Carro();


int marcha = carro.retornaMarcha(180);


System.out.println("Marcha atual: " + marcha);



}
}
Aps esta modificao a classe Astra no ir compilar e, neste caso, no poderamos contornar a situao criando um mtodo de mesma assinatura retornaMarcha retornando um tipo primitivo int devido herana.
Imagine agora que voc tenha centenas de classes utilizando a classe Carro ou mesmo a classe Automvel: seria muito
trabalhoso ter que refatorar cada uma dessas classes.
Usando composio
Agora vejamos uma situao semelhante, mas agora usando composio:
public class Automovel {


public int retornaMarcha(int velocidade) { // retorna a marcha de acordo com a velocidade (cmbio automtico)


if (velocidade >= 0 && velocidade < 40)



return 1; // primeira marcha


else if (velocidade >= 40 && velocidade < 60)



return 2; // segunda marcha


else if (velocidade >= 60 && velocidade < 80)



return 3; // terceira marcha


else if (velocidade >= 80 && velocidade < 100)



return 4; // quarta marcha


else if (velocidade >= 100)



return 5; // quinta marcha

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

47

Fundamentos da linguagem Java e Orientao a Objeto




else



return -1; // marcha r

}
}
public class Carro {


private Automovel automovel = new Automovel(); // composio


public int retornaMarcha(int velocidade) {


return automovel.retornaMarcha(velocidade); // fazendo forwarding para o mtodo da classe Automovel

}

}
public class Astra {


public static void main(String[] args) {




Carro carro = new Carro();


int marcha = carro.retornaMarcha(180);


System.out.println("Marcha atual: " + marcha);



}
}
Na composio, a classe composta chamada de back-end, enquanto que a classe que a compe chamada de frontend. Na herana, a subclasse herda automaticamente a implementao de todos os mtodos no privados, j na composio isso no acontece, sendo necessrio fazer um forwarding na classe front-end chamando o mtodo da classe backend.
Vamos ento fazer na composio o mesmo que fizemos na herana, criando um objeto Marcha:
public class Marcha {


private int marcha;


public Marcha(int marcha) {



this.marcha = marcha;
}

public int getMarcha() {



return marcha;
}

}
Agora vamos modificar a classe Automvel para que seu mtodo retornaMarcha retorne um objeto do tipo Marcha ao invs
de um primitivo int:
public class Automovel {


public Marcha retornaMarcha(int velocidade) { // mtodo modificado para retornar um objeto do tipo Marcha


if (velocidade >= 0 && velocidade < 40)



return new Marcha(1);


else if (velocidade >= 40 && velocidade < 60)



return new Marcha(2);


else if (velocidade >= 60 && velocidade < 80)



return new Marcha(3);


else if (velocidade >= 80 && velocidade < 100)



return new Marcha(4);


else if (velocidade >= 100)

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

48

Fundamentos da linguagem Java e Orientao a Objeto






}


else

return new Marcha(5);


return new Marcha(-1);

Devemos modificar tambm a classe Carro, que contm um forwarding do mtodo retornaMarcha:
public class Carro {


private Automovel automovel = new Automovel();


public int retornaMarcha(int velocidade) {


return automovel.retornaMarcha(velocidade).getMarcha(); // linha alterada, para retornar um tipo int

}

}
Note que na classe carro alteramos apenas a linha de retorno, permanecendo sua assinatura e tipo de retorno como int.
Perceba agora como ficou a classe Astra:
public class Astra {


public static void main(String[] args) {




Carro carro = new Carro();


int marcha = carro.retornaMarcha(180);


System.out.println("Marcha atual: " + marcha);



}
}
Note que o cdigo da classe Astra no teve nenhuma alterao, assim como centenas de outras possveis classes que
utilizam a classe Carro, como Celta, Corsa, Montana, tambm no necessitariam de alteraes.
Perceba, pelo exemplo acima, que quando no se deseja utilizar o polimorfismo, a composio uma tima maneira de
tornar o seu cdigo mais flexvel e menos acoplado.

18. Subscrevendo e sobrecarregando mtodos


18.1. Subscrevendo mtodos
Quando uma classe herda os mtodos da superclasse ela pode subscrever os mtodos desta, desde que o mtodo no
tenha sido declarado como final. Veja o exemplo a seguir:

class Animal {



}

public void mover() {



System.out.println("Andando...");
}

class Cobra extends Animal {




public void mover() { // subscrevendo o mtodo andar() da superclasse



System.out.println("Ratejando...");
}

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

49

Fundamentos da linguagem Java e Orientao a Objeto

Nossa classe Cobra estende a classe Animal e subscreve o mtodo mover(). Perceba que em nossa classe Animal temos
um mtodo representando a forma genrica de mover dos animais. Mas sabemos que a cobra uma exceo e, ao invs
de andar, ela rasteja. Para implementar isto de forma correta ento ns subscrevemos o mtodo mover() para representar a
forma correta de se mover da cobra, que rastejando. Veja o resultado que obtemos ao executar mtodo mover() de um
objeto do tipo Cobra:






public class TesteAnimal {






}

public static void main(String[] args) {



Animal cobra = new Cobra();

cobra.mover(); // ir imprimir: Rastejando...
}

Exatamente como espervamos! Uma cobra ir se rastejar ao invs de andar.


18.2. Sobrecarregando mtodos
Java permite que voc utilize o mesmo nome para mtodos com argumentos diferentes, ou seja, mtodos com assinaturas
difetentes. Isto chamado de sobrecarga de mtodos.
Veja o exemplo abaixo:

class OperacoesMatematicas {


public int soma(int x, int y) { // soma dois primitivos int


return x + y;

}


public double soma(double x, double y) { // soma dois primitivos double


return x + y;

}

}

A nossa classe OperacoesMatematicas possui dois mtodos de mesmo nome mas com argumentos diferentes. Para o
Java os mtodos so diferentes, que por uma mera coincidncia possuem nomes parecidos. Enquanto um mtodo executa
a soma de dois nmeros do tipo int, outro executa a soma de dois nmeros do tipo double. Veja o resultado obtido ao testar nossa classe:

public class TestaOperacoes {






public static void main(String[] args) {



OperacoesMatematicas operacoes = new OperacoesMatematicas();

int x = 2;

int y = 3;

int resultado1 = operacoes.soma(x, y);

double resultado2 = operacoes.soma(1.2, 2.5);

System.out.println(resultado1); // ir imprimir 5
System.out.println(resultado2); // ir imprimir 3.7

Exatamente como espervamos! Fizemos duas chamadas: uma para o mtodo soma(int x, int y) que retornou um int e outra para o mtodo soma(double x, double y) que retornou um double.

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

50

Fundamentos da linguagem Java e Orientao a Objeto

II - Referncias bibliogrficas

Mc Graw Hill / Alta Books


Sun Certified Java Associate Study Guide, 2010.
Certificao Sun Java Associado - SCJA: Guia de viagem para passar no exame, 2008.
Certificao Sun para Programador Java 6 Guia de Estudo, 2008.
Head First Java, 2005.

Caelum
Apostila FJ 11 - Java e Orientao a Objetos. <Disponvel em http://www.caelum.com.br>.
Apostila FJ 34 - Desenvolvimento para Web com Jboss Seam. <Disponvel em http://www.caelum.com.br>.

Argonavis
Gerncia de memria em Java, Edio 1.0, 2005. Helder da Rocha. <Disponvel em http://www.argonavis.com.br>.
Reuso com herana e composio. Helder da Rocha. <Disponvel em http://www.argonavis.com.br>.

iMasters
Java Wrappers. Camilo Lopes. <Disponvel em http://imasters.com.br/artigo/11801/java/wrappers>.

Instituto de Informtica da UFG (Universidade Federal de Gois)


Manual de Modelagem Orientada a Objetos. Fbio Nogueira de Lucena. <Disponvel em http://www.inf.ufg.br/~fabio/>.

Artima Developer
Composition versus Inheritance. Bill Venners. <Disponvel em http://www.artima.com/designtechniques/compoinh.html>.

GUJ - Grupo de Usurios Java


Grupo de Usurios Java. <Disponvel em http://www.guj.com.br>.

DCA / FEEC / Unicamp


Programao Orientada a Objetos - uma abordagem com Java. Ivan Luiz Marques Ricarte. <Disponvel em
http://www.dca.fee.unicamp.br/cursos/PooJava/>.

Oracle Technology Network


Code Conventions for the Java Programming Language. <Disponvel em
http://www.oracle.com/technetwork/java/codeconv-138413.html>.

2011 Lucas Medeiros de Freitas | lucas@hachitecnologia.com.br

51

Potrebbero piacerti anche