Você está na página 1de 4

Variáveis e Atributos Estáticos e de Instância em Java- por Jorge Fernandes - Página 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";

URL: http://www.dimap.ufrn.br/~jorge. Copyright (c) 2002, Jorge Fernandes (jorge@dimap.ufrn.br)


Variáveis e Atributos Estáticos e de Instância em Java - por Jorge Fernandes - Página 2

}
}

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;

URL: http://www.dimap.ufrn.br/~jorge. Copyright (c) 2002, Jorge Fernandes (jorge@dimap.ufrn.br)


Variáveis e Atributos Estáticos e de Instância em Java - por Jorge Fernandes - Página 3

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 {

URL: http://www.dimap.ufrn.br/~jorge. Copyright (c) 2002, Jorge Fernandes (jorge@dimap.ufrn.br)


Variáveis e Atributos Estáticos e de Instância em Java - por Jorge Fernandes - Página 4

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?

URL: http://www.dimap.ufrn.br/~jorge. Copyright (c) 2002, Jorge Fernandes (jorge@dimap.ufrn.br)

Você também pode gostar