A maior rede de estudos do Brasil

Grátis
4 pág.
Variaveis_e_Atributos_Estaticos_e_de_Ins

Pré-visualização | Página 1 de 1

Variáveis e Atributos Estáticos e de Instância em Java 
por Jorge Fernandes (jorge@dimap.ufrn.br) 
Agosto de 2002 
Este seção descreve as diferenças entre variáveis locais, atributos estáticos e não estáticos. 
Classe Produto 
O trecho de código abaixo apresenta uma primeira versão da classe Produto, que representa informações 
sobre um produto qualquer de um software. 
class Produto { 
 String nome; 
 int preco; 
} 
Quantos atributos não estáticos são declaradas na classe Produto? Quais são eles? 
Definida a classe Produto, podemos criar um objeto desta classe através da expressão new Produto(). 
No trecho de código abaixo se vê a criação de um produto e atribuição de valores aos campos do 
produto criado. 
class TesteProduto_1 { 
 public static void main(String[] args) { 
 Produto p; 
 p = new Produto(); 
 p.nome = "Pao"; 
 p.preco = 10; 
 } 
} 
Quantas variáveis estão declaradas no escopo do método TesteProduto_1.main(String[] 
args)? Quais são elas? 
Quantos objetos são criados durante a execução do método acima? Quais os tipos deles? 
Veja o exemplo abaixo. Perceba que a variável preco declarada dentro do método main não é a mesma 
que o atributo preco declarado no escopo da classe Produto. 
class TesteProduto_2 { 
 public static void main(String[] args) { 
 Produto p1, p2; 
 p1 = new Produto(); 
 int preco = 40; 
 p1.nome = "Pao"; 
 p1.preco = preco; 
 preco = 80; 
 p2 = new Produto(); 
 p2.preco = preco; 
 p2.nome = "Cuscuz"; 
Variáveis e Atributos Estáticos e de Instância em Java- por Jorge Fernandes - Página 1
URL: http://www.dimap.ufrn.br/~jorge. Copyright (c) 2002, Jorge Fernandes (jorge@dimap.ufrn.br)
 } 
} 
Qual o valor do atributo preco do objeto referenciado pela variável p1? Em outras palavras, 
qual o preco do (objeto de nome) "Pao"? Qual o preço do "Cuscuz"? Qual o valor da 
variável preco declarada no método main, ao final da execução do método? 
Suponha agora que desejamos atribuir um código único para cada (objeto da classe) Produto criado pelo 
programa. Uma solução é declarar um atributo estático dentro da classe Produto, que contém um inteiro 
cuja finalidade é indicar o código do próximo produto a ser criado. Durante a criação de cada produto 
este inteiro será usado para indicar o código do produto e será incrementado imediatamente após a 
criação do objeto. Os trechos de código abaixo mostram como isto pode ser feito nas classes Produto e 
TesteProduto_3. 
class Produto { 
 String nome; 
 int preco; 
 int codigo; 
 static int codigoProxProduto; 
} 
 
class TesteProduto_3 { 
 public static void main(String[] args) { 
 Produto p1, p2; 
 
 p1 = new Produto(); 
 int preco = 40; 
 p1.nome = "Pao"; 
 p1.preco = preco; 
 p1.codigo = Produto.codigoProxProduto; 
 Produto.codigoProxProduto++; 
 
 preco = 80; 
 p2 = new Produto(); 
 p2.preco = preco; 
 p2.nome = "Cuscuz"; 
 p2.codigo = Produto.codigoProxProduto; 
 Produto.codigoProxProduto++; 
 } 
} 
O código acima oferece uma solução para a criação automática de códigos mas introduz possíveis 
pontos de falha no sistema, pois a variável (atributo estático) Produto.codigoProxProduto é uma variável 
global, que pode ser alterada arbitrariamente a partir de qualquer parte do programa. 
Qual o código do "Pao", criado no método acima? qual o código do "Cuscuz" criado no 
método acima? 
Uma solução refinada para o problema é declarar a variável Produto.codigoProxProduto como privada, 
o que impede que qualquer código fora do escopo da classe Produto tenha acesso a este atributo. 
class Produto { 
 String nome; 
 int preco; 
 int codigo; 
Variáveis e Atributos Estáticos e de Instância em Java - por Jorge Fernandes - Página 2
URL: http://www.dimap.ufrn.br/~jorge. Copyright (c) 2002, Jorge Fernandes (jorge@dimap.ufrn.br)
 private static int codigoProxProduto; 
} 
A mudança acima inviabiliza imediatamente a execução do método TesteProduto_3.main(). O problema 
é que conceitualmente a informação sobre como atribuir o código único do produto deve ser 
implementada no escopo da classe Produto. A declaração de um método construtor para a classe produto 
permite que possamos atribuir automaticamente um código ao produto, no momento de sua criação. A 
classe Produto e o método que cria Produtos podem ser definidos como abaixo: 
class Produto { 
 String nome; 
 int preco; 
 int codigo; 
 private static int codigoProxProduto; 
 Produto() { 
 codigo = codigoProxProduto; 
 codigoProxProduto++; 
 } 
} 
 
