Programação Orientada a Objetos
(DPADF 0063)
Aula 3 – Abstração
Universidade Federal de Santa Maria
Colégio Agrícola de Frederico Westphalen
Curso Superior de Tecnologia em Sistemas para Internet
Prof. Bruno B. Boniati – www.cafw.ufsm.br/~bruno
Classes x Objetos
Abstração
• Habilidade de generalizar, ou seja de se
concentrar nos aspectos realmente importantes
de um conceito ou fenômeno, ignorando
características menos importantes ou
acidentais;
• Na POO, uma classe é uma abstração de
entidades existentes no domínio do sistema de
software;
O que é uma classe
• A classe é a unidade básica de trabalho em um
programa orientado a objetos;
• A maior parte do trabalho em POO consiste em
modelar classes;
• Representa um modelo abstrato a partir do
qual são criadas instâncias;
O que um objeto
• Objeto é uma instância da classe;
• É uma representação real da classe que ocupa
espaço na memória e consome recursos do
computador;
• A classe é a descrição de um tipo de objeto;
• Objeto está para classe da mesma forma que
variável está para tipo de dado.
Atributos & Métodos
• A classe é uma coleção de dados (atributos) e
operações (métodos) que manipulam tais dados
▫ Atributos
 São os dados (simples ou compostos) que caracterizam os
objetos daquela classe;
 São armazenadas em variáveis;
 Constituem o estado do objeto.
▫ Operações
 São os métodos (procedimentos ou funções) que manipulam
