2

Desenvolvimento básico em Java - (Material Curso Dio)

#Java
Anderson Froes
Anderson Froes
Professores: 
André Gomes
Marco Ollivier
Gabriel Beck
Augusto Júlio
Alex Duarte

Link para Download do Artigo:
https://drive.google.com/file/d/1lwRXCMaLkPeG43FldhO7g9XftEUMCCJT/view?usp=sharing


Capitulo 1 - Preparando o ambiente para programar em Java
Java - Instalação e Ambiente
Instalação de ambiente

Instalando o Java (Linux)
sudo add -apt-repository ppa:linuxuprising/java
sudo apt install oracle-java10-installer
java --version (para verificar a versão instalada)

Instalando o Java (Windows)
https://www.oracle.com/br/java/
Entre no site e vá na aba "Faça o Download do Java" , depois desça a tela e vá na opção "JDK Download" e escolha a versão referente ao seu sistema operacional.
Após baixar o arquivo, faça a instalação do mesmo e estará pronto.

Ferramentas de build
Gradle (Linux)
https://gradle.org
Versão 4.7 - Ganhando popularidade (Android Studio)
Usa linguagem de programação Groovy
mkdir /opt/gradle
cd Global\ labs\ Academy
unzip -d /opt/gradle gradle-7.7-bin.zip
ls /opt/gradle/gradle-4.7
export PATH=$PATH:/opt/gradle/gradle-4.7/bin
sudo apt purge gradle //old versions
gradle -v

Gradle (Windows)
https://gradle.org/
Entre no site e vá na seção "1.Install Gradle" , depois desça a tela e vá na opção "Installing manually" e escolha a versão referente ao seu sistema operacional.
Cria uma nova Pasta em C:\Gradle
Dezipe o arquivo baixado dentro da pasta C:\Gradle
Agora configure o Gradle no seu Sistema Operacional com as seguintes passos:
Dê um clique direito com o mouse em no ícone (seu computador) e vá em Propriedades → Configurações avançadas do sistema → Variáveis de Ambiente
Em Variáveis do Sistema selecione (PATH) e clique em Editar.
Adicione a entrada C:\Gradle\gradle-6.8.2\bin e clique em salvar.
Para verificar a versão instalada, abra o seu command prompt e digite = gradle -v

Maven (Linux)
https://maven.apache.org/
Versão 3.5.3 - Legados do ANT
Baseado em XML
unzip -d /opt/maven apache-maven-3.5.3-bin.zip
ls /opt/maven/apache-maven-3.5.3
sudo apt purge maven //old versions
export PATH=$PATH:/opt/maven/apache-maven-3.5.3/bin
mvn -v

Maven (Windows)
https://maven.apache.org/
Entre no site e vá na seção "Download" , "Files" e escolha o Link referente ao seu sistema de Zip.
Cria uma nova Pasta em C:\Apache-Maven
Dezipe o arquivo baixado dentro da pasta C:\Apache-Maven
Agora configure o Gradle no seu Sistema Operacional com as seguintes passos:
Dê um clique direito com o mouse em no ícone (seu computador) e vá em Propriedades → Configurações avançadas do sistema → Variáveis de Ambiente
Em Variáveis do Sistema selecione (PATH) e clique em Editar.
Adicione a entrada C:\Apache-Maven\apache-maven-3.6.3\bin e clique em salvar.
A mesma caixa de diálogo pode ser usada para definir JAVA_HOME para a localização de seu JDK, por exemplo, C: \ Arquivos de programas \ Java \ jdk1.7.0_51
Para verificar a versão instalada, abra o seu command prompt e digite = mvn -v

IntelliJ IDEA (Linux)
https://www.jetbrains.com/pt-br/idea/download/
Escolha a versão referente ao seu sistema operacional e baixe a versão Community que é grátis.
cd ~/firefox
./firefox --new-instance --safe-mode
https://www.jetbrains.com/idea/
cd Global\ Labs\ Academy
sudo tar -xzf ideaIC-2018.1.4.tar.gz
cd idea-IC-181.5087.20/bin/
./idea.sh

IntelliJ IDEA (Windows)
https://www.jetbrains.com/pt-br/idea/download/
Escolha a versão referente ao seu sistema operacional e baixe a versão Community que é grátis.
Após baixar o arquivo, faça a instalação do mesmo e estará pronto.

Observação: Ferramentas de Build
Garante a mesma versão para todos os desenvolvedores

Wrapper
https://github.com/takari/maven-wrapper
https://docs.gradle.org/current/userguide/gradele_wrapper.html

Gradle Wrapper
./gradlew -v
mvn -N io.takari:maven:wrapper
./mvnw -v

Java - Criação de Projetos
Criação de Projeto via Spring Initializr = https://start.spring.io/

Gerar um projeto via Mavem com Java e Gradle com Java
No campo Group = Nome da empresa (br.com.globallabs)
Artifacts = Nome do projeto (exemplo-maven)
Escolher Java Version = (Colocar a versão que você instalou)
Packaging = Escolher a opção Jar
Description = Colocar descrição do projeto (Primeiro exemplo usando Maven)
Colocar Dependencies = Web
Clicar em Generate Project e Salvar o arquivo
Repetir esse processo, porém agora com a opção Gradle.

Fazer Importação do Projeto Maven no IntelliJ IDEA
Abrir o aplicativo do IDEA
Import Project = Selecionar o diretório onde foi extraindo os download dos projetos criados no site da Spring Initializr e selecionar o arquivo pom.xml
Marcar opção de Import projects automatically

