Title: Introdu
1Introdução ao uso de classes Prof. Ricardo Linden
2Voltando ao passado...
- Vamos rever os conceitos de orientação a objetos,
de forma genérica, mas nos preparando para
implementá-los em Java. - Seria interessante ler o capítulo 4 do livro
texto - Core Java 2 - V.1 - Fundamentos
- Cornell, Gary Horstmann, Cay
- Ed. Makron Books
3Programação Orientada a Objetos
- A POO surgiu a partir da idéia de identificar
dentro de um problema as suas partes componentes,
que seriam os objetos. - Cada objeto realiza uma série de atividades e
expõe para o mundo somente uma pequena interface. - Isto quer dizer que o objeto é uma abstração de
um determinado processo/entidade.
4Abstração
- Abstração é o termos que descreve escolher o que
é importante sobre nossos objetos quando temos o
objetivo de resolver um determinado problema. - É o processo de descrever as características
essenciais de um objeto no mundo - A cor de um carro não é importante quando estamos
desenvolvendo um modelo de direção - Entretanto, a cor é extremamente importante
quando estamos determinando um modelo de
fabricação.
5Definição Formal
Abstração
Uma abstração descreve as características
essenciais de um objeto aquelas que o distinguem
de todos os outros tipos de objeto e fornece
assim para aquele que analisa um sistema
fronteiras conceituais bem definidas. --Booch,
1994
Isto é a abstração descreve o que nós pensamos
que é importante em um objeto, os aspectos que
nos fazem incluí-lo em nossos sistemas.
6Classes
- Uma classe é um conjunto de objetos que possuem
uma estrutura e um comportamento em comum. - --Booch 1994
- Lula, Fernando Henrique, Itamar e Collor são
todos membros da mesma classe - Todas as TVs Sony XPD-4582 TVs são da mesma
classe
7Classes
- Será que Lula e Fernando Henrique são da mesma
classe? - Se a abstração em que estamos pensando é
presidentes da república então sim. - Se a abstração em que estamos pensando diferencia
entre presidentes de partidos distintos, então
não. - O processo de abstração define se o que é uma
classe e que objetos fazem parte dela.
8Classe
- A classe de um objeto também é chamada às vezes
de seu tipo. - Em Java, assim como em outras linguagens OO, uma
classe é um modelo que descreve o que os objetos
desta classe podem fazer. - Por exemplo, a classe TV informa quais estados um
objeto desta classe pode assumir e a que métodos
ele vai responder. - Cada instância de uma classe (objeto) possui suas
próprias cópias das variáveis de estado. - Exceto no caso das variáveis estáticas (membros
de classe)
9O que é um objeto?
- Um objeto no mundo - seja um carro, um avião ou
um computador, normalmente são coisas que
associamos a substantivos. - Não necessariamente associamos objetos a coisas
concretas. Outros objetos possíveis são conta
corrente, mensagem de e-mail, um pedido, uma
conexão telefônica, etc. - Para qualificar um objeto normalmente precisamos
de três coisas - Um estado
- Um comportamento
- Uma identidade
10Objetos
- O estado consiste do valor das propriedades de um
objeto - Um avião pode ter seus motores ligados ou
desligados, pode estar a uma determinada altura,
velocidade e direção, ter assentos ocupados, etc. - Uma conexão via internet pode estar ativa ou não,
ter mandado e recebido n bytes, estar
estabelecida a uma certa velocidade, com um certo
protocolo, etc.
11Classes e Objetos
- A classe é um molde que podemos usar para criar
novas isntâncias de objetos (como se fosse uma
receita ou uma planta). - A partir das receitas, podemos construir novos
porta-aviões, novas TVs, novos projetores, etc.
12Classes e Objetos
Receita
- Classe AircraftCarrier
- possui
- velocidade
- núm. de aviões
- leme
- pode
- setVelocidade
- setNumAvioes
- setLeme
Instâncias (Objetos)
Nimitz
Vinson
13Relacionamentos entre objetos
- Objetos podem ter três tipos de relacionamentos
- is-a ? relacionamento do tipo herança. Exemplo
cadeira is-a móvel. - has-a ? relacionamento em que um objeto contém
outro como parte de seus atributos. Exemplo
pedido has-a item. - uses-a ? relacionamento em que um objeto faz
uso de serviços providos por outra classe ou
objeto. Exemplo nossos programas até agora
uses-a classe JDOptionPane.
14Métodos
- Métodos podem ser pensados como sendo os verbos
associados aos nossos objetos - Um pedido pode ser enviado, cancelado,
atualizado, etc. - Uma conexão pode ser desfeita, desacelerada, etc.
- Um avião pode decolar, aterrisar, virar à
esquerda, etc. - Um método também pode ser pensado como uma forma
de alterar o estado de um objeto - Pressionar o botão de liga/desliga muda o estado
de uma TV. - Move o leme de um navio altera sua direção.The
Roosevelt has
15Métodos
- Métodos, em uma programação OO bem feita, são a
epiderme de um objeto - Para acessar ou alterar um estado dentro de um
objeto, precisamos usar um método
setResolução
Objeto Projetor
Força Resolução Brilho
setForça
setBrilho
16Encapsulamento
- Quando só podemos acessar o estado de um objeto
através de seus métodos, dizemos que estamos
usando encapsulamento. - Por que usar isto?
- Impede que outros atribuam valores inválidos para
o estado do objeto, como colocar uma resolução
inválida para o projetor ou tentar acelerar o
avião para uma velocidade que ele não alcança - Permite que alteremos as estruturas de dados
internas de um objeto sem afetar os outros
métodos que o acessam. Por exemplo, imagine que
500 objetos mudassem o valor do canal da TV e nós
mudássemos o seu armazenamento de um byte para
dois. - Isto também é chamado de information hiding
17Encapsulamento
- O encapsulamento é a base da boa programação
orientada a objetos. - Fazendo objetos bem encapsulados, nós garantimos
sua reusabilidade e a boa manutenibilidade de
todos nossos sistemas. - Muitos dirão que uma boa programação estruturada
também é bem encapsulada e também atinge os
objetivos de se fazer bons códigos. - Isto é verdade, mas a programação imperativa
fornece vários mecanismos para se burlar este
tipo de boa prática, especialmente quando falamos
de grandes projetos em que muitos programadores
estão envolvidos.
18Definição Formal
Encapsulamento
Encapsulamento é o processo de
compartimentalização dos elementos que constituem
a estrutura e o comportamento de um objeto,
servindo para separar a interface contratual da
sua implementação --Booch 1994
Isto é é a forma de garantir que podemos mudar a
vontade o funcionamento interno de um objeto sem
alterar sua face externa (interface com o mundo)
19Encapsulamento
- Um objeto encapsulado deve ser pensado como uma
caixa preta - Seus algoritmos internos são escondidos do
cliente (aquele que o usa), que apenas pode
invocar os métodos definidos na interface.
Métodos
Cliente
Dados
20Encapsulamento
Tendo em vista que nosso objetivo é sempre fazer
os melhores sistemas possíveis, nós vamos sempre
procurar criar classes e objetos que respeitem o
preceito básico do encapsulamento. Todos os
slides a seguir partem deste pressuposto!
21Abstração e Encapsulamento
- A abstração diz como um objeto deve se relacionar
com o mundo. - Uma boa abstação garante que nossas classes fazem
aquilo que é necessário para resolver o problema
que temos em mãos. - O Encapsulamento garante que o mundo não tem
nenhuma relação ou conhecimento do que acontece
dentro de um objeto. - Um bom encapsulamento garante que nosso código é
de boa qualidade e pode ser reutilizado.
22Quais Métodos?
- Como decidir quais métodos vamos colocar em uma
classe? - Os método definem o comportamento de um objeto,
isto é, o que ele é capaz de fazer. - Os métodos também representam a interface de um
objeto com o mundo, ou seja, o que o mundo pode
pedir ao objeto. - Por exemplo
- Uma conta bancária tem uma lista de coisas que
podem ser realizadas com ela, como abrir, fechar,
depositar, sacar, etc.
23Identidade
- Nem todos os objetos são iguais, mesmo que
pertençam a uma mesma classe - O retroprojetor que estamos usando não é o mesmo
que está sendo usado em outra turma, mesmo que
seja da mesma marca e modelo. - Minha conta bancária não é igual à do Bill Gates
24Identidade
Nimitz
Roosevelt
Vinson
25Definição Formal
Identidade
Identidade é a propriedade de um objeto que o
distingue de forma inequívoca de outro
objeto --Booch 1994
De forma geral objetos são identificados de forma
unívoca pelas suas variáveis de referência, que
são usualmente chamadas de seus
nomes Entretanto, cuidado ao chamar assim, pois
elas só se apontam para um objeto, não sendo
iguais a ele.
26Resumo de objetos
- Objetos possuem
- estados ? é um conjunto de características de
cada objeto. Mudar o estado de um objeto não
altera o estado de outro objeto. - comportamento ? define o que o objeto é capaz de
fazer - identidade ? é o que permite que nos
referenciemos separadamente a cada objeto. - Encapsulamento esconde do mundo como
implementamos o estado que é alterado pelo
comportamento que lhe apresentamos.
27Escrevendo as classes...
- Agora vamos começar a aplicar estes conceitos
dentro do Java. - Seria interessante ler o capítulo 4 do livro
texto - Core Java 2 - V.1 - Fundamentos
- Cornell, Gary Horstmann, Cay
- Ed. Makron Books
Não estou insistindo só por teimosia. Começar a
trabalhar com orientação a objetos não é fácil!
Os conceitos podem ser extremamente confusos à
primeira vista.
28Lembrando Classes
- São o elemento básico da programação orientada a
objeto, tanto em Java quanto em qualquer outra
LPOO. - A classe define as estruturas (variáveis de
instância) de um objeto e sua interface funcional
(métodos). - Uma classe é a planta/receita de um objeto
- É o modelo a partir do qual cada objeto é criado.
- Por exemplo, a classe String é usada para definir
objetos String - Cada objeto String contem caracteres específicos
(seu estado). - Cada objeto String pode realizar serviços (ter
comportamentos) tais como toUpperCase,length,
concant, etc.
29Lembrando Objetos
- Um objeto tem
- estado - características descritivas
(atributos) - comportamento - o que ele pode fazer ou o que
pode ser feito com ele (métodos) - Por exemplo, seja uma moeda que pode ser jogada
para cima de forma que resulte em cara ou
coroa - O estado é o último resultado
- O comportamento é o fato de poder ser jogada.
- Note que apenas o comportamento pode mudar o seu
estado!
30Classes
- Algumas classes, como a classe String já existem
dentro da biblioteca padrão de classes do Java. - Nós podemos querer escrever nossas próprias
clases para definir objetos específicos para
nossas necessidades. - Por exemplo, poderíamos querer escrever uma
classe que simule uma moeda. - A partir desta classe nós poderíamos criar muitos
objetos diferentes representando várias moedas
(mais ou menos como a casa da moeda, que faz um
molde e depois funde várias cópias).
31Classes
- Uma classe contém declarações de atributos e
declarações de métodos.
int x, y char ch
Declarações de atributos (dados)
Declarações de Método
32Classes
- Um dos atributos de uma classe pode ser um
objeto de outra classe
Declarações de atributos. Note que ambos são
objetos de outras classes
String s int a
- Isto representa um tipo relacionamento especial
chamado has-a (possui), que será discutido com
todo o cuidado mais adiante.
33Escrevendo métodos
- Uma declaração de método especifica o código que
será executado quando o método é invocado
(chamado) - Quando um método é invocado, o flxuo de controle
vai para dentro dele e executa seu código
(exatamente igual a um procedimento ou função em
linguagem imperativa) - Quando o método termina, o fluxo retorna para a
instrução seguinte àquela que chamou-o. - A invocação pode retornar um valor ou não,
dependendo de como o método foi definido.
34Fluxo de Controle em um Método
- O método chamado pode ser dentro da mesma classe.
- Neste caso, somente o nome do método é necessário.
myMétodo
compute
myMétodo()
35Fluxo de Controle em um Método
- O método chamado pode ser parte de outra classe
ou objeto. - Neste caso temos que qualificar o nome do método
chamado usando o nome do objeto que o possui e o
ponto (o chamado dot operator).
doIt
helpMe
main
helpMe()
obj.doIt()
36Declaração de Método
- Toda declaração de um método começa com o
cabeçalho do método
char calc (int num1, int num2, String message)
Nome do Método
Lista de parâmetros
Tipo de retorno
- A lista de parâmetros especifica o tipo e o nome
de cada parâmetro. - O nome de cada parâmetro na declaração do método
é chamado de argumento formal - Nenhuma diferença para funções em programação
imperativa.
37Declaração de Método
- O cabeçalho do método é seguido pelo corpo do
método
char calc (int num1, int num2, String message)
int sum num1 num2 char result
message.charAt (sum) return result
- sum e result são variáveis locais
- Elas são criadas cada vez que o método é chamado,
e são destruídas quando ele termina sua execução.
A expressão retornada deve ser consistente com o
tipo de retorno definido no cabeçalho.
38Statement return
- O tipo de retorno de um método indica o tipo do
valor que o método retorna para a instrução que o
chamou. - Um método que não retorna valor nenhum tem um
tipo de retorno void - O statement return especifica o valor que será
retornado. - A expressão deve ser conforme com o tipo definido
no cabeçalho.
39Retornando objetos
- Um método pode retornar qualquer tipo de dados,
incluindo de classes que sejam criados por nós. - Dado que todos os objetos são alocados
dinamicamente usando o new, um objeto continua a
existir mesmo quando o método no qual ele foi
criado termina. - Quem morre ao fim do escopo é a variável de
referência. - O objeto só vai morrer quando ninguém mais faz
referência a ele (automatic garbage collection).
40Parâmetros
- Cada vez que um método é chamado, os argumentos
reais na chamada são copiados para os argumentos
formais
ch obj.calc (25, count, "Hello")
41Escrevendo classes
- Às vezes um objeto deve interagir com outros
objetos do mesmo tipo. - Por exemplo, quando queremos comparar duas
strings, nós fazemos o seguinte - if s1.equals(s2)
- Um objeto (s1) executa o método e o outro (s2) é
passado como parâmetro
42Exemplo de Classe
- public class Moeda
- public final int HEADS 0
- public final int TAILS 1
- private int face
- public Moeda () flip()
- public void flip() face (int)
(Math.random() 2) - public int getFace() return face
- public String toString()
- String faceName
- if (face HEADS) faceName "Heads"
- else faceName "Tails"
- return faceName
-
-
43Sobrecarga de Métodos
- A sobrecarga de métodos é o processo de usar o
mesmo nome de método em vários métodos
diferentes. - A assinatura de cada versão do método
sobrecarregado deve ser única. - A assianatura inclui o número, o tipo e a ordem
dos parâmetros, mas não o tipo de retorno. - O compilador deve ser capaz de determinar qual
versão do métdo será chamada apenas analisando os
parâmetros que lhe são passados
44Sobrecarga de Métodos
45Sobrecarga de Métodos
- Um método que usamos sempre, o println é
sobrecarregado - println (String s)
- println (int i)
- println (double d)
- etc.
- As linhas a seguir chamam as diferentes versões
do método println - System.out.println ("The total is")
- System.out.println (total)
46Sobrecarga de Métodos
- Construtores também podem ser sobrecarregados.
- Um construtor sobrecarregado permite que tenhamos
várias maneiras de inicializar um objeto de
acordo com o contexto. - Como em todos os métodos, a assinatura de cada
construtor deve ser distinta de todos os outros.
47Lembrando Construtores
- Como vimos na aula 1, um construtor é um método
especial que é chamado para configurar um objeto
quando da sua criação. - Quando escrever um construtor, lembre-se
- ele te o nome da classe.
- Ele não retorna valor
- Ele não tem tipo de retorno, nem mesmo void
- É nele onde se inicializam as variáveis das
instâncias. - Não é obrigatório definir um construtor para uma
classe.
48Construtor
- O construtor é chamado quando executamos o
operador new. - Ele é um método que inicializa um objeto
imediatamente após a sua criação. - Construtores não tem nenhum tipo de retorno (nem
mesmo void). - A maioria das classes define seus próprios
construtores, mas o Java fornece um construtor
padrão se um não for definido.
49O operador new
- O operador new cria uma única instância de uma
classe nomeada e retorna uma referência para este
objeto. - Classvariable objectreference new classname()
- O statement é composto de dua partes
- (1) Classvariable objectreference declara uma
variável de referência para um objeto daquela
classe (referência esta que tem valor null) - (2) objectreference new classname() aloca
memória para o objeto e atribui aquele endereço à
variável de referência.
50Variáveis de Instância
- A variável face na classe Moeda é denominada
variável de instância pois cada instância
(objeto) da classe Moeda terá uma cópia separada
dele. - Uma declaração da classe simplesmente declara o
tipo do dado, mas não reserva espaço para ele. - Cada vez que um objeto da classe Moeda é criado,
um anova variável face também é criada. - Os objetos da classe têm as mesmas definições de
métodos, mas têm espaços de memória próprios. - Só assim eles podem ter estados diferentes!
51Variáveis de Instância
- Os dados são parte da declaração dentro de uma
classe se sua declaração estiver dentro das
chaves ( ) da declaração da classe. - As declarações devariáveis de instância têm a
mesma sintaxe da declaração de variáveis locais. - A diferença é que as variáveis de instância são
declaradas fora do escopo de todos os métodos de
uma classe.
52Variáveis de Instância
classe moeda
int face
53Lembrando Encapsulamento
- Podemos ter duas vistas de um objeto
- interna - a estrutura de seus dados e os
algoritmos de seus métodos. - externa - a interação do objeto com outros
objetos do sistema. - Do ponto de vista externo, um objeto deve ser uma
entidade encapsulada que provê serviços
específicos, que definem a interface do objeto. - Tudo que não for visível na interface deve ser
escondido do resto do sistema.
54Lembrando Encapsulamento
- Os métodos de um objeto deve ser os únicos
autorizados a modificar seu estado. - Devemos fazer com que seja difícil, se não
impossível, que outro objeto possa alterar o
objeto sem passar pelos seus métodos. - O usuário, ou cliente, de um objeto deve poder
requisitar seus serviços (chamar seus métodos),
mas não deve saber como estes serviços são
realizados.
55Modificadores de Visibilidade
- No Java, nós fazemos o encapsulamento através do
uso dos modificadores de visibilidade
apropriados. - Um modificador é uma palavra reservada do Java
que especifica uma característica particular de
um método ou atributo. - Por exemplo, nós usamos o modificador final para
definir uma constante. - Java tem três modificadores de visibilidade
básicos - public
- private
- protected
56Modificadores de Visibilidade
- Membros de uma classe que são declarados com
visibilidade public podem ser acessados de
qualquer ponto. - Membros de uma classe que são declarados com
visibilidade private só podem acessados de dentro
da própria classe. - Membros declarados sem modificadores de
visibilidade têm a chamada visibilidade padrão
(default), que consiste em poder ser acessados
por qualquer classe dentro do mesmo pacote.
57Modificadores de Visibilidade
- De forma geral, nenhum atributo deveria ser
declarado como público. - Métodos que realizam os serviços do objeto devem
ser declarados como públicos, para que possam ser
invocados pelos clientes. Estes métodos públicos
são muitas vezes chamados de métodos de serviço. - Um método criado simplesmente para modularizar
seu código e ajudar um método de serviço é
chamado de método de suporte e não deve ter
visibilidade publica.
58Decompondo métodos
- Um método deve ser relativamente pequeno, ou pelo
menos, o mais compreesível possível. - Um método potencialmente grande ou de código
compelxo pode ser decomposto em vários métodos
menores para aumentar sua clareza. - Logo, um método de serviço pode chamar um ou mais
métodos de apoio para obtermos este resultado.
59Modificadores de Visibilidade
- O último destes modificadores é o protected, que
impede que qualquer outro objeto que não o dono e
suas sub-classes acessem aquele elemento. - Suas vantagens vão ficar mais claras quando
discutirmos herança, mais adiante. - Este modificador e o modificador private garantem
o encapsulamento, não dependendo da boa vontade
de ninguém. - Por isto nós o usamos na classe Moeda. Dado que
nós o usamos, precisamos de métodos para pegar os
valores dos atributos. Daí a existência do getFace
60static
- Este modificador faz com que um membro de uma
classe seja definido como part da classe, sendo
independente de todos os objetos da classe. - Nós já vimos isto aplicado a variáveis, mas pode
ser usado também em métodos (vide o método main) - Este modificador faz com que se crie um membro de
classe (atributo ou método) que pode ser
referenciado sem chamar um objeto, mas sim uma
classe. - Exemplo Math.abs
61main()
- O método main() é a primeira coisa, após o
construtor da classe, que é chamado quando
iniciamos um aplicativo Java. O seu formato é - public static void main(String args )
- Public significa que outras classes e objetos
podem chamá-lo. - Static significa que é um método de classe.
- Void significa que o método main() não retorna
um valor. - O parâmetro do método main() consiste nos valores
que lhe são passados por linha de comando.
62main()
- O método main recebe um parâmetro, que consiste
em um array contendo os parâmetros digitados após
o nome da classe sendo executada. - O parâmetro args tem um comportamento idêntico a
todos os outros arrays de strings em Java. - Exemplo ao executar java classe1 x y 2.3, temos
o seguinte - args.length3
- args0x
- args1y
- args22.3
63Dot (.) Operator
- O dot(.) operator é usado para acessar vaiáveis e
métodos dentro de um objeto (se forem de
instância) ou classe (se forem estáticos) - NomeObjetoouClasse.nomedavariável
- NomeObjetoouClasse.método(lista-de-parâmetros)
- Pense nisso como um nome e sobrenome. Dentro da
família todos são conhecidos pelo nome (dentro da
própria classe um avariável/método é conhecido só
pelo seu nome), mas fora da família precisamos do
nome e do sobrenome (fora da classe/objeto
precisamos do dot operator)
64Manipulando uma Pessoa
- Vamos analisar os conceitos que vimos até agora
analisando a classe Pessoa. - Em uma abstração possível, um objeto da classe
pessoa poderia ser da seguinte forma
nome
age
Sobrenome
65Manipulando uma Pessoa
Barreira de encapsulamento
nome
idade
Sobrenome
A barreira do encapsulamento protege os atributos
da classe Pessoa de interferência externa indevida
66Manipulando uma Pessoa
- Criamos então métodos para que possamos alterar
atributos dentro de um objeto encapsulado.
Alteradores (Mutators)
setnome
setIdade
setSobrenome
67Manipulando uma Pessoa
- Métodos são criados para permitir leitura de fora
de um objeto encapsulado.
Leitores (Getters)
getnome
getIdade
getSobrenome
68Manipulando uma Pessoa
- Para criar uma instância da classe Pessoa, nós
podemos executar a seguinte instrução dentro de
qualquer método, como por exemplo o método main (
) - Person person1 new Person( )
- person1 é uma variável de referência para um
objeto da classe Pessoa, ou para simplificar, um
objeto da classe Pessoa.
69Manipulando uma Pessoa
getIdade
getnome
setnome
setIdade
getSobrenome
setSobrenome
Person1
70Manipulando uma Pessoa
Lembre-se o operador new cria uma única
instância de uma classe nomeada e retorna uma
referência a este objeto Sua sintaxe
é Classname variable new Classname( ) A
variável de referência criada é de escopo local,
mas o objeto para o qual ela aponta não!
71Manipulando uma Pessoa
- O dot (.) operator é usado para acessar métodos
dentro de um objeto (isto é, métodos que
pertencem a um objeto e a ele se aplicam) - Sua sintaxe é
- NomedoObjeto.método (lista-de-parâmetros)
72Exemplo de alteradoresClasse Pessoa
setnome
getIdade
getnome
setIdade
person1.setnome (John)person1.setSobrenome
(Smith)person1.setIdade (21)
setSobrenome
getSobrenome
73Exemplo de leitores Classe Pessoa
getIdade
getIdade
setnome
getnome
setIdade
getSobrenome
setSobrenome
String sperson1.getnomeString
s2person1.getSobrenomeint iperson1.getIdade
74Exemplo de Classe
public class Ponto protected int x, y
public Ponto() setPonto( 0, 0 )
public Ponto( int xCoordinate, int
yCoordinate ) setPonto( xCoordinate,
yCoordinate ) public void setPonto(
int xCoordinate, int yCoordinate )
x xCoordinate y yCoordinate
public int getX() return x public
int getY() return y