Você está na página 1de 4

Variveis e Atributos Estticos e de Instncia em Java- por Jorge Fernandes - Pgina 1

Variveis e Atributos Estticos e de Instncia em Java


por Jorge Fernandes (jorge@dimap.ufrn.br)
Agosto de 2002 Este seo descreve as diferenas entre variveis locais, atributos estticos e no estticos.

Classe Produto
O trecho de cdigo abaixo apresenta uma primeira verso da classe Produto, que representa informaes sobre um produto qualquer de um software.
class Produto { String nome; int preco; }

Quantos atributos no estticos so declaradas na classe Produto? Quais so eles? Definida a classe Produto, podemos criar um objeto desta classe atravs da expresso new Produto(). No trecho de cdigo abaixo se v a criao de um produto e atribuio 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 variveis esto declaradas no escopo do mtodo TesteProduto_1.main(String[] args)? Quais so elas? Quantos objetos so criados durante a execuo do mtodo acima? Quais os tipos deles? Veja o exemplo abaixo. Perceba que a varivel preco declarada dentro do mtodo main no 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)

Variveis e Atributos Estticos e de Instncia em Java - por Jorge Fernandes - Pgina 2


} }

Qual o valor do atributo preco do objeto referenciado pela varivel p1? Em outras palavras, qual o preco do (objeto de nome) "Pao"? Qual o preo do "Cuscuz"? Qual o valor da varivel preco declarada no mtodo main, ao final da execuo do mtodo? Suponha agora que desejamos atribuir um cdigo nico para cada (objeto da classe) Produto criado pelo programa. Uma soluo declarar um atributo esttico dentro da classe Produto, que contm um inteiro cuja finalidade indicar o cdigo do prximo produto a ser criado. Durante a criao de cada produto este inteiro ser usado para indicar o cdigo do produto e ser incrementado imediatamente aps a criao do objeto. Os trechos de cdigo 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 cdigo acima oferece uma soluo para a criao automtica de cdigos mas introduz possveis pontos de falha no sistema, pois a varivel (atributo esttico) Produto.codigoProxProduto uma varivel global, que pode ser alterada arbitrariamente a partir de qualquer parte do programa. Qual o cdigo do "Pao", criado no mtodo acima? qual o cdigo do "Cuscuz" criado no mtodo acima? Uma soluo refinada para o problema declarar a varivel Produto.codigoProxProduto como privada, o que impede que qualquer cdigo 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)

Variveis e Atributos Estticos e de Instncia em Java - por Jorge Fernandes - Pgina 3


private static int codigoProxProduto; }

A mudana acima inviabiliza imediatamente a execuo do mtodo TesteProduto_3.main(). O problema que conceitualmente a informao sobre como atribuir o cdigo nico do produto deve ser implementada no escopo da classe Produto. A declarao de um mtodo construtor para a classe produto permite que possamos atribuir automaticamente um cdigo ao produto, no momento de sua criao. A classe Produto e o mtodo 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 cdigo do "Pao", criado no mtodo acima? qual o cdigo do "Cuscuz" criado no mtodo acima?

Construtores mais complexos


A linguagem Java aceita a sobrecarga de mtodos, isto , mtodos com mesmo nome podem ser definidos, bastando que tenham diferena quantos aos argumentos que recebem. Neste caso, possvel definirmos um novo mtodo construtor para produto, que j recebe, no momento da criao 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 declarao 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 mtodo no recebe nenhum parmetro. Para ilustrar mais ainda o uso de this como uma referncia ao mtodo construtor, definimos um terceiro construtor de produto, que recebe apenas o nome do produto e o cria com preo 0. A verso final da classe Produto e de um mtodo que usa os servios 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)

Variveis e Atributos Estticos e de Instncia em Java - por Jorge Fernandes - Pgina 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 preo da "Revista", criada no mtodo acima? Qual o cdigo do "Leite" criado no mtodo acima? Qual o cdigo do "Cuscuz" criado no mtodo acima?

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

Você também pode gostar