Baixe o app para aproveitar ainda mais
Prévia do material em texto
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)
Compartilhar