Você está na página 1de 12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

APOSTILA JAVA E ORIENTAO A OBJETOS

CAPTULO 5

Um pouco de arrays
"O homem esquecer antes a morte do pai que a perda da propriedade"
Maquiavel
Ao trmino desse captulo, voc ser capaz de:
declarar e instanciar arrays;
popular e percorrer arrays.

5.1 - O PROBLEMA
Dentro de um bloco, podemos declarar diversas variveis e us-las:
int idade1;
int idade2;
int idade3;
int idade4;

Isso pode se tornar um problema quando precisamos mudar a quantidade de


variveis a serem declaradas de acordo com um parmetro. Esse parmetro pode
variar, como por exemplo, a quantidade de nmero contidos num bilhete de
loteria. Um jogo simples possui 6 nmeros, mas podemos comprar um bilhete
mais caro, com 7 nmeros ou mais.
Para facilitar esse tipo de caso podemos declarar um vetor (array) de inteiros:
int[] idades;

O int[] um tipo. Uma array sempre um objeto, portanto, a varivel idades


uma referncia. Vamos precisar criar um objeto para poder usar a array. Como
criamos o objeto-array?
idades = new int[10];
www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

1/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

O que fizemos foi criar uma array de int de 10 posies e atribuir o endereo no
qual ela foi criada. Podemos ainda acessar as posies do array:
idades[5] = 10;

O cdigo acima altera a sexta posio do array. No Java, os ndices do array vo


de 0 a n-1, onde n o tamanho dado no momento em que voc criou o array. Se
voc tentar acessar uma posio fora desse alcance, um erro ocorrer durante a
execuo.

Arrays - um problema no aprendizado de muitas linguagens


Aprender a usar arrays pode ser um problema em qualquer linguagem. Isso
porque envolve uma srie de conceitos, sintaxe e outros. No Java, muitas
vezes utilizamos outros recursos em vez de arrays, em especial os pacotes
de colees do Java, que veremos no captulo 11. Portanto, fique tranquilo
caso no consiga digerir toda sintaxe das arrays num primeiro momento.

No caso do bilhete de loteria, podemos utilizar o mesmo recurso. Mais ainda, a


quantidade de nmeros do nosso bilhete pode ser definido por uma varivel.
Considere que nindica quantos nmeros nosso bilhete ter, podemos ento fazer:
int numerosDoBilhete[] = new int[n];

E assim podemos acessar e modificar os inteiros com ndice de 0a n-1.

5.2 - ARRAYS DE REFERNCIAS


comum ouvirmos "array de objetos". Porm quando criamos uma array de
alguma classe, ela possui referncias. O objeto, como sempre, est na memria
principal e, na sua array, s ficam guardadas as referncias (endereos).
Conta[] minhasContas;
www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

2/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

minhasContas = new Conta[10];

Quantas contas foram criadas aqui? Na verdade, nenhuma. Foram criados 10


espaos que voc pode utilizar para guardar uma referncia a uma Conta. Por
enquanto, eles se referenciam para lugar nenhum (null). Se voc tentar:
System.out.println(minhasContas[0].saldo);

Um erro durante a execuo ocorrer! Pois, na primeira posio da array, no h


uma referncia para uma conta, nem para lugar nenhum. Voc deve popular sua
array antes.
Conta contaNova = new Conta();
contaNova.saldo = 1000.0;
minhasContas[0] = contaNova;

Ou voc pode fazer isso diretamente:


minhasContas[1] = new Conta();
minhasContas[1].saldo = 3200.0;

Uma array de tipos primitivos guarda valores, uma array de objetos guarda
referncias.

Nova editora Casa do Cdigo com livros de uma forma diferente


Editoras tradicionais pouco ligam para ebooks e novas tecnologias. No
conhecem programao para revisar os livros tecnicamente a fundo. No
tm anos de experincia em didticas com cursos.

www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

3/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

Conhea a Casa do Cdigo, uma editora diferente, com


curadoria da Caelum e obsesso por livros de qualidade a
preos justos.
Casa do Cdigo, ebook com preo de ebook.

5.3 - PERCORRENDO UMA ARRAY


Percorrer uma array muito simples quando fomos ns que a criamos:
public static void main(String args[]) {
int[] idades = new int[10];
for (int i = 0; i < 10; i++) {
idades[i] = i * 10;
}
for (int i = 0; i < 10; i++) {
System.out.println(idades[i]);
}
}

Porm, em muitos casos, recebemos uma array como argumento em um


mtodo:
void imprimeArray(int[] array) {
// no compila!!
for (int i = 0; i < ????; i++) {
System.out.println(array[i]);
}
}