Detalhes arquivo pom.xml
Arquivo que trás todas informações de configuração do projeto, tais como: grupo de trabalho, nome do projeto, versão, packaging, descrição do projeto, propriedades, linguagem e dependências.

Instalar Projeto
Basta clicar na opção "Install" no campo direito do IDEA no menu Profiles(Maven)

Rodar Projeto via IDEA
Basta clicar na opção "Spring-boot-run" no campo direito do IDEA no menu Plugins(Maven)
Vai ser gerado um endereço localhost, basta abrir esse endereço no seu navegador

Rodar Projeto via Terminal
No terminal, basta ir na pasta do projeto e entrar dentro da pasta target
Executar o arquivo exemplo-maven-0.0.1-SNAPSHOT.jar com o comando = java .jar target/exemplo-maven-0.0.1-SNAPSHOT.jar

Fazer Importação do Projeto Gradle no IntelliJ IDEA
Abrir o aplicativo do IDEA
Import Project = Selecionar o diretório onde foi extraindo os download dos projetos criados no site da Spring Initializr e selecionar o arquivo build.gradle
Marcar opção de use auto-import
Escolher a versão da sua instalação do Java (JVM)

Detalhes arquivo build-gradle
Arquivo que trás todas informações de configuração do projeto, tais como: grupo de trabalho, nome do projeto, versão, packaging, descrição do projeto, propriedades, linguagem e dependências.

Instalar Projeto
Basta clicar na opção "Build" no campo direito do IDEA no menu Profiles(Gradle)

Rodar Projeto via IDEA
Basta clicar na opção "bootrun" no campo direito do IDEA no menu Tasks(Gradle)
Vai ser gerado um endereço localhost, basta abrir esse endereço no seu navegador

Rodar Projeto via Terminal
No terminal, basta ir na pasta do projeto e entrar dentro da pasta build
Executar o arquivo exemplo-maven-0.0.1-SNAPSHOT.jar com o comando = java .jar build/libs/exemplo-gradle-0.0.1-SNAPSHOT.jar

Capitulo 2 - O que precisamos saber sobre Java
O que precisamos saber sobre Java

O que é Java?
Já é uma linguagem de programação e plataforma computacional lançada em 1995 pela Sun Microsystems, por um time comandado por James Gosling. Anos depois foi adquirida pela Oracle.
Diferente de outras linguagens de programação, que são compiladas para código nativo, o Java é compilado para um bytecode que é interpretado por uma máquina virtual.

O que é o compilador?
Um compilador é um programa que, a partir de um código fonte, cria um programa semanticamente equivalente, porém escrito em outra linguagem, código objeto. Um compilador traduz um programa de uma linguagem textual para uma linguagem de máquina, específica para um processador e sistema operacional.
O nome compilador é usado principalmente para os programas que traduzem o código fonte de uma linguagem de programação de alto nível para uma linguagem de programação de baixo nível (por exemplo, Assembly ou código de máquina).

O que é o bytecode?
É o código originado da compilação de programas Java.
O bytecode é o programa interpretado e executado pela Máquina Virtual Java, JVM.

O que é a JVM?
Primeiramente explicar o que é uma VM.
Uma Máquina Virtual, ou Virtual Machine, é um software que simula uma máquina física e consegue executar vários programas, gerenciar processos, memória e arquivos. Tudo isso faz parte de uma plataforma com memória, processador e outros recursos totalmente virtuais, sem dependência do hardware.
A JVM é uma máquina virtual que executa programas Java, executando os bytecodes em linguagem de máquina para cada sistema operacional.
Em linguagens compiladas diretamente para um sistema operacional (SO) específico, esse programa não irá executar em outro SO, havendo a necessidade de compilar uma versão do software para cada SO.
Com o Java, compilamos para a JVM, o bytecode será executado pela máquina virtual, e não diretamente pelo SO, assim, o software escrito em Java possui portabilidade para qualquer sistema operacional, porém, cada JVM deve ser construída para um SO específico.

O que é a JRE?
JRE significa Java Runtime Envirnment, ou Ambiente de Execução do Java, é composto pela Java Virtual Machine (JVM), bibliotecas e APIs da linguagem Java e outros componentes para suporte da plataforma Java.
Ele represente a parte responsável pela execução do software Java.
Exemplo: sudo apt-get install openjdk-8-jre

O que é a JDK?
Java Development Kit (JDK), Kit de Desenvolvimento Java, é um conjunto de utilitários que permitem criar software para a plataforma Java. É composto pelo compilador Java, bibliotecas da linguagem, ferramentas e a JRE.
Exemplo: sudo apt-get install openjdk-8-jdk

O que é a Java SE?
Java Standard Edition (SE), é a distribuição mínima da plataforma de desenvolvimento de aplicações Java.
OpenJDK é a implementação de referência opensource da Plataforma Java, JavaSE, que ainda é mantida pela Oracle.

O que é a Java EE?
Java Enterprise Edition, é uma extensão da Java SE que possui suporte a desenvolvimento de sistemas corporativos.
Além do mínimo da plataforma, o Java EE possui diversas especificações de partes da infra estrutura de aplicações, como acesso a banco de dados, mensageria, serviços web, parser de arquivos e outras.
Servidores de Aplicações JavaEE, sabem seguir essas especificações e implementar os recursos para os usuários.
Exemplo: JBoss (RedHat), Weblogic (Oracle), WebSphere (IBM)
Glassfish = Implementação de Referência Opensource: https://javaee.github.io/glassfish

