Atributos e Métodos de Classe
César A. M. Marcon 2009/01
Atributos e Métodos de Classe 2
Java permite declarar duas categorias distintas de atributos e métodos
Atributos de instância Atributos de classe Métodos de instância Métodos de classe
Atributos e Métodos de Classe 3
Cada objeto de uma classe possui sua própria cópia de todos os atributos de instância da classe Em certos casos, entretanto, é interessante que apenas uma cópia de um atributo em particular seja compartilhada por todos os objetos de uma classe Exemplo: constantes da classe Math
As constantes matemáticas E e PI são armazenadas em uma única cópia e então compartilhadas
Atributos e Métodos de Classe 4
public class TestaMath { public static void main(String args[]) {
Math.PI); System.out.println("E = " + Math.E); System.out.println("PI = " + } }
Note que os atributos E e PI não foram acessados a partir de um objeto! Foram acessados pelo nome da classe
Atributos e Métodos de Classe 5
Atributos de Instância
Cada objeto possui uma cópia particular com seus valores Representam o estado de um objeto em particular
Atributos de Classe
Cada classe possui uma única cópia do atributo, independente do número de objetos instanciados a partir da classe Objetos compartilham os atributos de classe São declarados pela palavra-chave static Invocação: <nome_classe>.<nome_atributo_público>
Atributos e Métodos de Classe 6
Exemplo: classe Circulo
Nos métodos de cálculo de área e circunferência, percebe-se a presença de um valor importante em cálculos geométricos que se repete para todas as instâncias: constante PI Pode ser desejado manter somente uma cópia desse valor, com a aproximação desejada no número de suas casas decimais de uma forma consistente, impedindo que em um método seja utilizado o valor 3,14 e em outro 3,1415 PI será declarado como atributo de classe (static) e constante (final)
Atributos e Métodos de Classe 7
public class Circulo {
public static final double PI = 3.14; private int centrox; private int centroy; private int raio; ... public double area() { return (PI * raio * raio); } public double circunferencia() { return (2 * PI * raio); } ... }
Atributos e Métodos de Classe 8
Em muitos exemplos de classes pode-se notar alguns métodos que não acessam nenhum atributo de uma instância Exemplo: funções trigonométricas da classe Math
Os métodos sin, cos e tan recebem o valor do ângulo (em radianos) por parâmetro e devolvem o seno, cosseno ou a tangente correspondente, calculados unicamente a partir do valor recebido
Atributos e Métodos de Classe 9
public class Trigonometria { public static void main(String args[]) { System.out.println("Seno(45) = " + Math.sin(Math.PI/4)); System.out.println("Cosseno(45) = " + Math.cos(Math.PI/4)); System.out.println("Tangente(45) = " + Math.tan(Math.PI/4)); } }
Note que os métodos de cálculo não são executados sobre um objeto! Os métodos são acessados pelo nome da classe
Atributos e Métodos de Classe 10
Métodos de Instância
Fornecem o comportamento dos objetos instanciados a partir de uma classe Trabalham sobre os atributos de um objeto dessa classe
Métodos de Classe
Fornecem um comportamento que é independente da existência de objetos de uma classe. Pertencem à classe e são compartilhados por todas as instâncias da classe. Trabalham sobre os atributos de classe. Indicados pela palavra-chave static. Invocação: <nome_classe>.<nome_método>(<parâmetros>)
Atributos e Métodos de Classe 11
Exemplo: classe Professor
Contador para o número de objetos instanciados Método para saber o valor do contador
Professor
public class Professor {
private static int contador=0; ... public Professor(String n, int m, int c) { setNome(n); setMatricula(m); setCargaHoraria(c); contador++; }
public static int getTotalInstancias() { return (contador); } }
-
nome: String matricula: int cargaHoraria: int contador: int
+ setNome (n: String) + getNome ( ): String + setMatricula (m: int) + getMatricula( ): int + setCargaHoraria (c: int) + getCargaHoraria( ): int +
Atributos e Métodos de Classe Professor
12
Exemplo: classe Professor
-
nome: String matricula: int cargaHoraria: int contador: int
+ setNome (n: String) + getNome ( ): String + setMatricula (m: int) + getMatricula( ): int + setCargaHoraria (c: int) + getCargaHoraria( ): ... int Professor p3 = new Professor("Fulano", 777, 12); System.out.println("Total Objetos = " + + Professor.getTotalInstancias()); getCargaHorariaMensal ( ): float Professor p4 = new Professor("Beltrano", 888, 20); + getTotalInstancias( ): System.out.println("Total Objetos = " + p4.getTotalInstancias()); int ...
Atributos e Métodos de Classe 13
Estudo de caso 1
A “famosa” aplicação “Alô Mundo”:
public class AloMundo { public static void main(String args[]) { System.out.println("Alo Mundo!"); } }
Atributos e Métodos de Classe 14
Estudo de caso 1
A classe AloMundo possui um método de classe, o método main
O método main é automaticamente invocado pela máquina virtual Java quando se executa a classe AloMundo Ele é um método de classe, pois não depende de nenhum objeto da classe AloMundo na qual ele está declarado
Atributos e Métodos de Classe 15
Estudo de caso 1
A classe AloMundo referencia também um atributo de classe
A construção System.out.println() é na verdade o atributo de classe out da classe System, o qual guarda uma instância da classe PrintStream que possui um método de instância chamado println
Atributos e Métodos de Classe 16
Estudo de caso 2
A classe Media é capaz de manter informações sobre um acumulador de valores inteiros, apresentando a funcionalidade de calcular a média, a qualquer momento, dos valores que foram adicionados ao acumulador Adicionalmente, a classe Media também é capaz de informar a média de todas as instâncias já criadas dessa classe
Atributos e Métodos de Classe 17
Estudo de caso 2
Atributos de instância:
acum guarda a soma de todos os valores adicionados ao acumulador qtd é um contador do número de valores adicionados ao acumulador
Métodos de instância:
somaAcum fornece a funcionalidade de adicionar um valor ao acumulador media é utilizado para calcular a média do acumulador
Atributos e Métodos de Classe 18
Estudo de caso 2
Atributos de classe:
acumGlobal guarda a soma de todos os valores adicionados a todos os acumuladores qtdGlobal guarda o número de valores adicionados a todos os contadores
Métodos de classe:
mediaGlobal é utilizado para calcular a média de todos os acumuladores
Atributos e Métodos de Classe 19
public class Media { private int acum,qtd; private static int acumGlobal,qtdGlobal; public int somaAcum(int a) { acum = acum + a; qtd++; acumGlobal = acumGlobal + a; qtdGlobal++; return(acum); } public double media() { return((double) acum/qtd); } public static double mediaGlobal() { if (qtdGlobal == 0) return 0; return((double) acumGlobal/qtdGlobal); } }
Atributos e Métodos de Classe 20
Estudo de caso 2
Note no exemplo, que um método de instância (somaAcum) pode acessar atributos de instância (acum, qtd) e atributos de classe (acumGlobal, qtdGlobal) Mas um método de classe (mediaGlobal) só pode acessar atributos de classe (acumGlobal, qtdGlobal)
Atributos e Métodos de Classe 21
public class TesteMedia { public static void main(String args[]) { Media var1 = new Media(); var1.somaAcum(1); var1.somaAcum(3); var1.somaAcum(5); System.out.println("Media da instancia var1: "+var1.media()); System.out.println("Media das instancias da classe Media: " + Media.mediaGlobal()); Media var2 = new Media(); var2.somaAcum(1); var2.somaAcum(1); System.out.println("Media da instancia var2: "+var2.media()); System.out.println("Media das instancias da classe Media: " + Media.mediaGlobal()); } }
Atributos e Métodos de Classe 22
Inicialização de atributos de classe
Convém destacar que a forma de inicialização dos atributos de classe é usualmente no momento de sua declaração, pois eles não pertencem às instâncias e portanto não dependem do construtor para serem inicializados
Se a inicialização com valores padrão for suficiente, não é necessário inicializar o atributo explicitamente
Atributos e Métodos de Classe 23
Para inicializar atributos de classe que necessitam de uma forma mais complexa, Java fornece um bloco de inicialização estático
Não possui nome e não possui tipo de retorno Começa pela palavra-chave static, seguido de um bloco de código entre parênteses Executa somente uma vez quando a classe é carregada em memória
public class UmaClasse { ... public static int atributo; static { //código para inicializar atributo } }
Exercícios 24
Utilizando a classe Ponto exemplificada em aulas anteriores, introduza um atributo de classe para contar o número de objetos criados. Acrescente também um método de classe para retornar o valor deste atributo. Depois implemente uma classe CriaInstancias que tenha o método main e dentro dele crie e inicialize um array de 10 pontos e depois apresente o conteúdo do atributo de classe
Exercícios 25
Acrescente à classe Ponto desenvolvida no exercício 1, um método para calcular a distância entre dois pontos recebidos como parâmetro (a fórmula é apresentada abaixo). Como tal método não utiliza nenhum atributo de classe, ele pode ser criado como um método de classe. Altere o método main da classe CriaInstancias para testar a utilização deste método
( x2 − x1 ) + ( y2 − y1 ) 2
2
Exercícios 26
Crie uma classe Funcionario para armazenar os seguintes dados de um funcionário: código, nome, RG, salário. Note que o código dos funcionários deve ser criado automaticamente. Agora implemente uma classe Cadastro que possua um ArrayList de funcionários e métodos para incluir, excluir e consultar dados de funcionários. Teste a utilização destas classes criando uma classe que implemente o método main e crie um cadastro de funcionários