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

Página principal

Informações


Conteúdo das aulas

02/12


Introdução ao curso.
Semelhanças com a sintaxe de C. Declaração de variáveis e funções (métodos public static), loops, condicionais.
Primeiro programa: o nefasto Hello World.
Saída para o terminal via System.out.println() e System.out.printf().
Entrada (leitura do teclado) chamando o nextLine() e o o nextInt() de um Scanner(System.in).

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

04/12


LAB 1.

Objetivo: escrever um primeiro programa em Java, apenas para se familiarizar com o ambiente, usando apenas uma classe Principal com métodos public static.

Intruções: Seu programa deve pedir para o usuário digitar várias linhas, cada uma contendo um long e um float. O long é o DRE do aluno; o float é sua média numa determinada disciplina. Quando o usuário digitar uma média negativa qualquer, ele estará sinalizando que chegou ao fim da inserção das notas. Neste momento, seu programa deverá imprimir no console: (1) a quantidade de notas processadas; (2) a média da turma; (3) o DRE do aluno de maior média (se houver empate, pode ser qualquer um dos alunos de maior média).

Exemplo:

Entrada:
1234 8.5
2222 3.5
3333 4
4567 9.2
0 -1

Saída:
4 notas digitadas
Média da turma: 6.3
DRE com maior média: 4567
 
 

07/12


Como declarar e inicializar arrays em Java.
O tipo boolean.
Calculando raiz quadrada com o Math.sqrt().
Overload (sobrecarga) de métodos.

Cuidados com o tipo do valor de retorno de uma operação aritmética:
int / int = int
int * int = int
int / float = float
int * long = long
etc.

Medindo tempos usando System.currentTimeMillis().
Primeiras noções de complexidade de algoritmos.
Comparando dois algoritmos O(n^2) e O(n log n) para o mesmo problema (contagem de primos até certo número dado).

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

09/12


ArrayLists vs arrays.

Conversa inicial sobre Orientação a Objeto. Classe vs struct. O racional do encapsulamento.
Criando uma classe. Atributos e métodos private e public. Accessor methods (getters e setters).

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

11/12


LAB 2.

Unit tests.
Atributos final.
Construtor. Construtor default.

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

14/12


Override: reescrevendo métodos já existentes em classe ancestral. A anotação @Override.
A classe Object: ancestral de todas as classes. O método toString() da classe Object. Fazendo um override em toString().

Código feito em aula no GitHub.
Aula gravada no Google Meet: primeira parte e segunda parte

PS.: Hoje vários serviços do Google ficaram fora do ar, incluindo o Meet, e a aula precisou ser interrompida por 54 minutos, tendo sido gravada em duas partes.  
 

16/12


Comparando objetos: == vs equals().
Métodos e atributos static.

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

18/12


LAB 3.

Resolução do LAB 2.
Unit tests usando métodos privados auxiliares aos testes, atributos na classe de teste e um método de set-up anotado com @Before.

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

21/12


Herança. Polimorfismo.
A questão dos diferentes "pontos de vista".

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

23/12


Resolução do LAB 3.
Atribuição de objetos: cópia de referências.

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

04/01


Revisão geral: criando uma loja virtual, projeto que usaremos em muitos momento nas aulas que se seguirão.

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

06/01


Criando uma superclasse Produto para desacoplar Loja e Livro, permitindo a venda de outros tipos de Produto como, por exemplo, CD.
Veja este commit para a solução obtida.

Qual o problema/inconveniente dessa solução? Ela mexe na hierarquia das classes, o que pode ser indesejável, ou mesmo impossível, já que Java não suporta herança múltipla (herdar de mais de uma classe). Solução: o conceito de interface.

Criando uma interface Vendavel e fazendo com que Livro, CD e Bicicleta (esta última já herdando de Veiculo) implementem a interface Vendavel.

O código final feito em aula pode ser visto no GitHub.
Aula gravada no Google Meet.  
 

08/01


LAB 4.

Herdando de classes que não são nossas. Exemplo: "Pacotinho" (de figurinhas do álbum) herdando de ArrayList.
Composição versus Agregação versus Herança: algumas considerações importantes.

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

11/01


Outros usos de interface. Integrando partes diferentes do sistema (entre equipes), permitindo que classes que têm possivelmente pouco em comum possam fornecer "serviços" em comum.

Interface herdando de interface.

Métodos e classes abstract.

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

13/01


Mais sobre métodos e classes abstratos. Quando usá-los?

Duas soluções para o LAB 4: uma com array e uma com ArrayList.

Mais sobre arrays e ArrayLists.

Arrays:
- podem ser usados com tipos primitivos ou objetos;
- não precisam ser inicializados para que todas as suas posições (entre 0 e seu length - 1) estejam acessíveis para leitura e escrita;
- comportam no máximo a quantidade de elementos para a qual foram dimensionados; se precisar de mais espaço será preciso criar outro array e copiar tudo;
- não te permitem saber quantos elementos já foram de fato escritos no array; é preciso controlar com variável externa, ou usar algum tipo de esquema do tipo "o primeiro null encontrado indica que não há mais nenhuma posição ocupada a partir dali";
- para efetuar uma remoção física de elemento, sem deixar um "buraco" (preenchido com null ou outra coisa qualquer) na posição que continha o elemento removido, é necessário mover explicitamente todos os elementos à direita daquela posição um passo para a esquerda.

