Você está na página 1de 12

java

Introdução à programação Orientada a Objeto


Tema 1
⤿Módulo 1: Descrever a definição, a manipulação e
as nuances de classes e objetos em Java
[Modificador]class
→ CLASSES E SUA REALIZAÇÃO EM JAVA Identificador[TipoParâmetros]
[Superinterface]{[Corpo da
Na programação Orientada a Objetos a classe é Classe]}
uma maneira de se criar objetos que possuem o
mesmo comportamento e estrutura. Uma classe é
- Na sintaxe, os colchetes indicam elementos
uma estrutura que define:
opcionais;
- Os dados;
- Os métodos que operam sobre esses dados - Os símbolos que não estão entre colchetes são
e forma o comportamento do objeto; obrigatórios, sendo que “Identificador” é um literal;
- O mecanismo de instanciação dos objetos. - Em negrito estão os símbolos reservados da
linguagem.
Em Java, não possui arquivos de cabeçalhos, assim ,
A forma mais simples possível de se declarar uma
a implementação dos métodos ocorre junto à
classe em Java é: class Inutil { }.
declaração. Além disso, em Java cada classe pública
deve estar num arquivo com o mesmo nome da classe
Os modificadores podem ser qualquer elemento do
e extensão “java”. Logo, a classe do Código 1 deve
seguinte conjunto:
ser salva num arquivo de nome “ Aluno.java”.

Annotation: é uma definição e não um elemento. Sua


Exemplo 1:
semântica implementa o conceito de anotações em
class Aluno {
Java e pode ser substituída por uma anotação
//Atributo padrão ou criada pelo programador.
private String Nome;
//Métodos Public, Protected e Private: são símbolos que irão
public void inserirNome ( ) { aparecer quando falarmos de encapsulamento., e são
Nome = modificadores de acesso.
System.in.toString (); }
Static: modificador que afeta o ciclo de vida da
public String recuperarNome instância da classe e só pode ser usado em classe
(){ membro.
return Nome;
} } Abstract e Final: são modificadores que
relacionam-se com a hierarquia de classe.
Strictfp: este modificador torna a implementação de
cálculos de ponto flutuante independente da
plataforma.

→ OBJETOS: OS PRODUTOS DAS CLASSES

As classes eram modelos para a fabricação de


Exemplo: instanciação de objeto com “new”
objetos e nem toda classe permite a criação de um
objeto.
//Importações
Instanciar: Instanciar uma classe significa realizar
import java.util.Random;
o modelo, e essa realização é chamada de objeto. //Classe
public class Aluno {
Para a criação de um objeto é preciso seguir duas //Atributos
etapas:
private String nome;
- Uma variável é declarada como sendo do
tipo de alguma classe; private int idade;
- O compilador é instruído a gerar um objeto private double
a partir daquela classe, que será rotulado codigo_identificador;
com o identificador que nomeia a variável. private Random aleatorio;
//Métodos
Aluno objetoAluno = new Aluno public void Aluno ( String
nome , int idade ) {
( ) aleatorio = new Random ();
this.nome = nome;
ou esse código pode ser separado nas etapas this.idade = idade;
descritas da seguinte forma:
this.codigo_identificador =
aleatorio.nextDouble ();
Aluno objetoAluno;//declaração
}
objetoAluno = new Aluno ( );
public void definirNome (
//instanciação
String nome ) {
this.nome = nome;
}
O processo de criação do objeto começa com a public void definirIdade ( int
alocação do espaço em memória. E prossegue com a idade ) {
execução do código de construção do objeto. this.idade = idade;
}
O método construtor é sempre executado quando da }
instanciação de um objeto e obrigatoriamente deve
ter nome idêntico ao da classe.
relação pode ocrrer com cardinalidade
1-1, 1 - n, n - 1 e n - n.
Outra forma de se instanciar um objeto é através da
- Agregação: que ocorre entre dois ou mais
clonagem. Desta forma, cópias idênticas do objeto
objetos, com cada um tendo seu próprio
são feitas através da cópia do espaço de memória.
ciclo de vida, mas com um objeto (pai)
contendo dos demais (filhos). é importante
→ CLASSES E O ENCAPSULAMENTO DE compreender que, nesse caso, os objetos
CÓDIGO filhos podem sobreviver à destruição do
objeto pai.
- Composição: diferente da Agregação, pois
Encapsulamento: visa ocultar do mundo exterior os ocorre quando há uma relação de
atributos e o funcionamento da classe. Dessa dependência entre o(s) filho(s) e o objeto
maneira, os detalhes de implementação e variáveis pai. Ou seja, caso o pai deixe de existir,
ficam isolados do resto do código. O contato da necessariamente o filho será destruído. A
classe com o resto do mundo se dá por meio dos composição é um caso especial de
métodos públicos da classe. Tais métodos formam o Agregação e o conceito mais restritivo de
chamado contrato, que é estabelecido entre a classe todos, enquanto a Associação é o mais
e o código que utiliza. abrangente.
O conceito de encapsulamento liga ao de visibilidade.
A visibilidade de um método ou atributo define quem
pode ou não ter acesso a estes.

