Você está na página 1de 71

Instituto Federal de Minas Gerais

Campus Ouro Branco

Programação Orientada a Objetos I


Conceitos de OO

Professor: Saulo Henrique Cabral Silva


Classes
• Uma classe descreve um conjunto de objetos com as mesmas
propriedades, o mesmo comportamento, os mesmos
relacionamentos com outros objetos e a mesma semântica;

• Similar ao conceito de tipo.

2
Objetos
• “Um objeto é uma entidade que incorpora uma abstração
relevante no contexto de uma aplicação”;

• Podem ser coisas abstratas (ex: reserva de restaurante) ou


concretas (ex: um automóvel à venda).

• Características:
– Estado (estrutura): Conjunto de suas propriedades e seus valores
correntes;
– Comportamento: conjunto de serviços (operações) que o objetivo
provê;
– Identidade: identificador único que diferencia cada objeto, mesmo
que tenham o mesmo estado de comportamento.

3
Classes e instâncias
• Objeto = Instância de classe;

• Paradigma OO norteia o desenvolvimento por meio de


classificação de objetos:
– Modelamos classes, e não objetos;
– Objetos são entidades reais – executam algum papel no sistema;
– Classes são abstrações – capturam a estrutura e comportamento
comum a um conjunto de objetos.

4
Classes e objetos
• O mundo real é formado de coisas (pessoa, quadro, computador,
fornecedor, animal ...).
– Toda coisa do mundo real é chamada de objeto na modelagem orientada
a objetos.

• Nos seres humanos ainda costumamos agrupar os objetos.


– Esse processo de agrupar “coisas” reduz a complexidade de interpretar e
abstrair tantas opções que existem atualmente.
– Ex: é muito mais fácil se lembrar o que é um cavalo (ideia/molde).

• Uma classe é a ideia geral (é o molde). A classe:


– Contem a descrição dos atributos e serviços(ações)
comuns a um grupo de objetos.
– Dizemos que um objeto é uma instancia de uma classe.

5
Contextualizando
• Vem a mente um objeto (animal):
– 4 patas
– Crina
– Cauda
– ...

• É importante sempre lembrar que uma


classe é uma representação abstrata de
coisas do mundo real.
– Coisas do mundo real são muito complexas para que todas as suas
características sejam representadas em uma classe.
– Para cada problema posso ter atributos mais ou menos relevantes...

6
Declarando uma Classe em Java
public class Cavalo {
//atributos

//construtores

//encapsulamento

//comportamento
}

7
ATRIBUTOS

8
Atributos
• Cor

• Altura

• Peso

• Número de dentes

• Quantidade de patas

9
Atributos de uma Classe em Java
public class Cavalo {
//atributos

//construtores

//encapsulamento

//comportamento
}

10
Atributos de uma Classe em Java
public class Cavalo {

private String cor;


private int idade;
private double peso;
private int numPatas;
private String raca;

//construtores

//encapsulamento

//comportamento
}

11
Modificadores de acesso
• public  acesso global em todas as classes de todos os
pacotes;

• private  A única classe que tem acesso é a própria classe


que o define;

• protected  acesso as classes de mesmo pacote ou através


de herança;

• default (sem modificação)  acesso


à todas as classes de mesmo
pacote

12
static
• static  indica que um elemento (atributo, método, classe),
pertence à própria classe (grupo) e não à uma instância específica.

• Se um elemento é declarado como static, então existirá uma única


cópia compartilhada entre as instâncias existentes.
– Não importa quantas inicializações houverem sempre existirá uma única
cópia (área de memória).

• Porque usar?
– Quando o valor da variável
independe da existência de
objetos;
– Quando é necessário que a
variável seja compartilhada
por vários objetos.

13
static
• Algumas características:
– Elementos static, podem ser acessados diretamente;
• Utilizando o nome da classe (não precisando de uma instância);
– Elementos static, podem ser acessados sem a ocorrência de uma
instância da classe à qual foram declaradas;
– Elementos static podem ser declaradas apenas dentro do escopo de
uma classe (class level);

• É possível acessar um elemento static a partir da classe ou de