O que é a Jakarta EE?
Com a falta de investimento da Oracle no Java, ela cedeu todo o código, implementações e especificações do JavaEE para a Eclipse Foundation, mas como o nome JavaEE é uma marca registrada, foi escolhido o nome JakartaEE.
Agora a evolução da especificações e padrões do Java será feito sobre o nome JakartaEE, com compatibilidade com o JavEE.

Capitulo 3 - Características da linguagem
Iniciando um Projeto Java
Projeto - IntelliJ 2019.1 / Java 11 / Gradel 5.3.1

Criando o Projeto:
Abrir IntelliJ - Criar novo Projeto - Java - Gradle
GroupId = one.innovation.digital
ArtifactId = caracteristicas-da-linguagem
Selecionar "use auto-import" , "use default gradlw wrapper(recommended)"
Selecionar Gradle JVM = A versão instalada do seu Java

Verificando o Projeto:
Ir em File → Project Structure → Project
Verificar se está usando a versão correta do Java, e Project Language level
Verificar no build.gradle se a sourceCompatibility está no 1.11 (java)

Assuntos:
Classes, Tipos, Modificadores de acesso, Interfaces, Enums

Classes:
Main, Atributos, Métodos (Retornos, Parâmetros, Assinatura), Construtores

Tipos:
Primitivos
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Não aceitam NULL
Possuem valores default
Valores Default:
Data type: byte - Default Value: 0
Data type: short - Default Value: 0
Data type: int - Default Value: 0
Data type: long - Default Value: 0L
Data type: float - Default Value: 0.0f
Data type: double - Default Value: 0.0d
Data type: char - Default Value: '\u0000'
Data type: String (or any object) - Default Value: null
Data type: boolean - Default Value: false

Wrappers
São objetos que representam os primitivos
Auto-boxing e Unboxing

Não Primitivos
http://docs.oracle.com/javase/8/docs/api/java/lang/String.html
String
Number
Object
Qualquer outros objetos

Tipagem forte e estática
Forte e estática
var - Inferência de tipo

Modificadores de acesso:
public
public pode ser acessado de qualquer lugar por qualquer entidade que possa visualizar a classe a que ela pertence.

private
Os métodos e atributos da classe definidos como privados não podem ser acessados ou usados por nenhuma outra classe. Esses atributos e métodos também não podem ser visualizados pelas classes herdadas.

protected
Torna o membro acessível às classes do mesmo pacote ou através de herança, seus membros herdados não são acessíveis a outras classes fora do pacote em que foram declarados.

default (padrão)
A classe e/ou seus membros são acessíveis somente por classes do mesmo pacote, na sua declaração não é definido nenhum tipo de modificador, sendo este identificado pelo compilador.

abstract
Esse modificador não é aplicado nas variáveis, apenas em classes e métodos. Uma classe abstrata não pode ser instanciada. Se houver alguma declaração de um método como abstract (abstrato), a classe também deve ser marcada como abstract.

static
É usado para a criação de uma variável que poderá ser acessada por todas as instâncias de objetos desta classe como uma variável comum, ou seja, a variável criada será a mesma em todas as instâncias e quando seu conteúdo é modificado numa das instâncias, a modificação ocorre em todas as demais. E nas declarações de métodos ajudam no acesso direto à classe, portanto não é necessários instanciar um objeto para acessar o método.

final
Quando é aplicado na classe, não permite estender, nos métodos impede que o mesmo seja sobrescrito (overriding) na subclasse, e nos valores de variáveis não pode ser alterado depois que já tenha sido atribuído um valor.

Interfaces:
Métodos abstratos
Devem ser implementados por todos
Novos métodos quebram as implementações

Métodos default
São herdados a todos que implementam
Novo métodos não quebram as implementações

Herança múltipla***

Enums:
Basicamente é dicionários de dados imutável.
Não é permitido criar novas instâncias.
O construtor é sempre declarado como private.
Por convenção, por serem objetos constantes e imutáveis (static final), os nomes são em MAIÚSCULOS.

GitHub do Professor:
https://github.com/andrelugomes

Link Projeto da Aula:
https://github.com/andrelugomes/digital-innovation-one/tree/master/caracteristicas-da-linguagem-java

Capitulo 4 - Características da linguagem II
Strings e o pacote java.lang
Objetivos da aula: String, Laços, condições e Operadores, Convenções
Requisitos Básicos: Java 11, IntelliJ 2019.1, Gradel 5.3.1

Strings:
É uma sequência de caracteres
Pacote java.lang

Introdução a condicionais:
Laços, Condicionais e Operadores
IF e IF Ternário, For, While e Do/While, Operadores (Igualdade, Lógicos, Incremento, Matemáticos, Relacionais)

IF e IF Ternário:
IF = Uma palavra reservada do Java, usado para fazer condições do código.
IF Ternário = Forma de fazer todo o if e else em uma condição.

Operadores:
Operadores de Igualdade = Pode usar o operador de igualdade ==
Operadores de não igualdade = Pode usar o operador de não igualdade != ou ! na String
Operadores Matemáticos = + (soma), - (subtração), * (multiplicação), / (divisão), % (módulo)
Operadores Relacionais = > (maior que), < (menor que), >= (maior ou igual), <= ( menor ou igual)
Operadores Lógicos = && (significa e), || (significa ou)
Operadores de Incremento = + 1 ou ++ ou - 1 ou --

