Computação 2  —   Linguagem Java   —  2018/1

Página principal

Informações


Conteúdo das aulas

19/03


Laboratório: conversa inicial sobre o curso.
Ambiente de programação: usar uma IDE (Eclipse, BlueJ, IntelliJ etc.) ou compilar diretamente um arquivo com o código via linha de comando (modo Terminal).
O método main: public static void main(String[] args). Imprimindo na tela com System.out.print() e System.out.println().
Primeiro programa (aka Hello World).  
 

21/03


Sintaxe básica muito similar a C. Tipos primitivos, loops, condicionais, expressôes booleanas, operadores lógicos e aritméticos. Arrays.
Imprimindo todos os divisores de um número.  
 

23/03


Classes. Atributos e métodos. Construtor. O operador == e o método equals().
Uma primeira classe nossa: Fracao.  
 

26/03


Laboratório: exercícios envolvendo a classe Fracao criada em sala de aula, e a nova classe MatematicaBasica.  
 

28/03


Strings em Java. Alguns métodos úteis da classe String. StringBuffer e StringBuilder.  
 

02/04


Laboratório: exercício com Strings (identificar palíndromos). Mais de uma classe no mesmo programa (classes Aluno e Escola).  
 

04/04


Encapsulamento, modificadores de visibilidade.
Exemplo: classe Album, para modelar o preenchimento de um álbum de figurinhas.  
 

06/04


Getters e setters, consistência do estado interno.
Implementação em sala de aula da classe Album e de um programa que a utiliza para encontrar o número de médio de figurinhas que precisa ser adquirido até que um álbum com n figurinhas distintas seja completado. Código no GitHub.  
 

09/04


Laboratório:
1) Baixe o arquivo Album.java do GitHub.
2) Modifique a classe Album da seguinte forma: ao invés de um atributo int[] figurinhas, passe a usar um atributo boolean[] figurinhas, que indicará na j-ésima posição se a figurinha j pertence ao álbum; crie um atributo int[] repetidas, que indicará na posição j a quantidade de repetidas daquela figurinha j.
3) Modifique toda a classe Album para manter as funcionalidades existentes após as modificaçes estruturais do item 2.
4) Crie uma classe Figurinha, com os atributos posicao (inteiro), urlDaImagem (texto) e frequenciaRelativa (inteiro de 1 a 20). O construtor deve receber os dois primeiros atributos como parâmetro. O valor default do terceiro atributo é 10.
5) Crie getters para os três atributos.
6) Crie um setter para o terceiro atributo.
7) Crie uma classe Editora, com os atributos totalDeFigurinhas (inteiro) e figurinhas (array para Figurinha). O construtor deve receber o valor do primeiro atributo como parâmetro, e deve criar todas as figurinhas do álbum no.
8) Crie um método, em Editora, chamado fornecerFigurinhaAleatoria(), que retorna um objeto Figurinha escolhido uniformemente dentre todos aqueles do álbum completo que foi criado quando a Editora foi construída.
9) Modifique novamente a classe Album, trocando o atributo boolean[] figurinhas, criado por você no item 2, pelo atributo Figurinha[] figurinhas.
10) Modifique toda a classe Album para funcionar corretamente com o novo atributo criado no item 9. No main(), o sorteio de cada nova figurinha ser solicitado à Editora do album.  
 

11/04


Referências (objetos como ponteiros). Atribuições, passagem de objetos como parâmetros.
Objetos não mais referenciados. O Garbage Collector do Java.
 
 

13/04


Herança e polimorfismo. Estendendo classes. Métodos abstratos e classes abstratas. Override e overload.
Exemplo: classes Veiculo, Carro extends Veiculo, Bicicleta extends Veiculo, CarroDeFormula1 extends Carro.  
 

16/04


Laboratório:
1) Crie a classe Pessoa, com alguns atributos privados (cpf, nome, anoNascimento), getters e setters.
2) Crie a classe Aluno, herdando de Pessoa, com alguns atributos extras.
3) Crie um único construtor para Pessoa, recebendo cpf e anoNascimento como parâmetros.
4) Perceba que você será agora obrigado a criar um construtor em Aluno, explicando que parâmetros passar para o construtor único de Pessoa.
5) Faça um override em toString(), na classe Pessoa, formatando adequadamente seus atributos.
6) Idem para a classe Aluno, que deve chamar super.toString() e em seguida acrescentar os atributos extras à string que será retornada.
PS.: Nos itens 5 e 6, use StringBuffer ou StringBuilder para as concatenações.  
 