At onde o fordeve ir? Toda array em Java tem um atributo que se chama
length, e voc pode acess-lo para saber o tamanho do array ao qual voc est se
referenciando naquele momento:
void imprimeArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}

Arrays no podem mudar de tamanho


A partir do momento que uma array foi criada, ela no pode mudar de
tamanho.
Se voc precisar de mais espao, ser necessrio criar uma nova array e,
www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

4/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

antes de se referir ela, copie os elementos da array velha.

5.4 - PERCORRENDO UMA ARRAY NO JAVA 5.0


O Java 5.0 traz uma nova sintaxe para percorremos arrays (e colees, que
veremos mais a frente).
No caso de voc no ter necessidade de manter uma varivel com o ndice que
indica a posio do elemento no vetor (que uma grande parte dos casos),
podemos usar o enhanced-for.
class AlgumaClasse{
public static void main(String args[]) {
int[] idades = new int[10];
for (int i = 0; i < 10; i++) {
idades[i] = i * 10;
}
// imprimindo toda a array
for (int x : idades) {
System.out.println(x);
}
}
}

No precisamos mais do lengthpara percorrer matrizes cujo tamanho no


conhecemos:
class AlgumaClasse {
void imprimeArray(int[] array) {
for (int x : array) {
System.out.println(x);
}
}
}

O mesmo vlido para arrays de referncias. Esse fornada mais que um


truque de compilao para facilitar essa tarefa de percorrer arrays e torn-la mais
legvel.

5.5 - EXERCCIOS: ARRAYS


1. Volte ao nosso sistema de Funcionario e crie uma classe Empresadentro do
mesmo arquivo .java. A Empresatem um nome, cnpj e uma referncia a uma
www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

5/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

array de Funcionario, alm de outros atributos que voc julgar necessrio.


class Empresa {
// outros atributos
Funcionario[] empregados;
String cnpj;
}

2. A Empresadeve ter um mtodo adiciona, que recebe uma referncia a


Funcionariocomo argumento e guarda esse funcionrio. Algo como:
void adiciona(Funcionario f) {
// algo tipo:
// this.empregados[ ??? ] = f;
// mas que posio colocar?
}

Voc deve inserir o Funcionarioem uma posio da array que esteja livre. Existem
vrias maneiras para voc fazer isso: guardar um contador para indicar qual a
prxima posio vazia ou procurar por uma posio vazia toda vez. O que seria
mais interessante?
importante reparar que o mtodo adiciona no recebe nome, rg, salrio, etc. Essa
seria uma maneira nem um pouco estruturada, muito menos orientada a objetos de
se trabalhar. Voc antes cria um Funcionarioe j passa a referncia dele, que
dentro do objeto possui rg, salrio, etc.
3. Crie uma classe TestaEmpresaque possuir um mtodo main. Dentro dele crie
algumas instncias de Funcionarioe passe para a empresa pelo mtodo
adiciona. Repare que antes voc vai precisar criar a array, pois inicialmente o
atributo empregadosda classe Empresano referencia lugar nenhum (seu valor
null):
Empresa empresa = new Empresa();
empresa.empregados = new Funcionario[10];
// ....

Ou voc pode construir a array dentro da prpria declarao da classe Empresa,


fazendo com que toda vez que uma Empresa instanciada, a array de Funcionario
que ela necessita tambm criada.
Crie alguns funcionrios e passe como argumento para o adicionada empresa:
Funcionario f1 = new Funcionario();
f1.salario = 1000;
empresa.adiciona(f1);
Funcionario f2 = new Funcionario();
www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

6/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

f2.salario = 1700;
empresa.adiciona(f2);

Voc pode criar esses funcionrios dentro de um loop e dar a cada um deles valores
diferentes de salrios:
for (int i = 0; i < 5; i++) {
Funcionario f = new Funcionario();
f.salario = 1000 + i * 100;
empresa.adiciona(f);
}

Repare que temos de instanciar Funcionariodentro do lao. Se a instanciao de


Funcionarioficasse acima do lao, estaramos adicionado cinco vezes a mesma
instncia de Funcionarionesta Empresae apenas mudando seu salrio a cada
iterao, que nesse caso no o efeito desejado.
Opcional: o mtodo adicionapode gerar uma mensagem de erro indicando quando
o array j est cheio.
4. Percorra o atributo empregadosda sua instncia da Empresae imprima os
salrios de todos seus funcionrios. Para fazer isso, voc pode criar um mtodo
chamado mostraEmpregadosdentro da classe Empresa:
void mostraEmpregados() {
for (int i = 0; i < this.empregados.length; i++) {
System.out.println("Funcionrio na posio: " + i);
// preencher para mostrar outras informacoes do funcionario
}
}