uma das instâncias (objetos) dessa classe.
– Uma boa prática é sempre acessar variáveis static a partir da classe;
– Essa prática auxilia na identificação de elementos static e não-static;

14
CONSTRUTORES

15
Construtores
• São os responsáveis por duas funções essenciais dentro da
programação orientada a objetos:
– Constroem (instanciam) os objetos, que são instâncias das classes.
– Inicializam todos os atributos.
• Temos aqui um cuidado especial com atributos que também possam ter a
necessidade de serem inicializados através de outro construtor...

• Construtores que veremos frequentemente de


agora em diante...
– default
– Inicialização - Variáveis

16
Construtores  código
public class Cavalo {
private String cor;
private int idade;
private double peso; Peso
private String numPatas;
h
private String raca;

public Cavalo() { }

public Cavalo( String cor_, int idade_ ) {


this.cor = cor_;
this.idade = idade_;
}
}

17
Objetos
• “Um objeto é a instância de uma classe”.

• Um objeto possui um espaço de memória...

• A classe é a fôrma e o objeto é o produto dessa fôrma.

• Como criar um objeto ?  Chame os construtores.

Classe Objeto

18
Criação de objetos

public static void main (String [] args) {

Cavalo c1 = new Cavalo();

Cavalo c2 = new Cavalo(“preto”,12);

Cavalo c3 = new Cavalo(“Cinza”,9);

19
Métodos

20
21
Análise do estudo de caso...
(Métodos/ações)
• Os pedais ocultam as complexidades do funcionamento do
motorista:
– O pedal do acelerador oculta toda a complexidade
para aumentar a velocidade do carro.

– O pedal do freio oculta a complexidade para


diminuir a velocidade do carro.

– O volante oculta a complexidade dos mecanismos


para mudar a direção do carro.

22
Mensagens e métodos
• As operações (serviços) que um objeto oferece são chamadas
de métodos;

• Para solicitar um serviço a um objeto (cliente) envia-se uma


“mensagem” a ele.

• Encapsulamento: não é permitido acessar diretamente as


propriedades de um objeto, é preciso operar por meio de
métodos (troca de mensagens);

• Abstração: a complexidade de um objeto é escondida “por


trás” de suas operações;

• Toda funcionalidade do sistema é realizada pela troca de


mensagem entre objetos.
23
Métodos específicos / habilidades
• São métodos que denotam um comportamento/habilidade de cada
Classe.

• A implementação destes métodos segue a mesma sintaxe especificada


durante a disciplina de programação 1 (Introdução à programação).

• Métodos de classe possuem acesso aos atributos das


mesmas.
– Acesso
– Modificação de valor

24
Objetos - Mensagens
• Objetos não executam as suas ações
por conta própria.

• Para que a ação de um objeto possa ser executada é


necessário que tenha ocorrido algum tipo de estimulo.

• Quando um estimulo é enviado (percebido) por um objeto,


dizemos que houve uma mensagem para o objeto.

• Lembrem se do exemplo de João pedindo


uma pizza...
25
Codificando métodos de classes

public class Cavalo {


//... variáveis
//... construtores
public void correr( ){

// ...

// faça algo...

// ...

}
}

26
“Chamando - usando” as habilidades de
cada Objeto
public static void main (String [] args) {

Cavalo c1 = new Cavalo();

Cavalo c2 = new Cavalo(“preto”,12);

Cavalo c3 = new Cavalo(“Cinza”,9);

c1.correr();

c2.correr();

}
27
ENCAPSULAMENTO

28
Encapsulamento
• Complemento da abstração:
– Abstração enfoca o comportamento observável de um objeto;
– Encapsulamento enfoca a implementação que origina este
comportamento.

• Promove maior estabilidade


– Clientes do objeto só conhecem sua interface;
– Podemos alterar a implementação de um operação sem afetar o
restante do sistema.

29
Encapsulamento
• Separar os aspectos externos (o que faz) dos aspectos
internos (como faz):
– Aspectos externos = interface, contrato;
– Aspectos internos = implementação.

30
Encapsulamento
• O objetivo aqui é isolar a classe, e controlar acessos à mesma.
– Boa prática de programação em deixar os atributos de uma classe restritos a
ela.
– Dizemos que ocultamos os tributos da classe.
– Para acessar os atributos de uma classe utiliza-se os métodos get e set.

Classe

var1
Set’s var2
Get’s
var3

31
Métodos Set’s – Get’s
public class Cavalo {
private String cor;
private int idade;

public void setCor (String cor_){


this.cor = cor_;
}
public String getCor ( ){
return this.cor;
}

public void setIdade ( int idade_){


this.idade = idade_;
}
}
Objetos - encapsulamento
• Objetos possuem comportamento.
– Operações que os mesmo podem realizar.

• Quando nos referimos ao comportamento dos objetos, estamos


pretendendo restringir o acesso ao comportamentos internos do
objeto.

• Para que a estratégia seja adotada é


preciso adotar aqui o conceito de
interface de um objeto/classe.

• A única coisa que um objeto


deve conhecer de outro é a sua
interface (métodos).

33
Objetos – encapsulamento (vantagens)
• A única coisa que um objeto precisa saber para pedir colaboração
de outro é conhecer a interface (métodos).

• Autonomia dos objetos.

• Cada objeto envia mensagem a outros para


realizar certas tarefas sem se
preocupar em como as tarefas são
realizadas.

• Escondemos os detalhes de funcionamento


interno dos objetos.

34
Packages (Pacotes)
• packages conjunto de classes
localizadas na mesma estrutura
hierárquica de diretórios.
– São colocadas em um package classes relacionadas, construídas com
um propósito comum para promover a reutilização de código;
– Reduz conflitos de nomes
– Facilita a busca pelo uso ou definição das classes no projeto;
– Permite um controle adequado pelos modificadores de acesso.

35
HIERARQUIA

36
Classes internas (inner class / nested class)
• Agrupar logicamente classes que são usadas apenas em um lugar:
– Se uma classe é útil para apenas uma outra classe, então é lógico
incorporá-la nessa classe e manter as duas juntas.
– Aninhar essas "classes auxiliares" torna seu pacote mais simplificado.

• Aumenta o encapsulamento:
– Considere duas classes de nível superior, A e B, onde B precisa de acesso
aos membros de A que, de outra forma, seriam declarados privados.
– Ao ocultar a classe B dentro da classe A, os membros de A podem ser
declarados privados e B pode acessá-los.
– Além disso, o próprio B pode ser escondido do mundo exterior.

• Código mais legível e sustentável:


– Aninhar pequenas classes em classes de nível superior coloca o código
mais perto de onde ele é usado.

37
Classes internas (inner class / nested class)

• Como ocorre com métodos e variáveis ​de instância, uma


classe interna é associada a uma instância de sua classe
envolvente:
– Tem acesso direto aos métodos e campos desse objeto;

• Objetos que são instâncias de uma classe interna existem


dentro de uma instância da classe externa.
– Pode ser criada apenas a partir da instância de um objeto da classe a
encapsula (caso não-static)
– Caso static é possível instanciar um objeto sem que exista uma
instância do objeto da classe mais externa (não faz tanto sentido, aqui
seria mais atraente pensar num reuso)

38
Modularidade
• Decomposição do sistema em módulos
– Coesos (baixo acoplamento);
– Autônomos;
– De interface simples e coerente

• Fundamental para o reuso e


extensão.

39
Hierarquia
• É uma forma de “organizar” as
abstrações e simplificar o
entendimento do problema;

• Também promovem o reuso;

• Sinergia para administrar a complexidade:


– Abstração auxilia a identificar os conceitos relevantes do mundo real;
– Encapsulamento oculta a visão interna das abstrações identificadas;
– Modularidade, meio de agrupar logicamente abstrações relacionadas;
– Por fim, abstrações formam hierarquias.

40
Mecanismo de estruturação
• Objetos relacionam-se uns com os outros;

• É preciso modelar esta complexidade e estruturar as classes;

• Mecanismo propostos:
– Associação;
– Composição;
– Herança.

41
Ligações e associações
• Ligação: conexão entre objetos;

• Associação: conexão entre classes que representam a


existência de ligações;

• Uma associação descreve um conjunto de potenciais ligações


da mesma maneira que uma classe descreve um conjunto de
potenciais objetos.

42
Composição e agregação
• Formas especiais de ligação que modelam relacionamentos todo-
parte;

• Objetos complexos agregam ou são compostos de objetos mais


simples;

• Composição:
– A parte só pode pertencer a um todo (por vez). Ex: uma aula de uma
disciplina, um motor de um carro;
– Parte pode não pertencer a um todo (ex: motor)

• Agregação:
– A parte pode ser compartilhada com vários todos.
– Ex: uma disciplina de um (ou mais) cursos de graduação.
43
Generalização e especialização
• Generalização: quando classes têm
semelhanças podemos definir uma
classe mais geral;

• Especialização: muitas vezes um


conceito pode ser refinado,
adicionando-se novas características.

44
HERANÇA

45
Herança
• Herança é uma forma de reutilização de software em que uma nova
classe é criada absorvendo membros de uma classe.

• Estamos em busca do aprimoramento, novas capacidades ou


modificadas.

• Com isso ganhamos:


– Tempo;
– E reuso de código testado;

• Ao criar uma classe, em vez de declarar


membros completamente novos, podemos
herdar membros de uma classe já existente.

46
Herança
• Generalização e Especialização são úteis para estruturação do
sistema;

• São formadas hierarquias de classes:


– “Filhos” (ou subclasses) herdam estrutura e comportamento dos
“pais” (ou superclasses) e demais “ancestrais”, de forma indireta.

• A herança possibilita:
– Reutilização;
– Captura explícita de características comuns;
– Definição incremental de classes.

47
Cuidados com o uso de herança
• Semântica da herança:
– “é um tipo de”;
– “é uma instância indireta de”;
– Ex: Universitário é um tipo de Estudante.

• Se a subclasse precisa cancelar características da superclasse,


há algo errado!!!

• Herança pode se tornar um vício!

48
Herança múltipla
Classe A
• Cuidado!!!!!!!
X
y

Classe A Classe B Classe A Classe A


X W W Z
y

Classe C Classe A
R R

49
Herança - código
public class Animal {
private String nome;
private double altura;

public Animal ( ){ }

public Animal (String nome_, double altura_){


this.nome = nome_;
this.altura = altura_;
}
}
50
Herança - código
public class Cavalo extends Animal{
private String cor;
private int idade;
private double peso;
private String numPatas;
private String raca;
public Cavalo() {
super( );
}

public Cavalo(String cor_, int idade_,String nome_,String alt_ ) {


super( nome_, alt_);
this.cor = cor_;
this.idade = idade_;
...
}
} 51
Objetos - herança
• A herança é outra forma de abstração
utilizada na orientação a objetos.

• Existe a organização das características e comportamentos


comuns a um conjunto de objetos que podem ser abstraídos
em uma única classe.

• Cada classe em um nível da


hierarquia herda as
características das classes
nos níveis acima.

52
Relação entre os conceitos discutidos

53
POLIMORFISMO

54
Polimorfismo
• O polimorfismo permite escrever programas que processam objetos que
compartilham uma mesma classe.

• Com o polimorfismo podemos projetar e implementar sistemas que são


facilmente extensíveis.
– Novas classes podem ser adicionadas com pouca ou nenhuma modificação.
– As únicas partes de um programa que devem ser alteradas para acomodar as novas
classes são aquelas que exigem conhecimento direto das mesmas que acabaram de ser
adicionadas a hierarquia.

1m 3m 10 m 55
Objetos - Polimorfismo
• Indica a capacidade de abstrair várias implementações
diferentes de uma única interface.

• A mesma mensagem é enviada, mas


para interfaces diferentes.

• Aparelhos diferentes de mesmos fabricantes


“conversam”.

• Classes abstratas (abstract)

56
Polimorfismo - código
• Implementamos o método mover na super classe Animal.

• Sobrescrevemos esse método (mover) em cada uma das subclasses


(especializações).

• O ato de: “sobrescrever”  é o polimorfismo.

Vector <Animal> animais = new Vector <Animal> ( );

//adição de alguns animais nesse vetor dinâmico (subclasses)

for ( int i = 0 ; i < animais.size(); i++ ){


animais.get(i).correr();
} 57
Polimorfismo
• O Objeto emissor não precisa saber quem é o objeto receptor,
contanto que saiba que ele responde a uma certa mensagem;
– O emissor só conhece uma interface;
– O receptor sabe a implementação certa.

• É uma forma de sobrescrita,


mas todas as operações
mantém a mesma
semântica em toda
a hierarquia.

58
CLASSES ENUMERATES (ENUM)

59
Classes Enumerates
• É um tipo especial de classe que é introduzida pela palavra-chave ENUM.

• Essa classe especial, contém uma lista de constantes de enumeração


separadas por vírgula.
– Cada identificador em uma classe ENUM deve ser único.

• As instâncias (“Objetos”) dos tipos enum são criadas e nomeadas junto


com a declaração da classe, sendo fixas e imutáveis

• Não é permitido criar novas instâncias com a palavra new.


– Construtor private

• As instâncias são declaradas todas com letras MAISCULAS;

60
Exemplo Classes Enumerates
public enum DiaSemana {

DOMINGO(0), SEGUNDA(1), TERCA(2),


QUARTA(3), QUINTA(4), SEXTA(5), SABADO(6);

private valorDia;

private DiaSemana( int valor) {


this.valorDia = valor;
}

public void getValorDia() {


return this.valorDia;
}
} 61
CLASSES ABSTRATAS

62
Classes abstratas (interfaces)
• Fornecer uma superclasse apropriada a partir da qual outras
classes podem herdar e assim podem compartilhar um
design comum.

• Uma classe abstrata não pode produzir instâncias de objetos.


– Classes concretas (não abstratas) podem.

• Uma classe abstrata é como


o design de alguma construção...
– O que essa construção precisa
contemplar...

63
Classes abstratas
• Classes abstratas não podem ser instanciadas;
– Usadas para organizar características comuns a diversas subclasses;
– Desenvolvida para ser herdada.

• Não possui instâncias diretas, só indiretas.

64
Operações abstratas
• Classes abstratas podem definir métodos sem
implementação, chamados abstratos;
– Subclasses concretas são obrigadas a implementá-lo;
– Classes concretas não podem ter métodos abstratos;
– Classes abstratas podem ter métodos concretos.

• Interface = Classe abstrata que só possui operações abstratas.

65
Sobrecarga e sobrescrita
• Sobrecarga: operações distintas com o mesmo nome;

• Sobrescrita: subclasse define nova implementação para


operação definida na superclasse

66
Classes abstratas - código
public abstract class Tv {
public abstract void aumentarVolume ( );

public abstract void abaixarVolume ( );

public abstract String retornaFabricante ( ){


...
}
}

public class TvPanasonic extends Tv {

//obrigatório implementar todos os métodos abstratos da classe abstrata


}
67
Interfaces - código
public interface Tv {
public void aumentarVolume ( );

public void abaixarVolume ( );

public String retornaFabricante ( );


}

public class TvPanasonic implements Tv {

//obrigatório implementar todos os métodos da interface


}

68
Generics
• Evitar o uso de casts excessivos e erros que são encontrados as vezes
apenas em tempo de compilação.

• class NAME <T1, T2, ..., Tn> { /* ... */ }

• Parametrização de tipos de parâmetros


– E  Java Collections Framework
– K  Chave
– N  números
– S, T, U, V, ...  Tipo
– V  Valor

• O tipo pode ser utilizado em toda a classe, inclusive no retorno de


métodos.
69
public class Teste <T, S> {
private T t;
private S x;

public Teste(T t, S x) {
this.t = t;
this.x = x;
}
}
-------------------------------------------------------------------------------------------------------
public static void main(String [ ] args) {
Teste<String, Integer> gt = new Teste<>("Hello", 3);
Teste<Integer, Integer> gt2 = new Teste<>(10, 3);

gt.showType();
gt2.showType();
}
70

Você também pode gostar