ArrayLists:
- armazenam apenas objetos, não tipos primitivos;
- aceitam add() de quantos elementos se desejar, sem que precisem ser pré-alocados (o redimensionamento ocorre transparentemente ao usuário do ArrayList);
- possuem um método size(), que retorna a quantidade exata de elementos adicionados ao ArrayList, sem necessidade de se controlar isso por variável externa;
- fazem remoção física de forma totalmente transparente para o usuário, isto é, o usuário jamais precisará se preocupar com o "shift left";
- não permitem acesso a uma posição com índice maior ou igual ao size() lógico do ArrayList; se isso for necessário, pode-se inicializar o ArrayList com a quantidade desejada de nulls;
- fornecem uma grande quantidade de métodos convenientes para cópia, concatenação, localização de objeto no ArrayList, etc.

Inicializando um ArrayList com chamadas consecutivas ao add(valorDefault) para que já contenha todas as posições desejadas disponíveis para leitura/escrita. Esticando o tamanho lógico do ArrayList sob demanda.

Aula gravada no Google Meet.  
 

15/01


LAB 5.

Caros alunos e caras alunas, realmente não poderei estar com vocês no laboratório dessa sexta, pelo motivo que adiantei na aula passada. Por favor, aproveitem bem o tempo de vocês. O exercício está todo descrito no link acima. Abraços, Vinícius.  
 

18/01


Reaproveitando objetos que podem ser compartilhados, ao invés de criar novas instâncias sem a menor necessidade.
Introduzindo o problema que nos levará a tipos genéricos.

Código feito em aula:
evitando desta maneira criar o mesmo objeto semântico múltiplas vezes;
uma solução terrível para o problema de se ter álbuns apenas de Figurinhas e álbuns apenas de Selos.;

Aula gravada no Google Meet.  
 

22/01


Tipos genéricos (generic types). Código feito em aula no GitHub.

Resolução do LAB 5.

Aula gravada no Google Meet.  
 

25/01


Criando uma interface Mapa a partir do zero, e algumas implementações possíveis usando listas.
Dois objetivos, com isso:
- treinar muito do que foi visto até aqui (interafces, tipos genéricos com e sem restrições, discussões sobre complexidade de algoritmos)
- perceber, via testes de performance, o quão fantástica é a parformance de um hash map para as duas principais "operações de dicionário" (adicionar um par chave-valor e recuperar um valor dada uma chave).

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

27/01


Continuação da aula anterior. Novas implementações, testes comparativos.
Implementando a interface Comparable para permitir comparações (>, ==, <) entre objetos.

Código feito em aula no GitHub.
Aula gravada no Google Meet.  
 

29/01


LAB 6.
Aula gravada no Google Meet.  
 

01/02


Treinando uso do HashMap.

A interface java.util.Set, e a classe java.util.HashSet.

Código feito em aula no GitHub aqui e aqui.

Aula gravada no Google Meet.  
 

03/02


Resolução do LAB 6.

Extraindo código comum entre classes para uma superclasse abstrata.
Busca binária usando o Collections.binarySearch().
Inner classes.

Aula gravada no Google Meet.  
 

05/02


Finalização da resolução do LAB 6.

O contrato do equals() e do hashCode().

LAB 7.

Aula gravada no Google Meet.  
 

08/02


Exceções.
Capturando exceções com try...catch, relançando exceções não capturadas, declarando exceções na assinatura do método.

Código feito em aula aqui, e também em projetos mais antigos (LojaVirtual, Banco).

Aula gravada no Google Meet.  
 

10/02


Checked exceptions, runtime exceptions. Diferenças conceituais e de implementação. O try...[catch...]finally.

Código feito em aula no GitHub.

Aula gravada no Google Meet.  
 

12/02


Como testar exceções?

Código feito em aula no GitHub.

LAB 8.

Aula gravada no Google Meet.  
 

19/02


Tipos enumeráveis (o enum do Java). Quando usar? Desvantagens do modo "old school". Adicionando informações a enums.

Código feito em aula no GitHub.

LAB 9.

Aula gravada no Google Meet.  
 

22/02


Ordenando listas com o sort(). Definindo o seu próprio Comparator.

Lendo e escrevendo em arquivos.

Código feito em aula no GitHub.

Aula gravada no Google Meet.  
 

24/02


Aula de dúvidas antes da prova.

Falamos também sobre recursão e memoização, com exemplos de Fatorial e Sequência de Fibonacci, tanto recursivo quanto não-recursivo. No caso do Fibonacci precisamos usar memoização para redimir a implementação recursiva.

Falamos também de concatenação direta de Strings versus o uso do StringBuilder ou do StringBuffer.

Código feito em aula aqui e aqui.

Aula gravada no Google Meet.  
 

26/02


Prova Única.
O código de que trata a prova pode ser encontrado no GitHub.

Voltar ao topo