NOTAS DO PROFESSOR 📖 O ecossistema Java em 2026 Importa que os formandos percebam o papel das versões LTS: são as que recebem suporte prolongado e as que as empresas usam em produção. O OpenJDK gratuito remove a barreira de licenciamento. Distinguir `java` (executar) de `javac` (compilar) prepara o conceito de código compilado que vem a seguir. 🗣️ Pontos a desenvolver oralmente • Explicar o que significa LTS e porque não se escolhe sempre a versão mais recente. • Clarificar que existem vários distribuidores de OpenJDK, todos compatíveis. • Referir que a escolha entre Maven e Gradle não muda o código, só o build.
NOTAS DO PROFESSOR 📖 O ciclo compilar-executar Ao contrário de Python, Java é compilado: o `javac` transforma o `.java` em bytecode `.class` que a JVM executa. Este passo extra deteta muitos erros antes do programa correr. A rigidez do `public static void main` e do nome de classe igual ao ficheiro confunde no início, mas é previsível. 🗣️ Pontos a desenvolver oralmente • Demonstrar os dois passos (`javac` depois `java`) e mostrar o ficheiro `.class` gerado. • Explicar o papel da JVM como camada que torna Java multi-plataforma. • Decompor `public static void main(String[] args)` palavra a palavra.
NOTAS DO PROFESSOR 📖 Convenção sobre configuração O Maven impõe uma estrutura de pastas padrão que todos os projetos Java seguem, o que torna qualquer projeto familiar. O `pom.xml` centraliza dependências e build, evitando descarregar bibliotecas à mão. A correspondência entre packages e pastas é obrigatória e merece ênfase. 🗣️ Pontos a desenvolver oralmente • Mostrar que `src/main` é o código e `src/test` os testes, por convenção. • Explicar como o Maven descarrega dependências automaticamente do repositório central. • Ligar a estrutura de pastas `com/exemplo` à declaração de `package`.
NOTAS DO PROFESSOR 📖 Tipagem estática e tipos primitivos Em Java cada variável tem um tipo fixo declarado, e o compilador rejeita atribuições incompatíveis. A distinção entre primitivos (int, double) e objetos (String) é central. O `var` infere o tipo mas continua estático — não torna Java dinâmico como Python. 🗣️ Pontos a desenvolver oralmente • Explicar a diferença entre primitivos e tipos de referência (objetos). • Mostrar os sufixos `L` e `f` e porque são necessários. • Esclarecer que `var` só funciona em variáveis locais com valor inicial.
NOTAS DO PROFESSOR 📖 O perigo da divisão inteira O caso `10 / 3` dar 3 (e não 3.333) é um erro clássico: quando ambos os operandos são inteiros, o resultado é inteiro. Basta um ser `double` para obter resultado real. Convém também distinguir `==` (comparação) de `=` (atribuição), confusão frequente. 🗣️ Pontos a desenvolver oralmente • Demonstrar `10 / 3` vs `10.0 / 3` e explicar a promoção de tipos. • Avisar que `==` em objetos compara referências, não conteúdo (preparar `.equals`). • Mostrar o curto-circuito de `&&` e `||`.
NOTAS DO PROFESSOR 📖 O switch moderno é mais seguro O switch com seta (`->`) eliminou o velho problema do "fall-through" que obrigava a escrever `break` em cada caso. Além disso pode devolver um valor diretamente, o que o torna mais expressivo. As chavetas são obrigatórias mesmo em blocos de uma linha, ao contrário de Python. 🗣️ Pontos a desenvolver oralmente • Contrastar o switch novo com o antigo e o bug do `break` esquecido. • Mostrar como agrupar vários casos com vírgulas. • Reforçar o papel das chavetas para delimitar blocos.
NOTAS DO PROFESSOR 📖 Três formas de iterar O `for` tradicional dá controlo total sobre o índice; o enhanced for (foreach) é mais limpo quando só se quer percorrer elementos; o `while` serve quando o número de iterações é desconhecido. Convém ensinar a escolher o ciclo certo conforme a situação, não usar sempre o mesmo. 🗣️ Pontos a desenvolver oralmente • Mostrar quando o foreach é preferível ao for tradicional. • Demonstrar o erro de off-by-one (usar `<=` em vez de `<`). • Ligar o foreach às coleções que virão no bloco seguinte.
NOTAS DO PROFESSOR 📖 A classe como unidade fundamental de Java Em Java tudo vive dentro de classes. Esta primeira classe junta os pilares da OOP: atributos privados (estado), construtor (inicialização) e métodos (comportamento). O `this` distingue o atributo do parâmetro com o mesmo nome — ponto a explicar com calma. 🗣️ Pontos a desenvolver oralmente • Explicar porque os atributos são `private` por omissão (encapsulamento). • Esclarecer o papel do construtor e o uso de `this`. • Distinguir o molde (classe) das instâncias criadas com `new`.
NOTAS DO PROFESSOR 📖 Criar e usar objetos O `new` aloca um novo objeto e chama o construtor. O acesso ao estado faz-se através de métodos públicos (getters), nunca diretamente aos campos privados. Este padrão getter/setter é tão omnipresente em Java que as IDEs o geram automaticamente. 🗣️ Pontos a desenvolver oralmente • Demonstrar a geração automática de getters/setters na IDE. • Explicar a vantagem de aceder via método: permite validar ou alterar lógica depois. • Mostrar que cada `new` cria um objeto independente com o seu estado.
NOTAS DO PROFESSOR 📖 Herança e reutilização de código O `extends` permite que uma classe herde atributos e métodos da mãe, e o `super` invoca a versão da mãe — tanto no construtor como num método sobreposto. A anotação `@Override` é mais do que decoração: faz o compilador verificar que realmente se está a sobrepor um método existente. 🗣️ Pontos a desenvolver oralmente • Explicar a obrigatoriedade de chamar `super(...)` no construtor da subclasse. • Mostrar como `@Override` deteta erros de assinatura mal escrita. • Distinguir estender (herança) de implementar (interface), que vem a seguir.
NOTAS DO PROFESSOR 📖 Contratos sem implementação A interface define o que uma classe deve fazer, sem dizer como. É a forma de Java garantir que classes distintas partilham um conjunto de comportamentos, permitindo polimorfismo. Como uma classe só herda de uma mãe mas implementa várias interfaces, são a solução para "herança múltipla" de comportamento. 🗣️ Pontos a desenvolver oralmente • Contrastar interface (contrato) com classe abstrata. • Explicar os métodos default e porque foram acrescentados no Java 8. • Dar um exemplo de código que trabalha com o tipo interface, não com a classe concreta.
NOTAS DO PROFESSOR 📖 Controlar visibilidade e comportamento Os modificadores de acesso definem quem pode usar cada membro, sustentando o encapsulamento. Os modificadores não-de-acesso (`static`, `final`, `abstract`) alteram comportamento: `static` pertence à classe, `final` impede alteração, `abstract` obriga a especializar. Dominar estes conceitos é essencial para ler código real. 🗣️ Pontos a desenvolver oralmente • Esclarecer a diferença entre membro de instância e membro `static`. • Dar exemplos práticos de `final` (constantes, classes não-extensíveis). • Explicar porque uma classe `abstract` não pode ser instanciada diretamente.
NOTAS DO PROFESSOR 📖 Listas dinâmicas com generics O `ArrayList` é a lista de tamanho variável do dia-a-dia, ao contrário dos arrays fixos. Os generics `<String>` garantem em tempo de compilação que só entram elementos do tipo certo. Convém programar para a interface `List` e não para a implementação `ArrayList`. 🗣️ Pontos a desenvolver oralmente • Contrastar arrays de tamanho fixo com o ArrayList dinâmico. • Explicar o valor dos generics para apanhar erros de tipo cedo. • Mostrar porque se declara `List` e se instancia `ArrayList`.
NOTAS DO PROFESSOR 📖 Associações chave-valor O `HashMap` é o equivalente Java ao dicionário: guarda pares chave→valor com acesso rápido. A iteração faz-se sobre o `entrySet()`, que dá acesso simultâneo a chave e valor. Convém alertar que a ordem de iteração não é garantida num HashMap. 🗣️ Pontos a desenvolver oralmente • Mostrar `get`, `put` e `containsKey` como operações essenciais. • Explicar o padrão `Map.Entry` para percorrer o mapa. • Referir alternativas ordenadas (LinkedHashMap, TreeMap) para quando a ordem importa.
NOTAS DO PROFESSOR 📖 Coleções sem repetidos O `HashSet` rejeita silenciosamente elementos duplicados, sendo ideal para garantir unicidade. A escolha entre List, Set e Map deve guiar-se pela pergunta: a ordem importa? Há duplicados? Preciso de associar chaves a valores? Esta decisão é uma competência prática importante. 🗣️ Pontos a desenvolver oralmente • Mostrar que adicionar um duplicado não dá erro, simplesmente não acontece. • Construir uma tabela de decisão List vs Set vs Map. • Referir que igualdade no Set depende de `equals` e `hashCode`.
NOTAS DO PROFESSOR 📖 Estilo funcional sobre coleções As Streams permitem processar coleções de forma declarativa, encadeando operações (filter, map, collect) numa pipeline legível. Substituem ciclos verbosos por uma descrição do que se quer. Convém clarificar que a stream não altera a coleção original — produz um novo resultado. 🗣️ Pontos a desenvolver oralmente • Comparar a mesma transformação com um ciclo `for` e com stream. • Explicar operações intermédias (lazy) vs terminais (collect, sum). • Introduzir a sintaxe lambda `n -> n * 2` para quem vem de Python.
NOTAS DO PROFESSOR 📖 Erros recuperáveis vs erros de programação O try/catch permite reagir a falhas em runtime. A distinção Java entre checked (obrigatório declarar/apanhar) e unchecked (runtime) é particular da linguagem e merece atenção. O `finally` corre sempre, sendo o lugar para libertar recursos. 🗣️ Pontos a desenvolver oralmente • Dar exemplos concretos de checked (IOException) e unchecked (NullPointer). • Explicar porque apanhar `Exception` genérica esconde problemas. • Mostrar o try-with-resources como evolução do finally para fechar recursos.
NOTAS DO PROFESSOR 📖 Lançar e propagar exceções O `throw` levanta uma exceção e o `throws` na assinatura declara que o método pode falhar, obrigando quem chama a tratar. Criar exceções personalizadas dá mensagens de erro com significado de negócio (SaldoInsuficiente), muito mais úteis do que erros genéricos. 🗣️ Pontos a desenvolver oralmente • Distinguir `throw` (ação) de `throws` (declaração na assinatura). • Justificar quando vale a pena criar uma exceção personalizada. • Mostrar como a mensagem da exceção ajuda na depuração.
NOTAS DO PROFESSOR 📖 A API moderna de ficheiros A classe `Files` do pacote NIO tornou a leitura de ficheiros trivial: uma linha para ler tudo ou todas as linhas. Convém referir que estes métodos lançam `IOException`, uma checked exception que tem de ser tratada. Para ficheiros muito grandes há alternativas que não carregam tudo na memória. 🗣️ Pontos a desenvolver oralmente • Mostrar a evolução face às antigas classes de I/O baseadas em streams. • Avisar sobre o consumo de memória ao ler ficheiros enormes de uma só vez. • Ligar a `IOException` ao tema das checked exceptions.
NOTAS DO PROFESSOR 📖 Escrever e acrescentar Por omissão, escrever num ficheiro substitui todo o conteúdo; é preciso a opção `APPEND` para acrescentar sem apagar. Esta distinção é fonte frequente de perda acidental de dados. Convém demonstrar os dois comportamentos lado a lado. 🗣️ Pontos a desenvolver oralmente • Avisar que `writeString` sem APPEND apaga o que já lá estava. • Mostrar o caso de uso típico de APPEND: ficheiros de log. • Reforçar que escrever em ficheiro também pode lançar IOException.
NOTAS DO PROFESSOR 📖 Ligar a aplicação à base de dados O JDBC é a ponte entre Java e a base de dados relacional. O try-with-resources garante que a ligação e os statements são fechados automaticamente — fundamental para não esgotar ligações. O `ResultSet` percorre as linhas devolvidas com `next()`. 🗣️ Pontos a desenvolver oralmente • Explicar a importância de fechar ligações e como o try-with-resources ajuda. • Mostrar o padrão de iterar o ResultSet com `while (rs.next())`. • Referir que em projetos reais se usa muitas vezes uma camada ORM por cima do JDBC.
NOTAS DO PROFESSOR 📖 Parâmetros protegem contra SQL injection Os placeholders `?` separam o comando SQL dos dados, impedindo que input malicioso altere a query. Esta é uma das lições de segurança mais importantes do curso. Concatenar valores diretamente na string SQL é uma vulnerabilidade clássica que nunca se deve cometer. 🗣️ Pontos a desenvolver oralmente • Demonstrar como uma string concatenada permite SQL injection. • Explicar que `setString`/`setDouble` tratam o escaping automaticamente. • Ligar este tema à responsabilidade profissional de proteger dados.
NOTAS DO PROFESSOR 📖 Convenções tornam o código universal Estas convenções de nomenclatura são seguidas por toda a comunidade Java, pelo que respeitá-las torna o código imediatamente legível por qualquer programador. Não são impostas pelo compilador, mas desviar delas marca código amador. As IDEs avisam quando se quebra a convenção. 🗣️ Pontos a desenvolver oralmente • Mostrar como a IDE sinaliza nomes fora da convenção. • Explicar que nomes descritivos valem mais do que abreviaturas curtas. • Ligar a convenção de packages à estrutura de pastas vista antes.
NOTAS DO PROFESSOR 📖 Gerir dependências de forma declarativa Cada `<dependency>` é identificada por grupo, artefacto e versão — as coordenadas que o Maven usa para descarregar a biblioteca. O `<scope>test</scope>` indica que o JUnit só é necessário durante os testes, não em produção. Isto evita o caos de gerir JARs manualmente. 🗣️ Pontos a desenvolver oralmente • Explicar as três coordenadas: groupId, artifactId, version. • Mostrar o significado dos scopes (compile, test, provided). • Demonstrar como acrescentar uma nova dependência e o Maven a descarrega.
NOTAS DO PROFESSOR 📖 Java como porta de entrada para o mundo enterprise Este resumo recapitula os pilares: OOP rigorosa, coleções tipadas, tratamento de erros e acesso a dados. Vale a pena sublinhar que estas bases sustentam frameworks como Spring Boot e o desenvolvimento Android, abrindo caminhos de carreira concretos. A disciplina da tipagem estática é um investimento que compensa em projetos grandes. 🗣️ Pontos a desenvolver oralmente • Pedir aos formandos que comparem Java com outra linguagem que conheçam. • Apontar Spring Boot e Android como destinos naturais de aprofundamento. • Reforçar que a rigidez de Java é um aliado em equipas e projetos de longa vida.