Laços de repetição:
For = Forma de fazer interações
Estrutura for = ( ; ; ) {}
Exemplo: for (int i = 0; i <= 10; i = i +1 {}

While = Significa a expressão enquanto, a verificação é feita antes.
Estrutura while = while (x < 1) {}

Do/While = Significa a expressão, faço uma coisa enquanto eu verifico a condição, a verificação e feito depois.
Estrutura do = do{} while (y++ <1)

Convenções de nomes:
Nomes de Classes, Nomes de Métodos, Nomes de Variáveis

Nomes de classes:
Primeira letra maiúscula e demais minúsculas
Classes com nomes compostos, primeira letra de cada nome sempre maiúscula

Nomes de Métodos:
Sempre minúsculos.
Quando for nomes compostos, primeiro nome sempre será todo minúsculo, e os compostos com a primeira letra maiúscula.

Nomes de Variáveis:
Usar nomes mais sucintos.
Sempre minúsculos.

Code Style:
Checkstyle Gradle Plugin - Plugin para verificar pequenas checks do código.
https://docs.gradle.org/current/userguide/checkstyle_plugin.html
https://github.com/checkstyle/checkstyle

PMD Gradle Plugin - Plugin para fazer analisar mais profunda no código
https://docs.gradle.org/current/userguide/pmd_plugin.html

Adicionar Plugins no Projeto:
Ir no arquivo build.gradle
Adicionar no código plugins = id 'checkstyle' , id 'pmd'

Configuração dos Plugins:
Checktyle:
toolVersion = (colocar a versão mais atual do site)
configFile = (caminho do arquivo xml do plugin baixado)

pmd:
ruleSetFiles = (caminho do arquivo xml do plugin baixado)
toolVersion = (colocar a versão mais atual do site)

Capitulo 5 - Debug de código
Debug de código
Debug usando IDEA IntelliJ
Primeiro é colocar o break no ponto desejado e logo depois rodar o debug ao invés do Run
Botão Resume vai até o próximo break-point, caso não tenha um break-point, ele vai ate encerrar.
Opção Step-Over faz o debug linha a linha.
Opção Step-Int entra dentro de algum método.
Opção Step-Out sai de algum método.
Opção Evaluete executa um código sem precisar executar a sua linha.

Capitulo 6 - Orientação a Objetos com Java
Introdução à aula
Paradigma Orientado a Objetos com Java:
Entender os principais conceitos de O.O.
Aplicar os conceitos apresentandos.
Ver características particulares ao Java.

Requisitos Básicos:
Noções básicas de lógica de programação
Noções básicas da sintaxe do Java

Agenda:
O Paradigma OO
Construtores
Encapsulamento, Herança e Polimorfismo
This, Super, Equals e HashCode

Material da Aula:
https://github.com/marcopollivier/DigitalInnovationOne-CursoBasicoJava

Parte 1: O Paradigma (Orientação a Objetos):
"A programação Orientada a Objetos impõe disciplina sobre a transferência indireta do Controle" - Robert "Uncle Bob" Martin - Livro Arquitetura Limpa
"... a pilha de chamada funções... poderia ser movida para HEAP (área de memória não necessariamente ordenada - diferente da stack) possibilitando que as variáveis locais declaradas por uma função existissem muito depois que a função retornasse..." - Robert "Uncle Bob" Martin - Livro Arquitetura Limpa
"A diferença entre um Código Procedural e um O.O é bem simples. Em códigos procedurais (...) escolher o melhor algoritmo é o mais importante (...) Já em linguagens orientado a objetos (...) pensar no projeto (...) como se encaixam (...) e como serão estendidas é o que mais importa." - Maurício Aniche - Livro Orientação a Objetos e SOLID para Ninjas

Classe:
Vamos entender uma classe como modelo a ser seguido.
Uma classe vai funcionar como uma espécie de molde que nos servirá como base para construir algo.
Por exemplo. Quando pensamos em construir uma casa, nós fazemos uma planta baixa. Ela será o modelo que utilizaremos para construir algo concreto.
As classes funcionam de forma parecida.
Vamos a um exemplo prático.

Objeto:
Agora que entendemos que temos um modelo que podemos seguir, O que podemos fazer com esse modelo?
Bom.. Nós fizemos a analogia da casa, certo ?
Depois de termos a planta baixa, nós começamos a construir.
E o resultado do que nós construímos, vamos chamar de objeto.
Quando nós utilizamos a nossa classe Pessoa - mostrada no código anterior - para criar um objeto, nós diremos que estamos instanciando um objeto da classe Pessoa.
E esse termo é bem simples de entender. O que acontece é que podemos criar vários objetos
de uma mesma classe, ou seja, várias instâncias de objetos.

Atributos:
Agora vamos pensar no que nos definimos como nome. Foi tão intuitivo nós pensarmos que uma pessoa teria um nome que nem demos importância a ele.
O nome é uma característica de uma Pessoa e pode ser diferente de pessoa para pessoa.
O nome é um atributo da pessoa.

Métodos:
Agora vamos pensar que uma pessoa pode ter ações. Por exemplo, uma pessoa pode falar.
Pensando em um cenário mais específico, uma pessoa pode falar o seu nome.
As ações que nós definimos que uma classe pode ter, nós chamamos de métodos.

Parte 2: Construtores
Podemos entender o termo construtor no sentido literal, afinal vamos construir um objeto.
Por meio de um construtor, criamos um objeto baseado em uma Classe e assim o alocamos em memória.
Ao criarmos um objeto dizemos que estamos instanciando um objeto.
Esse exemplo que acabamos de ver é o exemplo mais comum quando começamos a estudar construtores em Java.
E para instanciar essa classe (criar um objeto dela) fazemos o seguinte: Pessoa pessoa = new Pessoa();
Também podemos criar construtores parametrizados. Dessa forma, conseguimos definir um contrato onde sempre será obrigatório passar alguma informação na hora de instanciar a classe.
No exemplo abaixo temos dois construtores. Um com passagem de parâmetro e outro sem. Isso garante que possamos instanciar duas duas maneiras.

E existe um destrutor ?
Em Java não existe o conceito de destrutor explícito.
Lembra que falamos que quando instanciamos, estamos, na verdade, alocando o objeto em memória ?
Pois bem... Desalocar esse objeto fica por conta do GC.

Parte 3: Encapsulamento, Herança e Polimorfismo
Encapsulamento:
Mais uma vez vamos entender o termo que estamos trabalhando ao pé da letra.
Quando falamos de encapsulamento, estamos falando efetivamente em proteger alguma informação de alguma forma, ou seja, com uma cápsula.
Vamos ver como podemos trabalhar com o encapsulamento nos nossos exemplo anterior da Classe Pessoa.
Na nossa classe, vamos manipular basicamente 2 atributos: (nome) (data de nascimento)
Queremos garantir a nossa implementação e que o acesso a determinados dados estão realmente protegidos do acesso externo.
Para esse exemplo específico:
Queremos que o nome possa ser alterado. (vamos pensar que uma pessoa pode casar e mudar seu nome)
Não queremos alterar a data de nascimento. (a pessoa nasce com ela e não pode mudar)
Queremos de alguma forma retornar a idade da pessoa.

Herança:
Vamos agora falar de outro pilar importante da Orientação Objetos: a Herança
Como o próprio nome já diz, essa é a capacidade de uma Classe herdar o comportamento de outra.
Exemplo:
Vamos pensar em um cenário onde queremos informações de diversos tipos de veículos.
Por exemplo: quero colocar a quantidade de portas para o caso de carros e as cilindradas em casos de motocicletas.

Herança vs. Composição:
Existe um vasto e antigo debate em relação a utilização de herança. Algumas bibliografias inclusive defendem que ela nunca deve ser utilizada.
E o grande problema tem relação com o nosso tópico anterior: o encapsulamento.

Polimorfismo:
Quando falamos em herança, o verbo ser é mandatório na nossa forma de falar sobre a classe.
Entendemos, portanto, que um carro é um veículo e uma motocicleta também é um veículo.
Agora no nosso exemplo, nós queremos colocar mais uma característica e uma ação que podem ser comuns aos dois, mas com algumas peculiaridades.
Agora vamos querer calcular o valor aproximado do IPVA dos nosso diferentes tipos de veículos.
Tanto carros quanto motos pagam IPVA, certo ? E o cálculo é baseado no valor venal do veículo.
Portanto a primeira conclusão que chegamos é que temos uma característica nova na nossa Classe de Veículos, agora temos o valor venal, portanto:
Mas precisamos calcular a nossa precisão de imposto.
Vamos partir do princípio que (valores hipotéticos):
Um veículo teria que pagar, no mínimo, 0,01% do valor venal de IPVA
Um carro teria que pagar, no mínimo, 0,07% do valor venal de IPVA
Uma moto teria que pagar, no mínimo, 0,03% do valor venal de IPVA
Para isso precisaremos definir implementações diferentes de acordo com a classe que estamos trabalhando.
E é onde entraria o Polimorfismo.
Ele nos garantirá a capacidade de um objeto ser referenciado de múltiplas formas.
O Java será capaz de identificar qual objeto foi instanciado e, assim, escolher qual método será utilizado.

Parte 4: Aprenda as características específicas em orientação a objetos
This, Super, Equals e HashCode

This:
Quando estamos trabalhando com o termo this, no Java, estamos, na verdade, fazendo uma auto referência.
Esse conceito faz mais sentido quando estamos falando de construtores e métodos, exemplo:

Super:
Analogamente ao This, quando falamos no Super, também estamos fazendo uma referência, mas dessa vez estamos fazendo referência a superclasse em um cenário de herança.
Atenção! - Como em Java, todas as nossas classes herdam de Object, se usamos o super em uma classe que não tem um extends explícito, estamos fazendo referência ao Object.
Vamos mudar um pouco o nosso exemplo.
Primeiro vamos transformar a nossa classe veículo.
Ela vai passar a ser uma classe abstrata e, portanto, não poderá mais ser instanciada.
E também vamos definir que o construtor dessa classe sempre irá esperar o modelo, a marca e o valor venal.

Equals:
Como sabemos, todas as classes em Java herdam de Object. E, portanto, tem por padrão alguns métodos.
Um deles é o equals que serve para fazer comparações entre objetos.
Entretanto esse método possui algumas peculiaridades.
Por padrão, quando estamos comparando dois objetos, estamos comparando a referência deles.
Então se instanciarmos dois carros, por mais que eles tenham exatamente as mesmas informações, o Java não é capaz de identificar.
Mas poderíamos sobrescrever o método equals() para que nossa lógica funcione do jeito que gostaríamos.
Tenha em mente que é uma boa prática sobrescrever este método.

HashCode:
Quando falamos em hashCode, precisamos pensar em um código gerado que garanta um caráter único ao nosso objeto. Essa pode ser uma forma muito interessante para que possamos comparar se realmente um objeto é igual ao outro.

Capitulo 7 - Aprenda sobre S.O.L.I.D com Java
Objetivos da Aula:
Entender os motivos da utilização
Apresentar os Princípios do SOLID
Apresentar Exemplos

Requisitos Básicos:
Lógica de Programação
Java e IDE de sua preferência (Eclipse, IntelliJ..)
Orientação a Objetos Básico

Parte 1: O que é SOLID?
SOLID é um acrônimo dos princípios da programação orientada a objetos descritas por Robert C. Martin ("Uncle Bob")
Auxiliam o programador a escrever códigos mais limpos, facilitando a refatoração e estimulando o reaproveitamento do código.

SOLID
S.R.P (Princípio da Responsabilidade Única)
O.C.P (Princípio Aberto Fechado)
L.S.P (Princípio da Substituição de Liskov)
I.S.P (Princípio da Segregação da Interface)
D.I.P (Princípio da Inversão da Dependência)

Parte 2: Conceito Single Responsibility Principle (S.R.P)
"A class should have one, and only one, reason to change." (Uma classe deve ter um, e somente um, motivo para mudar)
A classe deve possuir uma única responsabilidade dentro do software.

Parte 3: Conceito Open Closed Principle (O.C.P)
"You should be able to extend a classes behavior, without modifying it." (Você deve poder estender um comportamento de classe, sem modificá-lo.)
Objetos devem estar abertos para extensão, mas fechados para modificação.
Quando novos comportamentos precisam ser adicionados no software, devemos estender e não alterar o código fonte original.

Parte 4: Conceito Liskov Substitution Principle (L.S.P)
"Derived classes must be substitutable for their base classes." (Classes derivadas devem ser substituíveis por suas classes base.)
O princípio da substituição de Liskov foi introduzido por Barbara Liskov em 1987: "Se para cada objeto o1 do tipo S há um objeto o2 do tipo T de forma que, para todos os programas P, o comportamento de P é inalterado quando o1 é substituído por o2, então S é um subtipo de T."

Parte 5: Conceito Interface Segregation Principle (I.S.P)
"Make fine grained interfaces that are cliente specific." (Faça interfaces refinadas que são específicas do cliente.)
Uma classe não deve ser forçada a implementar interfaces e métodos que não serão utilizados.
É melhor criar interfaces mais específicas ao invés de termos uma única interface genérica.

Parte 6: Conceito Dependency Inversion Principle (D.I.P)
"Depende on astractions, not on concretions." (Dependa de abstrações e não de implementações.)
Um módulo de alto nível não deve depender de módulos de baixo nível, ambos devem depender da abstração.
PS: Inversão de Dependência não é igual a Injeção de Dependência.

Capitulo 8 - Trabalhando com Datas
Objetivos da aula:
Aprender a manipular datas
Aprender a formatar datas
Entender a evolução do tratamento de datas no Java

Requisitos Básicos:
Lógica de programação
Sintaxe da linguagem

Material da Aula:
https://github.com/marcopollivier/DigitalInnovationOne-AulaJava

Parte 1: O java.util.Date
Antes de qualquer coisa, vamos definir aqui o ponto que estamos.
A implementação do java.util.Date está na JDK desde sua versão 1.0
Ou seja... É de se esperar que algumas coisas não se mostrem tão interessantes nos dias atuais, dado a sua idade.
Nesse primeiro momento, vamos ver como podemos trabalhar com a manipulação de datas a Classe java.util.Date do Java.
E o nosso primeiro passo é dar uma olhada na documentação oficial.
Vamos usar como referência o Java 8.
https://docs.oracle.com/javase/8/docs/api/java/util/Date.html

Date( )
Este construtor vai alocar um objeto da classe Date e o inicializará com o milissegundo mais próximo do período da sua execução.

Date (long date)
Diferente do construtor anterior, esse construtor espera que você passe os milissegundos com base padrão de tempo (epoch) que usa como referência 1 de janeiro de 1970 00:00:00.
O que é o Epoch ? - "O epoch timestamp é um padrão largamente aceito para representar uma data como um inteiro 32-bits a partir do início do Unix Epoch..."
Vamos testar como base no System.currentTimeMillis( )
Esse método estático vai nos retornar o milissegundo mais próximo de sua execução com base no Sistema Operacional.

Métodos úteis
Alguns métodos da classe Date são muito úteis e serão usados com frequência durante a manipulação de datas. São eles:

Método: after(Date) - Retorno: boolean - Descrição: Checa se o objeto Data de referêmcia é posterior ao comparado
Método: before(Date - Retorno: boolean - Descrição: Checa se o objeto de referência é anterior ao comparado
Método: compareTo(Date) - Retorno: int - Descrição: Compara dois objetos Data
Método: equals(Date) - Retorno: boolean - Descrição: Checa se os objetos são iguais
Método: getTime( ) - Retorno: long - Descrição: Retorna a data em milissegundos
Método: setTime(long) - Retorno: void - Descrição: Define uma data com basae em milissegundos
Método: from(Instante) - Retorno: static Date - Descrição: Define uma data com base em um Instant
Método: toInstant( ) - Retorno: Instant - Descrição: Retorna um instant com base em um Date

Classe Instant
Surgiu na JDK 1.8
Imutável e Thread safe.
Modela um ponto instantâneo de uma linha do tempo.
Indicado para gravar marcações temporais em eventos da sua aplicação.

Referências:
https://docs.oracle.com/javase/8/docs/api/java/util/Date.html
https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#currentTimeMillis--
https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html
https://javatpoint.com/java-util-date

Parte 2: O java.util.Calendar
Já na JDK 1.1 foi observada a necessidade de facilitar alguns recursos que a class Date oferecia.
Sendo assim, a classe Calendar foi criada.
Com isso uma série de métodos e construtores da classe Date foi depreciada. Por exemplo o contrutor Date(int year, int month, int date).
Calendar é uma classe abstrata que provê métodos para converter data entre um instante específico.
O Calendar possui alguns campos específicos para manipulação como MONTH, YEAR, HOUR etc.

Imprimindo datas e horas
Aqui vão algumas maneiras de se converter o resultado de um objeto Calendar

Referências:
https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html
https://www.javatpoint.com/java-util-calendar
https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html

Parte 3: O java.text.DateFormat
Nesse ponto em que estamos existem, basicamente, duas classes para formatação de datas. O DateFormat e o SimpleDateFormat.
Ambos oferecem maneiras de formatar e parsear a saída das datas.

SimpleDateFormat
Traz uma grande facilidade que é definir um padrão de formatação para a saída de data que você deseja.

Referências:
https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat.html
https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html

Parte 4: Datas no Java 8+
O Java 9 veio com uma série de novidades para facilitar o trabalho com Datas.
E a grande melhoria está no pacote java.time que foi herdado do projeto Joda Time.
https://www.joda.org/joda-time/
Trabalhar com datas nunca foi tão fácil com esse novo pacote.
Nele destacam-se três classes: LocalDate, LocalTime, LocalDateTime
Basicamente, o que tínhamos até então eram as classes que vimos até agora: Date e Calendar.
Com o uso constante, elas se mostram confusas e trabalhosas.
Além de serem mutáveis.

LocalDate
É uma classe imutável para representar uma data.
Seu formato padrão é yyyy-MM-dd

LocalTime
É uma classe imutável que representa um padrão de hora-minuto-segundo
Pode ser representado até o nível de nanosegundos. 12:22:10:123212345
Sua utilização é similar ao LocalDate

LocalDateTime
Funciona como uma espécie de junção entre o LocalTime e o LocalDate.
Também é uma classe imutável e você consegue trabalhar com dia e hora de uma só vez.
Você pode manipular a data e hora com precisão de nanosegundos. (2nd October 2007 at 13:45.30.123456789)

Referências:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

Capitulo 9 - Trabalhando com Arrays
Objetivos da Aula:
O que é um array?
Declaração de arrays
Coprimento do array
Percorrendo arrays
Arrays multidimensionais

O que é um array?
Arrays ou Matriz, é uma estrutura de dados que nos permite organizar valores na memória
Fazem parte da biblioteca java.util que é nativa do Java.
Armazenam elementos do mesmo tipo.
Podem ser unidimensionais ou multidimensionais.

Detalhamento de um Array
Cada item em um array é chamado de elemento.
Cada elemento é acessado pela posição numérica (índice).
O índice inicia a partir de 0.
Ao se declarar um array, todos índices são inicializados em 0.
Arrays não podem mudar de tamanho, a partir do momento que um array foi criada, ela não pode mudar de tamanho.
Se você precisar de mais espaço, será necessário criar uma nova array e, antes de se referir ela, copie os elementos da array velha.

Declaração de arrays
Utilizando o operador "new"
Exemplo1: dataType[ ] arrayName = new dataType[arraySize];
int [ ] meuArray = new int[7];

Exemplo2: dataType[ ] arrayName = {value0, value1, ..., valueN};
int [ ] meuArray = {12,32,54,6,8,89,64};
Para alterar o valor de um elemento específico, coloque o índice desse elemento

Exemplo1: meuArray[0] = 50;

Comprimento do array
Para descobrir quantos elementos um array possui, use a propriedade length.
Exemplo1: System.out.println(meuArray.length);

Percorrendo arrays
Para processar um array, devemos usar um laço de repetição (for, for each, etc)
Exemplo com for: Utilizamos uma variável de controle (contador), que vai de 0 até o número de posições do array.
public class MyClass {
public static void main(String[ ] args) {
int [ ] meuArray = {12,32,54,6,8,89,64};
for (int i=0; i<7; i++){
System.out.println(meuArray[i]);
}}}

Arrays multidimensionais
Um array multidimensional é um array contendo um ou mais arrays internos.
Exemplo1:
int[ ] [ ] meuArrayMulti = { { 1,2,3,4}, {5,6,7} };
meuArrayMulti é um array com dois arrays como seus elementos.
Processando um array multidimensional
public class MyClass {
public static void main(String[ ] args) {
int [ ] [ ] meuArrayMulti = { {1,2,3,4}, {5,6,7} };
for (int i=0; i< meuArrayMulti.length; ++i) {
for (int j= 0; j < meuArrayMulti[i].length; ++j) {
System.out.println(meuArrayMulti[i][j]);
}}}}

Capitulo 10 - Tratamento de Exceções
Objetivos da Aula:
Entender o funcionamento de Exceções em Java
Aprender quando usar exceções em Java
Qualificar seu conhecimento

Requisitos Básicos:
Básico de Orientação a Objeto
Básico de métodos encadeados
Básico de algoritmos

Parte 1: Tratamento de Exceções
Exceções são todos os erros que ocorrem durante o processamento de um método que podem ser esperados ou não esperados. Como o termo já diz, "Exceptions" são exceções. Falhas que não devem ocorrer rotineiramente no fluxo de um sistema.

Parte 2: Tratamento de Exceções
Checked Exceptions
São exceções esperadas, cujo fluxo ou método de um sistema foi preparado para receber. Um Bom exemplo é uma exceção de negócio, onde se deseja informar um erro caso a exceção esperada ocorra.

Unchecked Exceptions
São exceções não esperadas para o fluxo ou método de um sistema, um bom exemplo é a famosa
NullPointException que ocorre quando se tenta acessar uma referência de memória vazia, ou recuperar uma instância que não existe, dentre outros motivos.

Bloco Try catch
O bloco try catch sempre é utilizado quando no processo que será executado dentro de um método é esperado um erro, então cria-se um bloco "protegido" onde qualquer erro que ocorra dentro do trecho "try" é direcionado para o trecho "catch" e sofrerá o devido tratamento de erro.

Parte 3: Tratamento de Exceções
Finally
O finally é um bloco de código que pode ou não ser utilizado junto ao try catch, estre trecho de código sempre será executado independente se ocorrer erro ou não dentro do fluxo onde existe o try catch. Normalmente o finally é usado para liberar recursos ou para dar continuidade em um fluxo que deve ocorrer independente de erro.

Throw e Throws
Throws - É a assinatura do método que será retornado caso ocorra erro para o método que fez a chamada, dentro de um fluxo encadeado.

Throw - É usado para lançar a exceção desejada, juntamente com a mensagem de erro, para o método que fez a chamada.


4
185

Comentários (11)

0
Rafael Maciel

Rafael Maciel

05/09/2021 21:07

Excelente Anderson, muito obrigado! Ajudou bastante!


Fiz um tutorial para configuração do Java para rodar no VSCode do Windows.


https://github.com/RafaelMacielDev/library_first-config-java-for-windows-vscode


Espero ter ajudado de alguma forma quem chegou até aqui.


0
Maria Moura

Maria Moura

24/07/2021 20:49

Excelente material! Seguindo o que você postou, consegui instalar e refazer o que foi mostrado na aula, mas com o Ubuntu 20.4, Java 11.0.12, Maven 3.5.4, Gradle 6.8.2 e Intellij 2021. Rodou perfeitamente! E ainda aprendi como aumentar os espaços das partições no disco virtual. Gastei quase 2 semanas instalando o Ubuntu e o restante, desinstalando, descobrindo como acertar o problema de falta de espaço para sistema de arquivos de root..... mas valeu a pena.


Instalei agora uma versão mais recente do gradle e não consegui mais gerar o wrapper. Então, se não me engano, foi o Leopoldo Prates), postou uma solução:

"You can simply execute the task named init in the directory where you would like to create the Gradle build."


gradle init

. opção 1 (basic)

. select build script DSL: 3 (Java)

. Project name: <....>


https://docs.gradle.org/current/samples/sample_building_java_applications.html


Agora, ele cria normalmente usando o gradle wrapper

1
Arthur Teles

Arthur Teles

09/08/2021 20:25

Oi galera, tudo bem? Para quem estiver tendo problemas com o seguinte comando no cmd:

graddle wrapper

Basta instalar a build 6.8.2 do Gradle. O meu também estava dando problemas na hora de realizar esse comando, porém ao baixar essa build mais antiga, deu certo!


Lembrando que não precisa tirar a build que vocês já haviam instalado, só se quiserem. Mas É NECESSÁRIO que vocês mudem as variáveis ambiente para apontar pra essa nova build.

1
Jamesson Junior

Jamesson Junior

28/06/2021 23:09

quem estiver tendo erro com o gradle, tenta baixar a versao Gradle 6.8.2

1
Gabriel Silva

Gabriel Silva

24/05/2021 20:50

Estou tendo o mesmo problema que o Carlos Santos



FAILURE: Build failed with an exception.


* What went wrong:

Executing Gradle tasks as part of a build without a settings file is not supported. Make sure that you are executing Gradle from a directory within your Gradle project. Your project should have a 'settings.gradle(.kts)' file in the root directory.


* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.


* Get more help at https://help.gradle.org

3
C

Carlos Santos

21/05/2021 09:00

quando usar o gradle wrapper me deparo com esse erro, alguém sabe como resolver?


root@Matrix:/home/henrique/Downloads# gradle wrapper

Starting a Gradle Daemon (subsequent builds will be faster)


FAILURE: Build failed with an exception.


* What went wrong:

Executing Gradle tasks as part of a build without a settings file is not supported. Make sure that you are executing Gradle from a directory within your Gradle project. Your project should have a 'settings.gradle(.kts)' file in the root directory.


* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.


* Get more help at https://help.gradle.org


BUILD FAILED in 5s


0
Eliseu Brito

Eliseu Brito

03/06/2021 10:39

Muito bom seu post! Parabéns.

0
Leonardo Carneiro

Leonardo Carneiro

22/02/2021 22:40

problema no comando

mvn -N io.takari:maven:wrapper


volta a mensagem de erro:



0
Eduardo Anjos

Eduardo Anjos

16/02/2021 21:10

Lazaro Bonfim, pode baixar no link do Google Drive colocado no post;

Só informando que para incluir o repositório do Java, somente funcionou dessa maneira

$ sudo add-apt-repository ppa:linuxuprising/java


Parabéns pelo post, muito Show!

Obrigado

0
Maykon Taroco

Maykon Taroco

16/02/2021 17:02

Show!

Um ser humano buscando conhecimento e sucesso em sua vida profissional

Brasil