1 Atributos e Métodos de Classe

Propaganda
Algoritmos e Programação II
Aula 5 – Atributos e Métodos de Carga
*Adaptado do material do Prof. Júlio Machado e Profa. Isabel Manssour
Atributos e Métodos de Classe
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
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
1
public class TestaMath {
public static void main(String args[]) {
System.out.println("PI = " + Math.PI);
System.out.println("E = " + Math.E);
}
}
Note que os atributos públicos não foram
acessados a partir de um objeto!
Os atributos foram acessados pelo nome da
classe
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>
Exemplo: classe Circulo
Nos métodos de cálculo da á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)
2
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);
}
...
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
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
3
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>)
Exemplo: classe Professor
Contador para o número de objetos instanciados
Método para saber o valor do contador
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);
}
}
Exemplo: Classe Professor
...
Professor p3 = new Professor("Fulano", 777, 12);
System.out.println("Total Objetos = " +
Professor.getTotalInstancias());
Professor p4 = new Professor("Beltrano", 888, 20);
System.out.println("Total Objetos = " + p4.getTotalInstancias());
...
4
Estudo de caso 1
A “famosa” aplicação “Alô Mundo”:
public class AloMundo {
public static void main(String args[]) {
System.out.println("Alo Mundo!");
}
}
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
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
5
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
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
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
6
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);
}
}
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)
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());
7
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
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
}
}
1) 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.
8
2) 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.
3) 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.
9
Download