Baixe o app para aproveitar ainda mais
Prévia do material em texto
Desenvolvimento Básico em Java 1 Desenvolvimento Básico em Java Descrição A linguagem Java é orientada a objetos e uma das mais usadas por desenvolvedores no mundo. Aprenda desde os conceitos e instalação até a execução de projetos em Java. Formação com esse curso: Inter Java Developer Professor: André Gomes Marco Ollivier Gabriel Beck Augusto Júlio Alex Duarte Aulas: Matéria 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 update 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://www.oracle.com/br/java/ Desenvolvimento Básico em Java 2 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. https://gradle.org/ https://gradle.org/ https://maven.apache.org/ https://maven.apache.org/ Desenvolvimento Básico em Java 3 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 ideaIC2018.1.4.tar.gz cd idea-IC181.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 https://www.jetbrains.com/pt-br/idea/download/#section=windows https://www.jetbrains.com/idea/ https://www.jetbrains.com/pt-br/idea/download/#section=windows https://github.com/takari/maven-wrapper https://docs.gradle.org/current/userguide/gradele_wrapper.html https://start.spring.io/ Desenvolvimento Básico em Java 4 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.1SNAPSHOT.jar com o comando = java .jar target/exemplo-maven- 0.0.1SNAPSHOT.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.1SNAPSHOT.jar com o comando = java .jar build/libs/exemplo-gradle- 0.0.1SNAPSHOT.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. Desenvolvimento Básico em Java 5 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. https://javaee.github.io/glassfish Desenvolvimento Básico em Java 6 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 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html http://docs.oracle.com/javase/8/docs/api/java/lang/String.html Desenvolvimento Básico em Java 7 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. Desenvolvimento Básico em Java 8 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 operadorde 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 https://github.com/andrelugomes https://github.com/andrelugomes/digital-innovation-one/archive/master.zip Desenvolvimento Básico em Java 9 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. https://docs.gradle.org/current/userguide/checkstyle_plugin.html https://github.com/checkstyle/checkstyle https://docs.gradle.org/current/userguide/pmd_plugin.html Desenvolvimento Básico em Java 10 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? https://github.com/marcopollivier/DigitalInnovationOne-CursoBasicoJava Desenvolvimento Básico em Java 11 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. Desenvolvimento Básico em Java 12 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: Desenvolvimento Básico em Java 13 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. Desenvolvimento Básico em Java 14 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 casode carros e as cilindradas em casos de motocicletas. Desenvolvimento Básico em Java 15 Desenvolvimento Básico em Java 16 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: Desenvolvimento Básico em Java 17 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. Desenvolvimento Básico em Java 18 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: Desenvolvimento Básico em Java 19 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. Desenvolvimento Básico em Java 20 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. Desenvolvimento Básico em Java 21 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 Desenvolvimento Básico em Java 22 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.) Desenvolvimento Básico em Java 23 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 https://github.com/marcopollivier/DigitalInnovationOne-AulaJava http://java.util.date/ http://java.util.date/ https://docs.oracle.com/javase/8/docs/api/java/util/Date.html Desenvolvimento Básico em Java 24 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 000000. 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 milissegundomais próximo de sua execução com base no Sistema Operacional. Desenvolvimento Básico em Java 25 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 Desenvolvimento Básico em Java 26 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 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 Desenvolvimento Básico em Java 27 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 Desenvolvimento Básico em Java 28 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. 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 Desenvolvimento Básico em Java 29 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. 122210123212345 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 1345.30.123456789 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 https://www.joda.org/joda-time/ Desenvolvimento Básico em Java 30 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); 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 Desenvolvimento Básico em Java 31 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 Desenvolvimento Básico em Java 32 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. Desenvolvimento Básico em Java 33 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. Desenvolvimento Básico em Java 34 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. Desenvolvimento Básico em Java 35
Compartilhar