Cuidado ao preencher esse mtodo: alguns ndices do seu array podem no conter
referncia para um Funcionarioconstrudo, isto , ainda se referirem para null.
Se preferir, use o fornovo do java 5.0.
A, atravs do seu main, depois de adicionar alguns funcionrios, basta fazer:
empresa.mostraEmpregados();

5. (opcional) Em vez de mostrar apenas o salrio de cada funcionrio, voc pode


chamar o mtodo mostra()de cada Funcionarioda sua array.
6. (Opcional) Crie um mtodo para verificar se um determinado Funcionariose
encontra ou no como funcionrio desta empresa:
boolean contem(Funcionario f) {
// ...
}
www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

7/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

Voc vai precisar fazer um forna sua array e verificar se a referncia passada
como argumento se encontra dentro da array. Evite ao mximo usar nmeros
hard-coded, isto , use o .lengthou o atributo livre.
7. (Opcional) Caso a array j esteja cheia no momento de adicionar um outro
funcionrio, criar uma nova maior e copiar os valores. Isto , fazer a realocao j
que java no tem isso: uma array nasce e morre com o mesmo length.

Usando o this para passar argumento


Dentro de um mtodo, voc pode usar a palavra thispara referenciar a si
mesmo e pode passar essa referncia como argumento.

J conhece os cursos online Alura?


A Alura oferece dezenas de cursos online em sua
plataforma exclusiva de ensino que favorece o
aprendizado com a qualidade reconhecida da Caelum.
Voc pode escolher um curso nas reas de Java, Ruby,
Web, Mobile, .NET e outros, ou fazer a assinatura
semestral que d acesso a todos os cursos.
Conhea os cursos online da Caelum.

5.6 - UM POUCO MAIS...


Arrays podem ter mais de uma dimenso. Isto , em vez de termos uma array de
10 contas, podemos ter uma array de 10 por 10 contas e voc pode acessar a conta
na posio da coluna x e linha y. Na verdade, uma array bidimensional em Java
uma array de arrays. Pesquise sobre isso.

www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

8/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

Uma array bidimensional no precisa ser retangular, isto , cada linha pode ter
um nmero diferente de colunas. Como? Porque?

O que acontece se criarmos uma array de 0 elementos? e -1?


O mtodo mainrecebe uma array de Strings como argumento. Essa array
passada pelo usurio quando ele invoca o programa:
$ java Teste argumento1 outro maisoutro

E nossa classe:
class Teste {
public static void main (String[] args) {
for(String argumento: args) {
System.out.println(argumento);
}
}
}
www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

9/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

Isso imprimir:
argumento1
outro
maisoutro

5.7 - DESAFIOS
1. No captulo anterior, voc deve ter reparado que a verso recursiva para o
problema de Fibonacci lenta porque toda hora estamos recalculando valores. Faa
com que a verso recursiva seja to boa quanto a verso iterativa. (Dica: use arrays
para isso)

5.8 - TESTANDO O CONHECIMENTO


1. O objetivo dos exerccios a seguir fixar os conceitos vistos. Se voc est com
dificuldade em alguma parte desse captulo, aproveite e treine tudo o que vimos at
agora no pequeno programa abaixo:
Programa:Classe: Casa Atributos: cor, totalDePortas, portas[] Mtodos: void
pinta(String s), int quantasPortasEstaoAbertas(), void adicionaPorta(Porta p), int
totalDePortas()
Crie uma casa, pinte-a. Crie trs portas e coloque-as na casa atravs do mtodo
adicionaPorta, abra e feche-as como desejar. Utilize o mtodo
quantasPortasEstaoAbertaspara imprimir o nmero de portas abertas e o
mtodo totalDePortaspara imprimir o total de portas em sua casa.

Voc no est nessa pgina a toa


Voc chegou aqui porque a Caelum referncia nacional em
cursos de Java, Ruby, Agile, Mobile, Web e .NET.
Faa curso com quem escreveu essa apostila.
Consulte as vantagens do curso Java e Orientao a Objetos.

www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

10/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

CAPTULO ANTERIOR:

Orientao a objetos bsica


PRXIMO CAPTULO:

Modificadores de acesso e atributos de classe

Voc encontra a Caelum tambm em:

Blog Caelum

Cursos Online

Facebook

Newsletter

Casa do Cdigo

www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

11/12

19/09/13

Um pouco de arrays - Java e Orientao a Objetos

Twitter

www.caelum.com.br/apostila-java-orientacao-objetos/um-pouco-de-arrays/#5-1-o-problema

12/12