18/04


Revisão para a P1.

Explicando a hierarquia completa de visibilidade:
private: visível apenas na própria classe;
"package local" (não usa nenhum modificador): visível de qualquer lugar, desde que dentro do mesmo package;
protected: igual ao "package local", mas visível também de qualquer subclasse não importando o package;
public: visível de qualquer lugar.

Mais sobre polimorfismo e encapsulamento: por que devemos declarar variáveis usando o tipo mais genérico possível? Foco na interface (uso/funcionalidades), não na implementação concreta.
Métodos abstract: por quê? (1) Compromisso das subclasses concretas de implementá-los. (2) A própria classe abstrata já pode usá-los, sem sequer saber como serão implementados!

Exemplo: implementação das classes Veiculo (abstract), Carro e Transportadora. Código feito em sala de aula no GitHub.  
 

20/04


P1.  
 

25/04


Resolução da prova em sala de aula.
Composição versus agregação.  
 

27/04


Interfaces.
O exemplo do cofre para objetos que tenham "valor" e "volume".  
 

02/05


De volta ao álbum de figurinhas. Queremos agora um álbum de selos, que lide com a classe Selo, ao invés de lidar com a classe Figurinha. Como fazer?
(1) CTRL-C, CTRL-V. Terrível, por vários motivos.
(2) Classe comum, da qual Figurinha e Selo herdariam. Pode ser filosoficamente ruim, pode não ser possível (por incorrer em herança múltipla), pode implicar um refactoring grande e indesejado.
(3) Uso de interface. Basta assegurar que tanto Figurinha quanto Selo tenham o comportamento exigido.  
 

04/05


Generics em Java. O exemplo do álbum "genérico" sem os inconvenientes de se permitir colecionar figurinhas e selos no mesmo álbum, e sem exigir type cast (possível RuntimeException).
 
 

07/05


Laboratório:
Modele uma aplicação financeira, que recebe qualquer objeto que tenha valor como aporte inicial, e pode retorná-lo a qualquer instante. Essa aplicação precisa saber incorporar rendimento, descontar taxa de administração, aceitar novos depósitos e retiradas, retornar saldo corrente e retornar o rendimento acumulado. Ela também precisa ter um titular, que pode ser uma pessoa física ou jurídica. Alguns tipos de aplicação são aplicação a juros simples, aplicação a juros compostos, aplicação a juros compostos com sorteio de bônus.

Pense em dois casos: (1) a aplicação sempre receberá depósitos do mesmo tipo que o aporte inicial; e (2) a aplicação aceita depósitos variados de qualquer tipo.
Como isso poderia alterar a modelagem?  
 

09/05


O package java.util. A interface List e a classe ArrayList. Implementação do álbum genérico usando ArrayList ao invés de um array T[].  
 

11/05


Ainda no package java.util. A interface Set e a classe HashSet. Noções de complexidade de algoritmos. O problema do par que soma k.  
 

14/05


Laboratório:
Crie uma classe Bingo com os métodos públicos sortearProximo(), listarTodos() e zerar(), modelando sorteios de uma urna de bolas numeradas de um a n (passado no construtor), sem reposição. Pense em maneiras diferentes de implementar o que deseja. Em pelo menos uma delas você deve usar exclusivamente ArrayLists, nada mais.
Na classe principal, simule, para vários valores de n, um jogo com n/2 sorteios, comparando suas diferentes implementações.  
 

16/05


Implementação em sala de aula de quatro estratégias diferentes para o problema do Bingo. Mais noções de complexidade. O Knuth shuffle, implementado em Collections.shuffle(List).

Código feito em sala de aula no GitHub.  
 

18/05


Sets com chaves inteiras implementados sobre arrays com endereçamento direto.
A interface Map. Hash maps.  
 

21/05


Laboratório:
1) Implemente uma função para descobrir se duas Strings são anagramas uma da outra.
2) Implemente uma função que receba uma lista de Strings e retorne se há algum par de Strings na lista que são uma anagrama da outra.
3) Escreva testes unitários e testes de performance.  
 

23/05


Override da métodos não-abstratos da classe-mãe.
Lazy instantiation.
Unit tests. JUnit.  
 

Voltar ao topo