Escolar Documentos
Profissional Documentos
Cultura Documentos
Variaveis e Atributos Estaticos e de Ins
Variaveis e Atributos Estaticos e de Ins
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;
}
}
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";
}
}
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;
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?
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 {
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?