Repositório do curso Especialista Java da Algaworks. https://www.algaworks.com/
Um software deveria ser capaz de rodar em diferentes máquinas.
As plataformas incluem um mecanismo de execução de programas (VM), um compilador, um conjunto de bibliotecas e ferramentas. As principais são o Java SE, Jakarta EE, Java ME e Java Card.
Java SE -> conjunto de apis, desenvolvimento da maior parte das aplicações desktop e servidores Jakarta EE -> plataforma guarda-chuva (jakarta servlet, JPA, bean validation, CDI)
Especificação: documentação detalhada de como uma tecnologia deve funcionar - blueprint, padrão Implementação: tecnologia de fato que implementa um especificação (ex: hibernate é a implementação do jakarta persistence)
Software que roda o código pré-compilado (traduz para a linguagem nativa de máquina).
Um programa escrito em C: Código-fonte -> Binário -> Sistema Operacional (binários diferentes para cada sistema operacional)
A JVM emula uma máquina física e permite executar códigos pré-compilados (não compilado nativamente). Independe do sistema operacional e arquitetura do sistema.
Código-fonte -> ByteCode -> Binário -> Sistema Operacional
ByteCode: não é legível para humanos e nem interpretável pela máquina, apenas a JVM consegue entender e traduzir as instruções. É necessário possuir a JVM compatível com o sistema operacional.
O formato do arquivo bytecode é .class, e pode ser gerado através do comando javac em uma classe .java.
Não há relação entre a linguagem Java e o Bytecode. Pode ser escrito em qualquer linguagem (por exemplo, Kotlin).
Mas a interpretação dos programas não torna lenta a execução? R: Sim, quando comparado com a compilação para código nativo. Mas isso é minimizado pelo JIT (Just In Time compiler), que pode transformar código em código nativo se achar necessário em tempo de execução, melhorando a velocidade.
JRE (Java Runtime Environment) Ambiente de execução Java completo, que contém a JVM, Class Loader, bibliotecas padrão.
JDK (Java Development Kit) Inclui o compilador, ferramentas, utilitário e a JRE.
JDK(JRE(JVM))
Feature release -> versão que dura 6 meses e tem suporte por tempo curto (ideal atualização imediata) LTS -> Long Term Support: atualizações gratuitas por um longo período.
Java 17: setembro/2021 (atualizações gratuitas até, no mínimo, 2029).
JCP - Java Community Process Comunidade de desenvolvimento de Java. Não implementa o produto, só define como vai funcionar, e uma empresa ou instuição fará a implementação.
JSR - Java Specification Request Define especificações que as implementações devem seguir. Java SE reúne várias JSRs.
OpenJDk: prova conceito, mostra uma exemplo de implementação - e pode ser usada em produção.
ESPECIFICAÇÃO JAVA SE (JSRs)
|
V
OPEN JDK
(implementação de referência) - não é a distribuição
|
V
Fornecedores fazem build do OpenJDK e criam uma distribuição
Oracle OpenJDK, Oracle JDK, Amazon Corretto, Eclipse Temurin
OpenJDK Oracle -> evitar usar em produção pela falta de suporte a longe prazo.
Neste projeto, será usada a distribuição Eclipse Temurin 17.0.2.
javac Classe.java
Dará origem a um arquivo com extensão .class.
java Classe
ou java Classe.java
, caso não tenha sido compilada de antemão, executa a classe.
Tipo | Bits | Mínimo | Máximo |
---|---|---|---|
boolean | 1 | false | true |
char | 16 | 0 | 2^16 - 1 |
byte | 8 | -2^7 | 2^7 - 1 (127) |
short | 16 | -2^15 | 2^15 - 1 (32_767) |
int | 32 | -2^31 | 2^31 - 1 (2_147_483_647) |
long | 64 | -2^63 | -2^63 - 1 |
float | 32 | - | - |
double | 64 | - | - |
- o literal numérico inteiro é sempre int, a não ser que seja declaradamente long (L).
- o literal numérico decimal é sempre double, a não ser que seja declaradamente float (f).
A conversão de um tipo maior para um menor, mesmo de um número que caiba, estoura o seguinte erro:
error: incompatible types: possible lossy conversion from long to int
É possível forçar o casting:
long x = 10;
int y = (int) x; //casting
Entre ponto flutuante e inteiro também é necssário deixar explícito o casting:
double x = 100;
int y = (int) x; //casting
Operações aritméticas entre variáveis de tipos diferentes, o resultado sempre será igual ao tipo maior.
long x = 10;
int y = 5;
long resultado = x*y; // será do tipo long
Para operações entre inteiros e ponto flutuante (ex. long x float), o resultado vai ser sempre o ponto flutuante.
long x = 10;
float y = 5f;
float resultado = x*y; // será do tipo float
Para operações usando inteiros que resultem em pontos flutuantes:
int x = 10;
int y = 3;
float resultado = x/y; // resultado 3.0
Compila normalmente, resultado é um número inteiro. A operação é feita usando tipos int, então o resultado é um int, ainda que colocado numa variável tipo float. A atribuição é feita depois do cálculo.
Se eu quiser que seja dividido como um número de ponto flutuante, devo dividir por float:
int x = 10;
float resultado = x/3f; // resultado 3.333
Basta digitar jshell no terminar e assim é possível utilizar comandos java. É possível declarar variáveis, ver valor de variáveis (/vars) e realizar operações aritméticas.
jshell
Quando falamos em tipos primitivos, as variáveis SEMPRE precisam ter valor. O código não compila.
Erro variable might not have been initilized
.
Funcionamento do switch: um case encontrado, executa a instrução encontrada e todas as seguintes.
Para sair após encontrar um caso é necessário usar a expressão break
.
Interrompe a execução -> sai do switch.
-
Break: interrompe totalmente a execução de uma estrutura de repetição.
-
Continue: interrompe a atual iteração, iniciando a repetição seguinte.
Atribuição de variáveis diretamente através do switch:
String horarioFuncionamento = switch (diaSemana) {
case "seg", "ter", "qua", "qui", "sex" -> "Fechado";
case "sab", "dom" -> "09:00 às 16:00";
default -> "fechado";
};
Utilização de lógica dento do case:
System.out.printf("Horário de funcionamento: %s%n", switch (diaSemana) {
case "seg" -> {
if (mes == 12) {
yield "08:00 às 16:00";
}
yield "Fechado";
}
case "sab", "dom" -> "08:00 às 12:00";
default -> "Dia inválido";
});
option + ↑
> aumenta a seleção de código a partir da linha
option + ↓
> diminui a seleção de código
cmd + d
> duplica o código selecionado
cmd + delete
> deleta a linha inteira
option + delete
> deleta à esquerda do ponto da palavra
shift + enter
> cria uma nova linha sem quebrar a que você está
shift + cmd + U
> toggle case
Watches
Clicando no + no debugger, é possível acompanhar (watch) uma expressão para monitorar alteração de valor, por exemplo. (shift+command+enter) ou botão direito > new watch. 👓
🚨 Os watches ficam entre execuções do debugger.
Loggers
É possível alterar um breakpoint para que ele crie logs durante a execução.
Botão direito no breakpoint >> tirar a marcação 'Suspend' para não parar a exec >> Log 'evaluate and log' e podemos colocar uma expressão
Classificam as linguagens pela sua forma de funcionar
IMPERATIVA - muda o estado através de comandos passo a passo
PROCEDURAL: especifica as instruções passo a passo, executadas em ordem
* suporte a procedimentos
* variáveis
* (Java também é procedural)
ORIENTADA A OBJETOS:
* Simula o mundo real dentro do mundo computacional
* Estruturas reais ou abstratas
* diversas linguagem usam o paradigma da POO
DECLARATIVA - declara a lógica do processamento, sem descrever o como
FUNCIONAL:
* função é uma expressão que tem entrada e saída
* a partir do java 8 temos muito suporte à prog. funcional
REATIVA:
* foco no desenvolvimento de código assíncrono e não-bloqueante
teste