→ TRABALHANDO COM CLASSES E OBJETOS


As classes e os objetos são trechos de código que
refletem o produto da análise OO e interagem entre
si, formando um sistema. Essa interação é a razão
pela qual estabelecemos o contrato de uma classe.
Esse contrato fornece a interface pela qual outras
classes ou outros objetos podem interagir com aquela
classe ou seu objeto derivado. Em OO (Orientação a
objeto) há diferentes tipos de relações:
- Associação: se refere a objetos que
consomem -uma- serviços ou
funcionalidade de outros. Ela pode ocorrer
mesmo quando nenhuma classe possui a
outra e cada objeto instanciado tem sua
existência independente do outro. Essa
{
discentes [ nr_discentes ] =
Código: Agregação e Composição novoAluno;
} }

class Escola {
Código: Referenciado objetos
//Atributos
public class Referencia{
private String nome, CNPJ; private Aluno a1 , a2;
private Endereco endereco; public Referencia ( ) {
private Departamento a1 = new Aluno ("Carlos",20);
departamentos [];
a2 = new Aluno ("Ana",23);
private Aluno discentes []; System.out.println("O nome do
private int nr_discentes , aluno a1 é"+ a1.recuperarNome());
nr_departamentos; System.out.println("O nome do
aluno a2 é"+ a2.recuperarNome());
//Métodos
a2 = a1;
public Escola ( String nome ,
String CNPJ) { a2.definirNome("Flávia");
System.out.println("O nome do
this.nome = nome; aluno a1 e"+ a1.recuperarNome());
this.CNPJ = CNPJ;
manipulaAluno ( a1 );
this.departamentos = new
Departamento [10]; System.out.println("O nome do
this.discentes = new aluno a1 é" +a1.recuperarNome());
Aluno [1000]; }
this.nr_departamentos = 0;
this.nr_discentes = 0; public void manipulaAluno ( Aluno
aluno ) {
} aluno.definirNome("Márcia");
public void criarDepartamento
( String nomeDepartamento ) }

{ }

if (nr_departamentos <= 10)


{ A execução desse código produz a seguinte saída:
departamentos [
nr_departamentos ] = new
Departamento
(nomeDepartamento);
nr_departamentos++;
} else {
System.out.println ( "Nao e
possivel criar outro
Departamento." );
}
public void matricularAluno
(Aluno novoAluno )
⤿Módulo 2: Descrever o mecanismo de herança e herdar de mais de uma interface pai.
polimorfismo em Java Diferentemente das classes, uma interface não
admite a implementação de métodos. Esta é feita
O termo herança em OO define um tipo de relação pela classe que implementa a interface.
entre objetos e classes, baseado em uma hierarquia.
Código 6: Herança em classes.
Dentro dessa relação hierárquica, classes podem
herdar características de outras classes situadas
public class
acima ou transmitir suas características às classes ProfessorComissionado extends
abaixo. Professor{

Uma classe situada hierarquicamente acima é }
chamada de superclasse, enquanto aquelas situadas
abaixo chamam-se subclasses. Essas classes podem
ser, também, referidas como classe base ou pai
Código: Herança em inertfaces.
(superclasse) e classe derivada ou filha (subclasse).

A herança nos permite reunir os métodos e


atributos comuns numa superclasse, que os leva às public interface
classes filhas. Isso evita repetir o mesmo código ProfessorComissionado extends
Professor, Diretor{
várias vezes.

Outro benefício está na manutenibilidade: caso uma }


alteração seja necessária, ela só precisará ser feita
na classe pai, e será automaticamente propagada
para as subclasses. Algo interessante de se observar é que em Java todas
as classes descendem direta ou indiretamente da
E quando há mais de uma superclasse? classe “Object”. Isso torna os métodos da classe
“Object” disponíveis para qualquer classe criada. O
Essa situação é denominada herança múltipla e, método “equals ()”, da classe “Object”, por exemplo,
apesar de a POO aceitar a herança múltipla, a pode ser usado para comparar dois objetos da
linguagem Java não a suporta para classes. Veremos mesma classe.
as implicações da herança múltipla em outra
ocasião, quando explorarmos mais a fundo o conceito Se uma classe for declarada sem estender nenhuma
de herança. outra, então o compilador assume implicitamente que
ela estende a classe “Object”.

Apesar de não permitir herança múltipla de classes,


Se ela estender uma superclasse, como no código,
a linguagem permite que uma classe herde de
então ela é uma descendente indireta de “Object”.
múltiplas interfaces. Aliás, uma interface pode
→ HERANÇA E VISIBILIDADE Os modificadores de acessibilidade ou visibilidade
operam controlando o escopo no qual se deseja que os
Quando dizemos que a classe “Pessoa” é uma elementos (classe, atributo ou método) aos quais
generalização da classe “Empregado”, isso significa estão atrelados sejam visíveis.
que ela reúne atributos e comportamento que podem
ser generalizados para outras subclasses. Esses O maior escopo é o global, que, como o próprio nome
comportamentos podem ser especializados nas indica, abarca todo o programa. Outro escopo é
subclasses. Isto é, as subclasses podem sobrescrever definido pelo pacote.
o comportamento modelado na superclasse. Nesse
caso, a assinatura do método pode ser mantida, Um pacote define um espaço de nomes e é usado para
mudando-se apenas o código que o implementa. Há agrupar classes relacionais.
quatro níveis de acesso em Java:
Assim este conceito contribui para a melhoria da
- Default: Assumido quando nenhum organização do código de duas formas: permite
modificador é usado. Define a visibilidade organizar as classes pelas suas afinidades
como restrita ao pacote. conceituais e previne conflitos de nomes.
- Privado: Declarado pelo uso do modificador
“private”. A visibilidade é restrita à classe. Em Java, um pacote é definido pela instrução
- Protegido: Declarado pelo uso do “package” seguida do nome do pacote inserida no
modificador “protected”. A visibilidade é arquivo de código-fonte. Todos os arquivos que
restrita ao pacote e a todas as subclasses.
contiverem essa instrução terão suas classes
- Público: Declarado pelo uso do modificador
agrupadas no pacote. Isso significa que todas essas
“public”. Não há restrição de visibilidade.
classes, isto é, classes do mesmo pacote, terão
acesso aos elementos que tiverem o modificador de
acessibilidade "default".

O modificador “private” é o mais restrito, pois limita


a visibilidade ao escopo da classe. Isso quer dizer que
um atributo ou método definido como privado não
pode ser acessado por qualquer outra classe senão
aquela na qual foi declarado. Isso é válido mesmo
para classes definidas no mesmo arquivo e para as
subclasses.

O acesso aos métodos e atributos da superclasse


pode ser concedido pelo uso do modificador
“protected”. Esse modificador restringe o acesso a
todas as classes do mesmo pacote. Classes de outros
pacotes têm acesso apenas mediante herança.
Finalmente, o modificador de acesso “public” é o Todo objeto que possui uma superclasse tem
menos restritivo. Ele fornece acesso com escopo capacidade de ser polimórfico. Por essa razão, todo
global. Isto é, qualquer classe do ambiente de objeto em Java é polimórfico, mesmo que ele não
desenvolvimento pode acessar as entidades estenda explicitamente outra classe. A justificativa é
declaradas como públicas. que toda classe em Java descende direta ou
indiretamente da classe “Object”.

O polimorfismo permite o desenvolvimento de códigos


facilmente extensíveis, pois novas classes podem ser
adicionadas com baixo impacto para o restante do
software. Basta que as novas classes sejam
derivadas daquelas que implementam
comportamentos gerais.

⤿Módulo 3: Descrever os mecanismos de


agrupamento de objetos em Java

→ IMPLEMENTANDO O AGRUPAMENTO DE
As restrições impostas pelos modificadores de OBJETOS
acessibilidade são afetadas pela herança da
seguinte maneira: No agrupamento, o estado final desejado é ter os
- Métodos (e atributos) declarados públicos objetos agrupados, e cada agrupamento deve estar
na superclasse devem ser públicos nas mapeado para a chave usada como critério. Em
subclasses. outras palavras, buscamos construir uma função tal
- Métodos (e atributos) declarados que, a partir de um universo de objetos de entrada,
protegidos na superclasse devem ser tenha como saída “n” pares ordenados formados
protegidos ou públicos nas subclasses. Eles pela chave de particionamento e a lista de objetos
não podem ser privados. agrupados: F (U) = { [k1 , <lista agrupada>, [k2 ,
<lista agrupada> , ..., [k n , <lista agrupada> }.
→ POLIMORFISMO

A Figura 5 dá uma ideia do que se pretende.


É a capacidade de um objeto se comportar de
diferentes maneiras.

O polimorfismo pode se expressar de diversas


maneiras. A sobrecarga de função, assim como a
herança, são formas de dar ao objeto uma
capacidade polimórfica. No caso da herança, o
polimorfismo surge justamente porque um objeto pode
se comportar também como definido na superclasse.
Felizmente, a Java API oferece estruturas que formados. Conforme o agrupador da classe
facilitam o trabalho. Para manter e manipular os “Collectors” vai lendo os objetos do fluxo de entrada,
objetos usaremos o container “List”, que cria uma ele vai criando coleções de objetos correspondentes a
lista de objetos. Essa estrutura já possui métodos de cada classificador. O resultado é um par ordenado
inserção e remoção e pode ser expandida ou reduzida (Chave, Coleção), que é armazenado em uma
conforme a necessidade. estrutura de mapeamento “ Map”.

Para mantermos os pares de particionamento,


usaremos o container “Map”, que faz o mapeamento → AGRUPAMENTO OBJETOS COM A CLASSE
entre uma chave e um valor. A estrutura “Map”, “COLLECTORS” DA API JAVA
além de possuir métodos que nos auxiliarão, não
permite a existência de chaves duplicadas.
A classe “Collectors” é uma classe da API Java que
implementa vários métodos úteis de operações de
redução.Com o auxílio da API Java, não
public class Aluno {
precisaremos varrer a lista de objetos.
//Atributos Transformar-se esses objetos em um fluxo
(“stream”) que será lido pela classe “Collectors”, a
private String matricula ,
nome , naturalidade; qual realizará todo o trabalho de classificação dos
objetos, nos devolvendo um mapeamento como na
//Métodos
situação anterior.
public Aluno ( String nome ,
String naturalidade ) {
this.nome = nome; A operação de agrupamento é feita pelo método
this.naturalidade = “groupingBy”. Este método possui três variantes
naturalidade; sobrecarregadas, cujas assinaturas exibimos a:
}
@Override
static <T,
public String toString () { K>Collector<T,?,Map>>groupingB
y(Function<? super T,? extends
return String.format("%s(%s)", K> classifier)
nome , naturalidade );
static <T, K, D, A, M extends
} } Map<K, D>> Collector<T,?,M>
groupingBy(Function<? super
O agrupamento da classe “Collectors” usa uma T,? extends K> classifier,
função de classificação que retorna um objeto Supplier<M> mapFactory,
classificador para cada objeto no fluxo de entrada. Collector<? super T,A,D>
Esses objetos classificadores formam o universo de downstream)
chaves de particionamento. Isto é, são os rótulos ou
as chaves de cada grupo ou coleção de objetos static <T, K, A, D>
Collector<T,?,Map>
groupingBy(Function<? super departamentos.add ( new
T,? extends K> classifier, Departamento ( nomeDepartamento )
Collector<? super T,A,D> ); }
downstream) public void fecharDepartamento (
Departamento departamento ) {
departamentos.remove (
O agrupamento da classe “Collectors” usa uma departamento ); }
função de classificação que retorna um objeto public void matricularAluno (
classificador para cada objeto no fluxo de entrada. Aluno novoAluno ) {
discentes.add ( novoAluno ); }
Esses objetos classificadores formam o universo de
public void trancarMatriculaAluno
chaves de particionamento. Isto é, são os rótulos ou
( Aluno aluno ) {
as chaves de cada grupo ou coleção de objetos discentes.remove ( aluno ); }
formados. public void agruparAlunos ( ) {
Map < String , List < Aluno > >
Conforme o agrupador da classe “Collectors” vai
agrupamento=discentes.stream().col
lendo os objetos do fluxo de entrada, ele vai criando lect(Collectors.groupingBy(Aluno::
coleções de objetos correspondentes a cada recuperarNaturalidade));
classificador. O resultado é um par ordenado System.out.println ("Resultado do
(Chave, Coleção), que é armazenado em uma agrupamento por naturalidade: ");
agrupamento.forEach (( String
estrutura de mapeamento “ Map” chave , List < Aluno > lista) ->
System.out.println (chave + " = "
+ lista )); } }
Código: Agrupamento com o uso do método
”groupingBy” (Assinatura 1).
Código: Agrupamento com o uso do método “groupingBy”
(assinatura 2).
class Escola {
//Atributos
private String nome, CNPJ;
public void agruparAlunos (
private Endereco endereco;
int a ) {
private List departamentos;
private List discentes; Map < String , Set < Aluno > >
//Métodos agrupamento =
discentes.stream().collect(Col
public Escola ( String nome ,
String CNPJ) { lectors.groupingBy(Aluno::recu
perarNaturalidade ,
this.nome = nome;
Collectors.toSet()));
this.CNPJ = CNPJ;
this.departamentos = new ArrayList System.out.println ("Resultado
( ); do agrupamento por
naturalidade: ");
this.discentes = new ArrayList<> (
); } agrupamento.forEach (( String
public void criarDepartamento ( chave , Set < Aluno >
String nomeDepartamento ) { conjunto) ->
System.out.println (chave + " As interfaces providas são genéricas, o que significa
= " + conjunto )); } que precisarão ser especializadas.

Ainda de acordo com a Oracle America Inc. (2021),


Código: Agrupamento com o uso do método
a API Java provê uma interface de coleções chamada
“groupingBy” (assinatura 3).
Collection Interface, que encapsula diferentes tipos
de coleção: “Set”, “List”, “Queue e “Deque” (“Map”
public void agruparAlunos ( não é verdadeiramente uma coleção) . Há, ainda, as
double a ) { coleções “SortedSet” e “SortedMap”, que são,
Map < String , Set < Aluno > > essencialmente, versões ordenadas de “Set” e “Map”,
agrupamento = respectivamente.
discentes.stream().collect(Col
lectors.groupingBy(Aluno::recu
- SET: Trata-se de uma abstração
perarNaturalidade ,
TreeMap::new , matemática de conjuntos. É usada para
Collectors.toSet())); representar conjuntos e não admite
System.out.println ("Resultado elementos duplicados.
do agrupamento por - LIST : Implementa o conceito de listas e
naturalidade: "); admite duplicidade de elementos. É uma
agrupamento.forEach (( String coleção ordenada e permite o acesso direto
chave , Set < Aluno > ao elemento armazenado, assim como a
conjunto) -> definição da posição onde armazená-lo. O
System.out.println (chave + " conceito de Vetor fornece uma boa noção
= " + conjunto )); } de como essa coleção funciona.
- QUEUE: Embora o nome remeta ao
A diferença sintática para a segunda assinatura é conceito de filas, trata-se de uma coleção
apenas a existência de um terceiro parâmetro no que implementa algo mais genérico. Uma
método “groupingBy”: “TreeMap::new”. Esse “Queue”” pode ser usada para criar uma
parâmetro vai instruir o uso do mecanismo fila (FIFO), mas também pode
“TreeMap” na instanciação de “Map” implementar uma lista de prioridades, na
(“agrupamento”). qual os elementos são ordenados e
consumidos segundo a prioridade e não na
ordem de chegada. Essa coleção admite a
→ COLEÇÕES criação de outros tipos de filas com outras
regras de ordenação.
- DEQUE: Implementa a estrutura de dados
Coleções, por vezes chamadas de Containers, são conhecida como Deque (Double Ended
objetos capazes de agrupar múltiplos elementos em Queue). Pode ser usada como uma fila
uma única unidade. Sua finalidade é armazenar, (FIFO) ou uma pilha (LIFO). Admite a
manipular e comunicar dados agregados. inserção e a retirada em ambas as
extremidades.
Como dissemos, “Map” não é verdadeiramente uma aos modificadores de acesso, que já vimos
coleção. Esse tipo de classe cria um mapeamento anteriormente.
entre chaves e valores, conforme vimos nos diversos
exemplos da subseção anterior. Além de não admitir Todos os métodos utilizados para recuperar valor de
chaves duplicadas, a interface “Map” mapeia uma variáveis ou para defini-los são métodos de acesso!
chave para um único valor
A sintaxe do comando “if” é a seguinte:
⤿Módulo 3: Reconhecer os ambientes de
desenvolvimento em Java e as principais estruturas
da linguagem if ( < expressão> )
bloco;
→ JAVA VERSUS C/C++: UM BREVE
[else
COMPARATIVO
bloco;]

Segundo Bjarne Stroustrup, a linguagem C++ e a


Java não deveriam ser comparadas, pois tem
A sintaxe de “switch”:
condicionantes de desenvolvimento distintas.

A Java não é uma linguagem independente de switch ( < expressão> ) {


plataforma, ela é uma plataforma! case < valor 1>:
bloco;
Mas e a linguagem C? break;
. . .
É aderente ao paradigma de programação case :
estruturada, ou seja, não possui conceito de classes
bloco;
e objetos. E a Java e C++ são linguagens OO.
break;
default:
→ ESTRUTURA E PRINCIPAIS COMANDOS DE
UM PROGRAMA EM JAVA bloco;
break; }
Na linguagem C/C++, o ponto de entrada para a
execução do programa é a função “main”.
A estrutura “while” tem a seguinte sintaxe:
Na Java, o ponto de entrada não é obrigatório para
compilar o programa. while ( < expressão> ){
bloco;
Os métodos de acesso são as mensagens trocadas }
entre objetos para alterar seu estado. Eles, assim
como os demais métodos e atributos, estão sujeitos
Estrutura de repetição − "while".

class Base {
public static void main
(String args []) {
private int controle = 0;
do {
System.out.println(controle);
controle++;
}while ( controle < 10 ); }
}

A estrutura “do-while” tem funcionamento parecido.


Todavia, ao contrário de “while”, nessa estrutura o
bloco sempre será executado ao menos uma vez. A
sua sintaxe:

do {

bloco;
} while ( < expressão> );

A última estrutura de repetição que veremos é o laço


“for”. A sua sintaxe é:

for ( inicialização ;
expressão ; iteração ) {
bloco; }

Você também pode gostar