Algoritmos e Programação 2 Objetos e Classes em Java Classes

Propaganda
Algoritmos e Programação 2
Baseado no material do Prof. Júlio Machado
Objetos e Classes em Java
Revisão
– Classes: encapsulam dados (atributos) e
operações sobre os dados (métodos)
– Objetos: instâncias de classes, têm estado
(definido pelos atributos) e comportamento
(definido pelos métodos)
Classes
Definições de classes incluem
(geralmente):
– modificador de acesso
– palavra-chave class
– nome da classe
– atributos de instância
– métodos de instância
1
Modificadores de acesso
– Permitem definir o encapsulamento de
atributos e métodos
– Dois modificadores principais:
• private: visível apenas na classe atual
• public: visível para qualquer classe externa
Recomendações
– A menos que hajam razões fortes, os atributos de
uma classe devem ser definidos como private
(encapsulamento) e os métodos que são
chamados de fora da classe devem ser public
(interface de acesso).
– Métodos que devem ser usados somente dentro
da própria classe, devem ser especificados como
private.
Encapsulamento
Objetivo:
– Esconder como as coisas funcionam por
trás de uma interface de acesso.
Implementado através dos
modificadores de acesso.
2
Métodos get
– Retornam o valor dos atributos de um
objeto, uma vez que não é possível acessálos diretamente.
Métodos set
– Permitem alterar o valor de um atributo.
– Estes métodos são chamados por alguns
autores de transformadores.
Exemplo: classe Professor
public class Professor
{
private String nome;
private int matricula;
private int cargaHoraria;
private double salarioHora;
...
}
Atributos estão encapsulados!!!
Apenas métodos da própria classe
Professor podem acessar os atributos.
Métodos:
...
public void setNome(String n) {
nome = n;
}
public String getNome() {
return nome;
}
public void setMatricula(int m) {
matricula = n;
}
public int getMatricula() {
return matricula;
}
...
3
...
public void setCargaHoraria(int c) {
cargaHoraria = c;
}
public int getCargaHoraria() {
return cargaHoraria;
}
public void setSalarioHora(double s) {
salarioHora = s;
}
public double getSalarioHora() {
return salarioHora;
}
public double getSalario() {
return salarioHora * cargaHoraria;
}
}
Notação Gráfica
Para melhor visualizar e entender as
classes.
– Representação das classes
– Relacionamento entre as classes
Exemplos: Booch, OMT, UML (Unified
Modeling Language)
Padrão Atual
(mais moderna,
mais usada)
Notação UML
– Classe: retângulo dividido em três
partes
• primeira parte: nome da classe
• segunda parte: atributos
• terceira parte: métodos
– Atributos e métodos
• private: • public: +
Professor
- nome: String
- matricula: int
- cargaHoraria: int
- salarioHora: double
+ setNome (n: String)
+ getNome ( ): String
+ setMatricula (m: int)
+ getMatricula( ): int
+ setCargaHoraria (c: int)
+ getCargaHoraria( ): int
+ setSalarioHora(s: double)
+ getSalarioHora( ): double
+ getSalario( ): double
4
Instanciação
– Um objeto depois de criado, conterá todos
os atributos e métodos descritos em sua
classe.
– Para instanciar um objeto em Java
utilizamos o operador new.
– Ex.:
Professor prof1;
prof1 = new Professor();
prof1
NULL
prof1
prof1
Professor prof1;
prof1 = new Professor();
prof1 = null; // coletor de lixo
NULL
prof1
prof1:Professor
nome=null
matricula=0
cargaHoraria=0
salarioHora=0.0
prof1
nome=null
matricula=0
cargaHoraria=0
salarioHora=0.0
Para “matar” um objeto em Java se
utiliza null
– Exemplo:
prof1:Professor
NULL
Quando o operador new é usado é
“alocada” memória.
Quando um objeto não é mais
necessário, devolve-se o(s) recurso(s)
para o sistema.
Java realiza a coleta de lixo automática
da memória (garbage collector).
Quando um objeto não é mais utilizado,
ele é marcado para coleta de lixo.
5
Como executar um programa em Java?
– Um programa é composto de várias
classes e objetos.
– Como indicar por onde o programa
começa?
– Em Java temos um método especial que o
interpretador assume como o início do
programa: main.
• public static void main (String args[ ])
public static void main (String
args[]){
Professor prof1;
prof1 = new Professor();
prof1.setNome(“Júlio”);
prof1.setMatricula(1234);
prof1.setCargaHoraria(14);
System.out.println(prof1.getCa
rgaHoraria());
}
Escopo de Variáveis
O escopo de uma variável informa onde
ela pode ser utilizada.
Ex.:
1: public class VerificaEscopo{
2: private int escopoA;
3: public void metodo(int escopoB){
4:
int escopoC;
5: }
6: }
6
– escopoA é atributo da classe e seu escopo
vale em qualquer lugar a partir da linha 1
– escopoB e escopoC são variáveis locais
cujo escopo é válido somente dentro do
método
Inicialização de Variáveis
Atributos de uma classe são
inicializados com valores padrão:
– 0 -> byte, short, int, long
– 0.0 -> float, double
– false -> boolean
– \u0000 -> char
– null -> Object
Variáveis locais declaradas dentro de
métodos devem obrigatoriamente
serem inicializadas.
– O compilador Java irá indicar se não
inicializarmos as variáveis.
Ex.:
class Aluguel {
private int numero;
public void adicItem(){
float itemCusto;
int numDias;
System.out.println("Numero="+numero); //OK
System.out.println("ItemCusto="+itemCusto); //Erro
}
}
7
Referências
Quando criamos um objeto em Java,
mantemos uma referência para o objeto
na memória.
Ex.:
Professor prof1, prof2;
prof1 = new Professor();...
prof2 = new Professor();...
prof1:Professor
prof1
nome="Júlio"
matricula=123
cargaHoraria=14
salarioHora=21.5
prof2:Professor
prof2
nome="Isabel"
matricula=321
cargaHoraria=40
salarioHora=21.5
Ao atribuir prof1 ou prof2 a uma terceira
variável, o que irá acontecer?
Ex.:
Professor prof1, prof2, prof3;
prof1 = new Professor();...
prof2 = new Professor();...
prof3 = prof1;
prof1:Professor
prof1
prof3
nome="Júlio"
matricula=123
cargaHoraria=14
salarioHora=21.5
prof2:Professor
prof2
nome="Isabel"
matricula=321
cargaHoraria=40
salarioHora=21.5
Se alteramos algum atributo do objeto
referenciado por prof3, estaremos
alterando também o referenciado por
prof1!
Ex.:
Professor prof1, prof2, prof3;
prof1 = new Professor();...
prof2 = new Professor();...
prof3 = prof1;
prof3.setCargaHoraria(12);
prof1
prof3
prof1:Professor
nome="Júlio"
matricula=123
cargaHoraria=12
salarioHora=21.5
8
Exercícios
1) Escreva um método para a classe
Professor que imprima todos os dados
de um determinado professor.
– Nome: Maria
Matrícula: 234
Carga Horária: 8
Salário/Hora: 20.00
Salário: 160.00
2) Escreva uma classe Contador, que
apresente métodos para informar o
valor inicial, incrementar, decrementar e
exibir o valor atual na tela.
3) Exemplifique a utilização desta classe
criando uma aplicação que crie vários
contadores e use os métodos definidos.
– Por exemplo, crie 3 contadores e chame
alguns métodos para
incrementar/decrementar o contador. No
final, exiba o valor de cada contador.
Inicialização de Objetos
Objetos:
– Estado: definido pelos atributos declarados
na classe
– Comportamento: definido pelos métodos
declarados na classe
Quais valores os atributos do objeto
possuem após a sua instanciação?
Como definir o estado inicial do objeto?
9
Exemplo: classe Circulo
public class Circulo {
private int centrox;
private int centroy;
private int raio;
public double area(){
return (3.14 * raio * raio);
}
public double circunferencia(){
return (2 * 3.14 * raio);
Circulo
}
-centrox:int
public int diametro(){
-centroy:int
-raio:int
return (2 * raio);
+area():double
+circunferencia():double
+diametro():int
}
}
Circulo circ = new Circulo();
circ:Circulo
circ:Circulo
centrox=???
centroy=???
raio=???
centrox=0
centroy=0
raio=0
Inicialização padrão de atributos:
–
–
–
–
–
byte, short, int, long: 0
float, double: 0.0
char: \u0000
boolean: false
Object: null
Da forma como foi apresentada a
classe Circulo, todos os objetos criados
a partir dela terão seus atributos
inicializados com valores padrão iguais
a zero.
Como permitir que instâncias da classe
Circulo possuam estados diferentes?
10
Construtores
O construtor é um código especial
responsável pela inicialização dos
atributos de instância de um objeto de
uma determinada classe.
Um construtor em Java:
– Possui o mesmo nome da classe
(respeitando maiúsculas e minúsculas);
– Pode possuir ou não parâmetros;
– Não possui um tipo de retorno, nem mesmo
void.
<modificador_de_acesso> <nome_classe>(<parâmetros>)
{
//corpo do construtor
}
Exemplo: classe Circulo
public class Circulo {
private int centrox;
private int centroy;
private int raio;
public Circulo(int x, int y, int r){
if (x >= 0) centrox = x;
else centrox = 0;
if (y >= 0) centroy = y;
else centroy = 0;
Circulo
if (r > 0) raio = r;
-centrox:int
else raio = 1;
-centroy:int
}
-raio:int
...
+Circulo(x:int, y:int, r:int)
}
+area():double
+circunferencia():double
+diametro():int
11
Circulo circ = new Circulo(5,1,1);
circ:Circulo
circ:Circulo
centrox=???
centroy=???
raio=???
centrox=5
centroy=1
raio=1
Quando um objeto é instanciado:
– Operador new aloca a memória
necessária;
– Construtor é invocado automaticamente
para inicializar os atributos do objeto.
Construtor Default
Se nenhum construtor é definido para
uma determinada classe, Java irá
definir um construtor padrão (chamado
construtor default)
– Não possui argumentos de entrada e não
faz nada.
– Foi o construtor utilizado até agora!
– Caso qualquer construtor seja definido na
classe, Java não irá disponibilizar o
construtor default.
Exemplo: classe Circulo
Circulo
-centrox:int
-centroy:int
-raio:int
+Circulo(x:int, y:int, r:int)
+area():double
+circunferencia():double
+diametro():int
Circulo circ = new Circulo(); Inválido
Circulo circ = new Circulo(1,1,1); Válido
12
Exercícios
1) Adicione os seguintes comportamentos à
classe Circulo:
- mover um circulo para qualquer posição;
- aumentar o tamanho de um círculo em uma
unidade;
- diminuir o tamanho de um círculo em uma
unidade;
- informar uma representação textual do círculo,
contendo seu ponto central e raio;
2) Defina novos construtores para a
classe Circulo com as seguintes
características:
- receba como parâmetros o ponto X e Y
para o centro; para o raio utilizar o valor
padrão 1
- receba como parâmetro o raio; para o
ponto X e Y utilizar o valor padrão 0
- receba como parâmetro um outro
círculo, gerando uma cópia do mesmo
3) Reimplemente a classe Professor
desenvolvida anteriormente para incluir
a inicialização de objetos via
construtores.
13
4) Suponha que uma casa é formada por 3 peças: uma
cozinha circular, uma sala retangular e um banheiro
quadrado. Vamos implementar um programa que
permita definir as dimensões das peças da casa e
calcular sua área. Para tanto implemente as
seguintes classes:
- classe Cozinha: um método que calcula a área da
cozinha, e os atributos e demais métodos
necessários para isto;
- classe Sala: um método para cálculo da área, e os
atributos e demais métodos necessários para tanto;
- classe Banheiro: idem.
- classe Casa: que tenha 3 atributos (para as três
peças da casa), um método para calcular a área da
casa, e os atributos e demais métodos necessários.
- uma aplicação (uma classe com o método main() )
que instancie 3 casas, calcule e exiba suas áreas.
14
Download