os dados;
Uma classe em Java ...
class Hora {
private int hora;
private int minuto;
private int segundo;
public
public
public
public
void
void
void
void
setHorario(int h, int m, int s) {...}
setHora(int h) {...}
setMinutos(int m) {...}
setSegundos(int s) {...}
Arquivo Hora.java
(Após a compilação dará
origem ao arquivo Hora.class)
public String getHorario() {...}
}
• Inicia com a palavra reservada class;
• Convenciona-se utilizar o nome da classe com a 1ª letra em maiúscula;
• Uma “{“ (abre chave) marca o início e “}” (fecha chave) marca o fim da
classe;
• Normalmente cada classe é salva como um arquivo de mesmo nome da
classe com extensão .java;
Uma classe em Java ... (cont.)
public class Hora {
private int hora;
private int minuto;
private int segundo;
public
public
public
public
public
public
Atributos (Variáveis de Instância)
void setHorario(int h, int m, int s) {...}
void setHora(int h) {...}
void setMinutos(int m) {...}
void setSegundos(int s) {...}
void setHoraAtual() {...}
String getHorario() {...}
Operações
(Métodos de Instância)
}
• Atributos e métodos iniciam pelo modificador de acesso
• Atributos obrigatoriamente possuem um tipo;
• Métodos devem indicar o tipo de retorno ou void quando não
retornam nada;
• Métodos podem receber argumentos (parâmetros) mas sempre
terminam com “(“ e “)” mesmo que não os tenham.
Modificadores de acesso
(definem o escopo/visibilidade de um método/atributo)
• public
▫ Simbolizado por “+”
▫ Indica que o atributo/método pode ser acessado por objetos de outras
classes;
• private
▫ Simbolizado por “-”
▫ Protege o atributo do acesso externo, permitindo ao mesmo ser
acessado somente por métodos daquela classe e pelo objeto
instanciado;
• protected
▫ Simbolizado por “#”
▫ Permite o acesso a objetos de classes filhas mas protege do acesso de
objetos que não fazem parte da hierarquia de classes;
Método main(String [] args)
• Permite que uma classe seja executada
(normalmente pelo menos uma das classes da
aplicação precisa ser executada);
• Quando uma aplicação java é iniciada, a JVM
localiza e chama o método main() que
recebe por parâmetro um vetor de objetos
String representando os parâmetros de linha de
comando;
Um objeto em Java
• Precisa ser identificado enquanto entidade do
código (uma variável, um elemento em uma lista,
uma posição de um vetor, etc.);
• O operador new ...
▫ Aloca memória para o novo objeto (a quantidade
necessária é obtida a partir da definição da classe);
▫ Chama o construtor da classe para inicializar o estado
do novo objeto;
▫ Retorna uma referência (um endereço de memória
para o objeto recém criado);
Um objeto em Java ... (cont.)
public class Aplicacao {
public static void main(String[] args) {
Hora horaDoAlmoco;
horaDoAlmoco = new Hora();
horaDoAlmoco.setHorario(12,30,00);
Hora horaAtual = new Hora();
horaAtual.setHoraAtual();
}
}
• Métodos são acessados através do operador “.” (ponto),
precedido pelo nome do objeto (variável) e seguido do
nome do método;
Referência null
• Valor default para inicialização de atributos de
tipos não primitivos;
• Indica que determinado atributo/variável de
referência não se refere a nenhum objeto;
Atribuição de referências
public class Aplicacao {
Referências
horaDoAlmoco
public static void main(String[] args) {
horaAtual
Hora horaDoAlmoco;
horaDoAlmoco = new Hora();
horaDoAlmoco.setHorario(12,30,0);
Hora horaAtual = new Hora();
horaAtual.setHoraAtual();
horaAtual = horaDoAlmoco;
}
}
h = 12
m = 30
s = 0
Instância
• Quando atribuímos uma referência para um objeto para outra
referência, temos ao final duas referências para um único objeto e
não uma cópia do objeto (como seria com tipos primitivos)
Métodos Construtores
• Método especial chamado automaticamente pelo
ambiente de execução quando um objeto é
criado;
• SEMPRE tem o mesmo nome da classe e pode
opcionalmente receber parâmetros;
• Nunca pode ter um tipo de retorno (isso é
implícito pois ele retorna uma referência para um
objeto da classe em questão).
Métodos construtores
public class Hora {
private int hora;
private int minuto;
private int segundo;
public Hora(int h, int m, int s) {
setHorario(h, m, s);
}
public Hora(int h) {
setHorario(h, 0, 0);
}
public
public
public
public
public
public
}
Métodos construtores
(com assinaturas diferentes)
void setHorario(int h, int m, int s) {...}
void setHora(int h) {...}
void setMinutos(int m) {...}
void setSegundos(int s) {...}
void setHoraAtual() {...}
String getHorario() {...}
Referência this
• Todos os métodos de instância recebem um parâmetro
implícito chamado this que pode ser utilizado dentro do
método de instância para se referir ao objeto corrente
(cujo método foi invocado);
• É normalmente utilizado em duas situações:
▫ Quando o nome de uma variável de instância é igual
ao nome de um parâmetro do método;
▫ Quando o método precisa chamar outro método
passando por parâmetro uma referência ao objeto
atual.
Referência this
public class Hora {
private int hora;
private int minuto;
private int segundo;
public Hora(int h, int m, int s) {
setHorario(h, m, s);
}
public Hora(int h) {
setHorario(h, 0, 0);
}
public void setHorario(int hora, int minuto, int segundo) {
this.hora = hora;
this.minuto = minuto;
this.segundo = segundo;
}
}
Neste caso this resolve a
ambiguidade de nomes
(parâmetros x atributos)
Variáveis de Classe
• Também conhecida por variável estática (static);
• É uma variável comum a todas as instâncias da
classe;
• Há somente uma instância de uma variável de
classe, não importa quantas instâncias da classe
existam;
• Não é recomendado que seus valores sejam
alimentados por métodos construtores e sim
através de inicializadores com valores default.
Variáveis de Classe
public class Hora {
private int hora;
private int minuto;
private int segundo;
Variável de classe
static int fusoHorario;
public Hora(int h, int m, int s) {
setHorario(h, m, s);
}
public Hora(int h) {
setHorario(h, 0, 0);
}
static {
fusoHorario = - 3;
}
}
É possível definir um bloco inicializador
estático que não possui nome nem valor
de retorno e começa com a palavra static.
Ele funciona de maneira similar a um
construtor porém é executado apenas
uma vez, quando o primeiro objeto
daquela classe for instanciado.
Métodos de Classe
• Não necessitam de uma instância da classe
para que sejam invocados;
• São definidos com o uso da palavra reservada
static.
• Alguns exemplos (classe Math)
▫ Math.sqrt(double a) retorna a raiz quadrada de “a”.
▫ Math.abs(int a) retorna o valor absoluto de “a”.
▫ Math.random() retorna um valor randômico entre zero e um.
Métodos de Classe
public class Hora {
private int hora;
private int minuto;
private int segundo;
static int fusoHorario;
public static int diferencaEmMinutos(Hora a, Hora b) {
int diferenca;
...
return diferenca;
}
}
Método de classe
(Pode ser invocado diretamente
pela classe, sem a necessidade
de uma instância – objeto)
Sobrecarga de Métodos
• Métodos de mesmo nome com assinaturas diferentes
(tipos de argumentos/parâmetros diferentes);
▫ Valor de retorno não é considerado parte da assinatura;
• Métodos sobrecarregados são resolvidos em tempo de
compilação;
public class Hora {
private int hora;
private int minuto;
private int segundo;
public void ajustarHorario(int hora, int minuto, int segundo);
Estes dois métodos não tem
assinaturas diferentes isso
não é permitido
public void ajustarHorario(int hora, int minuto);
public void ajustarHorario(int minuto, int segundo);
public void ajustarHorario(int hora);
}
Atributos final
• O modificador final indica que o atributo não poderá
sofrer alteração em seu valor;
• Possui o mesmo comportamento de uma constante que
deve ser inicializada;
• Em geral possui um escopo púbico permitindo seu
acesso externo;
• O atributo PI da classe Math é um exemplo de atributo
final (que retorna a constante π);
Método finalize
• Java não implementa o conceito de “destrutores”
(métodos invocados para destruir a instância e liberar
seus recursos);
▫ Para isso há o conceito de “coletor de lixo”
• Contudo, há situações onde é interessante que ao
destruir o objeto, outros recursos, que não a memória,
venham a ser liberados.
• Neste caso pode-se definir um método de nome
finalize e retorno void que será chamado antes do
coletor de lixo eliminar o objeto;
Classe String
Classe String
• Uma String em Java não são é um tipo primitivo
e sim objetos de uma classe com algumas
características especiais;
• Valores literais entre aspas duplas são
transformados pelo compilador Java em objetos
da classe String;
Classe String (cont.)
• A classe String representa uma string imutável,
ou seja, uma vez criado um objeto String ele
não poderá mais ser alterado;
• O operador “+” é utilizado como uma das formas
de concatenar strings;
• Tipos primitivos são automaticamente
convertidos para Strings em concatenações;
Classe String ... exemplos
String nome;
nome = “Testando”;
nome = “Testando” + “ “ + “Java”;
int dez = 10;
nome = nome + “ “ + dez;
Nome = “ Teste “.concat(“Java”);
Classe String ... mais exemplos
String s = “Testando”;
System.out.println(s.length()); // 8
System.out.println(s.charAt(2)); // s
System.out.println(s.substring(2,4)); // st
System.out.println(s.toUpperCase()); // TESTANDO
System.out.println(s.toLowerCase()); // testando
System.out.println(s.trim()); // Testando
s = “Fábrica de brinquedos”;
System.out.println(s.indexOf(“br”)); //2
System.out.println(s.lastIndexOf(“br”)); //11
System.out.println(s.equals(“br”)); //false
System.out.println(s.equalsIgnoreCase(“br”)); //false
Classes Wrappers
• Para cada tipo primitivo, Java fornece uma
classe invólucro (wrapper) correspondente.
• Classes Wrappers permitem que um tipo
primitivo seja manipulado como se fosse um
objeto;
• Cada classe wrapper fornece um método
estático para conversão de Strings para o tipo
primitivo correspondente.
Classes Wrappers
Grupo
Tipo Primitivo
Classe Wrapper
Lógico
boolean
Boolean
Caractere
char
Caracter
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
Inteiros
Ponto Flutuante
Conversão
(String x Classes Wrapper)
Origem
Destino
Método
boolean, char, byte,
short, int, long,
double, float
String
String.valueOf( ? )
String
int
Integer.parseInt( ? )
String
float
Float.parseFloat( ? )
Variáveis multidimensionais
Variáveis multidimensionais
• Vetor é uma coleção de objetos do mesmo tipo;
• Cada elemento pode armazenar um único
item. Os itens podem ser
▫ Tipos primitivos;
▫ Referências para objetos.
• Quando o vetor é criado seu tamanho é fixado;
• A primeira posição do vetor é a posição 0 (zero);
• O tamanho do vetor não precisa ser uma constante,
pode ser uma variável definida em tempo de execução;
Variáveis multidimensionais (cont.)
• Um vetor precisa ser declarado, criado e somente
depois acessado;
• Existem formas equivalentes de se declarar um vetor:
int[] numeros; //Declaração
int numeros[]; //Declaração
numeros = new int[4]; //Criação
numeros[0] = 10; //Acesso
//Abaixo ñ se utiliza o operador new e o tamanho é
detectado automaticamente
int[] diasMes = {31,28,31,30,31,30,31,31,30,31,30,31};
int num = diasMes.length(); //12
Exercícios para fixação
Classe Hora
• Para finalizar a implementação da classe Hora,
codifique o que se pede:
▫ Um novo método construtor que recebe um valor em minutos
transcorridos e inicializa os atributos hora e minutos;
▫ Três novos métodos para validar os valores informados nos
atributos hora, minutos e segundos (considerando o conjunto de
valores válidos);
▫ Um método estático para indicar a diferença em minutos entre
duas horas passadas por parâmetro;
▫ Um método para escrever a hora em formado hh:mm:ss
Download

Abstração (Classes x Objetos) - Colégio Agrícola de Frederico