class TesteProduto_4 { 
 public static void main(String[] args) { 
 Produto p1, p2, p3; 
 
 p1 = new Produto(); 
 p1.nome = "Pao"; 
 p1.preco = 40; 
 
 p2 = new Produto(); 
 p2.nome = "Leite"; 
 p2.preco = 120; 
 
 p3 = new Produto(); 
 p3.nome = "Cuscuz"; 
 p3.preco = 80; 
 } 
} 
Qual o código do "Pao", criado no método acima? qual o código do "Cuscuz" criado no 
método acima? 
Construtores mais complexos 
A linguagem Java aceita a sobrecarga de métodos, isto é, métodos com mesmo nome podem ser 
definidos, bastando que tenham diferença quantos aos argumentos que recebem. Neste caso, é possível 
definirmos um novo método construtor para produto, que já recebe, no momento da criação do objeto, 
os argumentos nome e preco, para serem inseridos no produto. Antes de atribuir valores ao preco e 
nome, o novo construtor criado invoca o construtor default (Produto()), usando a declaração this(). ISto 
equivale a chamar o construtor da mesma classe, que difere apenas quanto ao tipo de argumentos que 
recebe. No caso do construtor default, o método não recebe nenhum parâmetro. Para ilustrar mais ainda 
o uso de this como uma referência ao método construtor, definimos um terceiro construtor de produto, 
que recebe apenas o nome do produto e o cria com preço 0. A versão final da classe Produto e de um 
método que usa os serviços da classe para manipular produtos está definida abaixo. 
class Produto { 
Variáveis e Atributos Estáticos e de Instância em Java - por Jorge Fernandes - Página 3
URL: http://www.dimap.ufrn.br/~jorge. Copyright (c) 2002, Jorge Fernandes (jorge@dimap.ufrn.br)
 String nome; 
 int preco; 
 int codigo; 
 private static int codigoProxProduto; 
 Produto() { 
 codigo = codigoProxProduto; 
 codigoProxProduto++; 
 } 
 Produto(String nome, int preco) { 
 this(); 
 this.nome = nome; 
 this.preco = preco; 
 } 
 Produto(String nome) { 
 this(nome, 0); 
 } 
} 
 
class TesteProduto_4 { 
 public static void main(String[] args) { 
 Produto p1, p2, p3, p4; 
 p1 = new Produto("Pao", 40); 
 p2 = new Produto("Leite", 120); 
 p3 = new Produto("Cuscuz", 80); 
 p4 = new Produto("Revista"); 
 } 
} 
Qual o preço da "Revista", criada no método acima? Qual o código do "Leite" criado no 
método acima? Qual o código do "Cuscuz" criado no método acima? 
Variáveis e Atributos Estáticos e de Instância em Java - por Jorge Fernandes - Página 4
URL: http://www.dimap.ufrn.br/~jorge. Copyright (c) 2002, Jorge Fernandes (jorge@dimap.ufrn.br)

Crie agora seu perfil grátis para visualizar sem restrições.