Ponteiros, Referências e Arrays em Java

Propaganda
Programação
com
a BD
Programação
OOAcesso
em Java
Curso: Técnico em Informática
Campus: Ipanguaçu
José
José Maria
Maria Monteiro
Monteiro
Pontifícia
PontifíciaUniversidade
Universidade Católica
Católica do
do Rio
Rio de
de Janeiro
Janeiro –– PUC
PUCPUC
PUC---Rio
Rio
Departamento
Departamento
de
de Informática
Informática
Clayton Maciel
Costa
[email protected]@inf.puc
[email protected]
[email protected]
rio.br
[email protected]
Programação com Acesso a BD
Unidade IV:
Ponteiros, Referências e
Arrays
1
Orientação a Objetos em Java
Arrays
Definição: estrutura de dados que define uma
coleção ordenada de um número fixo de
elementos de dados homogêneos;
Em Java, arrays são objetos;
Uma vez criado um array, seu tamanho nunca
muda
Orientação a Objetos em Java
Arrays
Declaração
<tipo> [] <lista-de-identificadores>
Exemplo: int [] a;
Criação
<identificador> = new <tipo> [<tamanho>];
Exemplo: a = new int [12]; (indexado de 0 a 11)
Combinando declaração e criação
<tipo> [] <identificador> = new <tipo> [<tamanho>];
Exemplo: int [] a = new int [12];
2
Orientação a Objetos em Java
Inicialização Arrays
Quando o array é criado, todos os elementos
são inicializados para o valor default de <tipo>;
Exemplo:
int [] a;
a = new int[10]; // Array de 10 inteiros (default = 0)
Exemplo:
double [] a = new double[10];
// Array de 10 números reais (double) (default = 0.0)
Exemplo:
boolean [] a = new boolean[10];
// Array de 10 booleanos (default = false)
Exemplo:
String [] a = new String[10];
// Array de 10 strings (tipo complexo) (default = null)
Orientação a Objetos em Java
Inicialização Arrays
Arrays podem ser inicializados no momento de sua
declaração:
<tipo> [] <identificador> = {e1, ..., en};
Exemplo: a declaração
String [] cores = { “verde”, “azul”, “preto” };
equivale a
String [] cores = new String [3];
cores [0] = “verde”;
cores [1] = “azul”;
cores [2] = “preto”;
3
Orientação a Objetos em Java
Inicialização Arrays
Exemplo: a declaração
int vet[] = { 1, 3, 5, 7, 10 };
equivale a
int [] vet = new vet [5];
vet [0] = 1;
vet [1] = 3;
vet [2] = 5;
vet [3] = 7;
vet [4] = 10;
Orientação a Objetos em Java
Inicialização Arrays
int [] v = new int[3];
Pilha
#
heap
0
0
0
v[0] = 23;
v[2] = 52;
Pilha
#
heap
23
0
52
4
Orientação a Objetos em Java
Inicialização Arrays
heap
Pilha
String [] s = new String [2]; #
s[0] = “Verde”;
s[1] = “Amarelo”;
Pilha
#
Pilha
#
null
null
heap
#
heap
“Verde”
null
heap
#
#
heap
“Verde”
“Amarelo”
Orientação a Objetos em Java
Inicialização Arrays
heap
Pilha
Point [] p = new Point [2];
#
p[0] = new Point();
Pilha
#
null
null
heap
#
null
public class Point
{
public int x;
public int y;
}
heap
0 p[0].x
0
p[0].y
5
Orientação a Objetos em Java
Tamanho de um Arrays
Se “a” é um identificador de array, a.length dá
o tamanho de “a”;
Exemplo: o método a seguir imprime um array
de inteiros de tamanho arbitrário;
static void imprime (int [] a) {
for (int i = 0; i < a.length; i = i + 1)
System.out.println (a[i]);
}
Orientação a Objetos em Java
Tamanho de um Arrays
Exceção gerada se houver tentativa de acesso
indevida aos índices do array:
– ArrayIndexOutOfBoundsException;
Exemplo:
int vet[] = { 1, 3, 5, 7, 10 };
System.out.println (vet[5]);
System.out.println (vet.length);
6
Orientação a Objetos em Java
Arrays
Podem ter uma (one-dimensional array) ou
múltiplas dimensões (arrays de arrays).
Sendo e um array de duas dimensões com dois
elementos na primeira e quatro na segunda
(2x4), a implementação desse array em java
utilizará três objetos array, conforme o esquema
abaixo:
e
e
e0
e00
e01
e02
e03
e0
e1
e10
e11
e12
e13
e1
e00
e01
e02
e03
e10
e11
e12
e13
Orientação a Objetos em Java
Arrays Multidimensionais
Declaração
<tipo> [] [][]...[] <lista-de-identificadores>;
Exemplo: int [] [] a; // Array de duas dimensões
int [] a []; // Expressão equivalente
Criação
<identificador> = new <tipo> [<tamanho>]... [<tamanho>];
Exemplo: a = new int [2][3]; // Criando array 2 x 3 (inteiros)
Combinando declaração e criação
<tipo> [] [][]...[] <ident.> = new <tipo> [<tam.>] ... [<tam.>];
Exemplo: int [][] a = new int [2][3];
7
Orientação a Objetos em Java
Arrays Multidimensionais
Inicializando Arrays Multidimensionais
Exemplo:
double taxas[][] = { { 1,2,3 }, {4,5,6} };
// declarando e inicializando um array com dimensões
internas diferentes
String[][] cores = { { “Verde”, “Amarelo”, null }, // 3 elementos
{ null, null },
// 2 elementos
{},
//zero elementos
null
// Array ainda não construído
};
Orientação a Objetos em Java
Arrays Multidimensionais
Na criação de arrays multidimensionais com o
operador new, a profundidade dos arrays mais
internos pode ser omitida:
double matrix[][] = new double[3][];
A inicialização poderia ser assim:
for (int i = 0; i < matrix.length; ++i)
matrix[ i ] = new double[ i+1 ];
A representação da memória, nesse caso, seria:
8
Orientação a Objetos em Java
Arrays Multidimensionais
matrix[0] : double[]
matrix[1] : double[]
length = 1
[0 ]
8.5
length = 2
[0 ]
[1 ]
6.3
4.4
matrix : double[][]
length = 3
matrix[2] : double[]
[ 0 ] : Ref ( double[] )
[ 1 ] : Ref ( double[] )
[ 2 ] : Ref ( double[] )
length = 3
[0 ]
[1 ]
[2 ]
1.5
2.9
5.5
Orientação a Objetos em Java
Métodos
Procedimentos e Funções são representados
em Java por métodos.
A diferença está no tipo de retorno. Se o tipo
de retorno for nulo, indicado pela palavra void,
o método representa um procedimento.
Caso contrário, ou seja, se existe um tipo de
retorno, o método representa uma função.
Métodos (em Java)
Procedimentos
NÃO têm tipo de retorno (void)
Funções
têm tipo de retorno
9
Orientação a Objetos em Java
Métodos
Declaração de um Método:
public static tipoDeRetorno nomeDoMétodo
( tipo1 parâmetro1, tipo2 parâmetro2,
...)
{
// aqui é colocado o corpo do método
}
Cada parâmetro pode ser:
– um valor,
– uma variável ou
– uma expressão que representam um tipo primitivo, um array ou
uma classe.
O tipo de retorno pode ser:
– qualquer tipo primitivo (int, long, float, ...)
– qualquer classe (String, …)
– void, para o caso de não retornar nada (procedimento).
Orientação a Objetos em Java
Passagem de Parâmetro
public class DeclaracaoDeMetodos
{
// declarando um método que representa uma função…
public static int soma ( int a , int b )
{
Observe os
int s = a + b;
tipos de retorno
return s;
}
// declarando um método que representa um procedimento…
public static void imprimir ( int a )
{
System.out.println ( a );
}
}
10
Orientação a Objetos em Java
Passagem de Parâmetro
public class DeclaracaoDeMetodos
{
// declarando um método que representa uma função…
public static int soma ( int a , int b )
{
int s = a + b;
return s;
}
public static void main (String [] args)
{
int c = soma(5, 20);
System.out.println ( soma(c, 10) );
}
}
Orientação a Objetos em Java
Passagem de Parâmetro
public class DeclaracaoDeMetodos
{
// declarando um método que representa um procedimento…
public static void imprimir ( int a )
{
System.out.println ( a );
}
public static void main (String [] args)
{
int c = 10;
imprimir(c);
imprimir(20);
imprimir(c+20);
}
}
11
Orientação a Objetos em Java
Passagem de Parâmetro
O número de parâmetros passados deve ser igual ao
da definição.
Cada parâmetro individualmente, deve ter tipo
compatível ao da definição.
Em Java, todos os parâmetros são passados por
valor, isto significa que o valor (e não o endereço) da
variável é passado. Assim, as modificações no
parâmetro formal (dentro do método) não afetam o
parâmetro real (valor externo).
Cada chamada a um método cria suas próprias
instâncias dos parâmetros formais.
Uma expressão pode ser usada como argumento.
Orientação a Objetos em Java
Passagem de Parâmetro
Em Java, a passagem é por valor, ou seja, o
valor (e não o endereço) da variável é passado;
Conseqüências:
- Modificações no parâmetro formal não são
refletidas no parâmetro real.
- Uma expressão pode ser usada como
argumento.
- Ineficiência em alguns casos (cópia).
12
Orientação a Objetos em Java
Passagem de Parâmetro - Exemplo
class PassagemPorValor {
private static void incrementa (int x) {
x = x + 1;
System.out.println (“x = ” + x);
}
public static void main (String [] args) {
int y = 1;
System.out.println(“y = ” + y);
incrementa (y);
System.out.println(“y = ” + y);
}
}
Orientação a Objetos em Java
Passagem de Parâmetro - Exemplo
class PassagemPorValor {
private static int incrementa (int x) {
x = x + 1;
System.out.println (“x = ” + x);
return x;
}
public static void main (String [] args) {
int y = 1;
System.out.println(“y = ” + y);
y = incrementa (y);
System.out.println(“y = ” + y);
}
}
13
Orientação a Objetos em Java
Passagem de Parâmetro
Como já foi visto anteriormente, a passagem de
parâmetros de tipos primitivos em Java é feita por
valor, ou seja, uma cópia do valor original é feita.
Isso significa que modificações no parâmetro
formal não são refletidas no parâmetro real.
Para arrays, uma cópia da referência para o array
é passada.
Para objetos, uma cópia da referência ao objeto é
passada, e não uma cópia do objeto.
Orientação a Objetos em Java
Passagem de Parâmetros com Arrays
Para arrays, uma cópia da referência para o array é
passada, assim, as mudanças no seus elementos
dentro de um método, se refletem no lugar onde o
método foi chamado.
14
Orientação a Objetos em Java
Passagem de Parâmetros com Arrays
public static void somar(int[] x)
{
x[2] = x[1] + x[0];
}
public static void main (String args[]) {
int[] a = new int[3];
a[0] = 1;
a[1] = 10;
a[2] = 20;
System.out.println(“antes >”+ a[2]);
somar(a);
System.out.println(“depois >”+ a[2]);
}
antes >20
depois >11
Orientação a Objetos em Java
Parâmetros também podem ser passados para um
programa.
Eles são acessíveis no método main() como um array de
String.
public class Classe
{
public void main(String args[])
{
for (int i=0; i<args.length; i++)
{
System.out.println( “>“ + i + “ = “ + args[i] );
}
}
}
em uma chamada do tipo:
java Classe abc xyz,sdf uuu
o resultado do programa será:
> 0 = abc
> 1 = xyz,sdf
> 2 = uuu
15
Orientação a Objetos em Java
Aliasing
Aliasing
ocorre
quando
mais
de
um
identificador está associado a um mesmo
endereço de memória;
Apesar da passagem de parâmetros em java
ser por valor, pode-se ter aliasing quando um
objeto é passado como parâmetro;
É sempre a referência ao objeto que é passada
(por valor) e não o objeto em si;
Orientação a Objetos em Java
Exemplo de Aliasing
class Aliasing {
private static void credita (Conta a, Conta b) {
a.credito(100);
b.credito(100);
}
public static void main (String [] args) {
Conta c = new Conta(“205.789-6”);
credita (c, c);
System.out.println(c.getSaldo());
}
}
16
Orientação a Objetos em Java
Aliasing como Conseqüência de uma Atribuição
Atribuição de um identificador de objeto a um
outro de mesmo tipo é permitida, mas o
endereço (e não o valor) é atribuído.
Exemplo
...
Conta a = new conta(“123-4”);
Conta b;
b = a; \\ a e b passam a referenciar a mesma conta
b.credito (100);
System.out.println (a.getSaldo());
...
Orientação a Objetos em Java
Passagem por Referência
class Referencia {
private static void redefine (Conta a) {
Conta b = new Conta(“567-8”);
a.credito(100);
a = b;
a.credito(100);
}
}
public static void main (String [] args) {
Conta c = new Conta(“123-4”);
redefine (c);
System.out.println(c.getNumero() + c.getSaldo()); // 100
}
}
17
Orientação a Objetos em Java
A Classe Banco - Operações
•
•
•
•
•
•
•
Cadastro de uma nova conta
Remover uma conta
Localizar (procurar) uma conta
Efetuar Crédito
Efetuar Débito
Consultar Saldo
Transferência entre contas
Orientação a Objetos em Java
A Classe Banco - Descrição
class Banco {
private Conta[] contas;
private int indice;
Banco(int numContas) {
this.contas = new Conta[numContas];
indice = 0;
}
18
Orientação a Objetos em Java
A Classe Banco - Descrição
class Banco {
private Conta[]
private int
contas;
indice;
void cadastrarConta(String num) {
if (indice<contas.length){
Conta c = new Conta(num);
contas[indice] = c;
indice = indice + 1;
}
else System.out.println(“Banco Lotado!!!”);
}
Orientação a Objetos em Java
A Classe Banco - Descrição
private Conta procurarConta(String n) {
int
i = 0;
boolean achou = false;
while ((! achou) && (i < indice)) {
if (contas[i].getNumero().equals(n)) achou = true;
else i = i + 1;
}
if (achou) return contas[i];
else return null;
}
19
Orientação a Objetos em Java
A Classe Banco - Descrição
void efetuarDebito(String num, double val) {
Conta
c;
c = procurarConta(num);
if (c != null) c.debito(val);
else System.out.println("Conta inexistente!");
}
A operação credito é similar
Orientação a Objetos em Java
A Classe Banco - Descrição
private void removerConta(String n) {
int
i = 0;
boolean achou = false;
while ((! achou) && (i < indice)) {
if (contas[i].getNumero().equals(n)) achou = true;
else i = i + 1;
}
if (achou) {
contas[i] = contas[indice-1];
indice--;
}
else System.out.println(“Conta Inexistente”);
}
20
Orientação a Objetos em Java
Camada de Negócio
Camada de Coleção
Cam. de Apresentação
(Interface com o Usuário)
Orientação a Objetos em Java
Camadas
21
“Quando todos concordam comigo eu sempre
sinto que estou errado.”
Oscar Wilde
Orientação a Objetos em Java
Exercício
Completar a implementação da classe
banco com o construtor e os métodos
transfere e saldo.
Acrescente um novo método para
remover uma conta.
22
Orientação a Objetos em Java
Exercício
Desenvolva um sistema simples de eleição,
usando a classe já implementada para
modelar um candidato. Definir uma outra
classe para agrupar candidatos (usando
arrays). Elabore um programa que lê um
número arbitrário de nomes de candidatos e
efetua a contagem; no final, indique o
vencedor e o total de votos.
Orientação a Objetos em Java
Exercício
Desenvolva um sistema simples para
controle de estoque, contendo pelo menos
as classes produto e estoque, e as seguintes
operações: alterar as propriedades dos
produtos (nome, preço, quantidade em
estoque), retirar um produto do estoque, e
verificar que produtos precisam ser repostos.
23
Download