---

language: java
contributors:
    - ["Jake Prather", "http://github.com/JakeHP"]
    - ["Madison Dickson", "http://github.com/mix3d"]
translators:
    - ["Victor Kléber Santos L. Melo", "http://victormelo.com.br/blog"]
    - ["Renê Douglas N. de Morais", "mailto:rene.douglas.bsi@gmail.com"]
lang: pt-br
filename: LearnJava-pt.java

---

Java é uma linguagem de programação de propósito geral, concorrente, baseada em classes e orientada a objetos.
[Leia mais aqui](http://docs.oracle.com/javase/tutorial/java/index.html)

```java
// Comentários de uma linha começam com //
/*
Comentários de várias linhas são feitos dessa forma.
*/
/**
Comentários JavaDoc são feitos assim. São usados para descrever a Classe ou os atributos da Classe.
*/

// Importa a classe ArrayList que está dentro do pacote java.util
import java.util.ArrayList;
// Importa todas as classes que estão dentro do pacote java.security
import java.security.*;

// Cada arquivo .java contém uma classe pública, com o mesmo nome do arquivo.
public class LearnJava {

    // Um programa precisa ter um método main como um ponto de entrada.
    public static void main (String[] args) {

        // O System.out.println é usado para imprimir no console
        System.out.println("Olá Mundo!");
        System.out.println(
            "Integer: " + 10 +
            " Double: " + 3.14 +
            " Boolean: " + true);

        // Para imprimir sem inserir uma nova linha, use o System.out.print
        System.out.print("Olá ");
        System.out.print("Mundo");


        ///////////////////////////////////////
        // Tipos & Variáveis
        ///////////////////////////////////////

        // Declara-se variáveis usando <tipo> <nome> [
        // Byte - inteiro de 8 bits com sinal complementado a dois
        // (-128 <= byte <= 127)
        byte fooByte = 100;

        // Short - inteiro de 16 bits com sinal complementado a dois
        // (-32,768 <= short <= 32,767)
        short fooShort = 10000;

        // Integer - inteiro de 32 bits com sinal complementado a dois
        // (-2,147,483,648 <= int <= 2,147,483,647)
        int fooInt = 1;

        // Long - inteiro de 64 bits com sinal complementado a dois
        // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807)
        long fooLong = 100000L;
        // L é usado para indicar que o valor da variável é do tipo Long;
        // sem o L, tudo é tratado como inteiro por padrão.

        // Nota: Java não tem tipos sem sinal

        // Float - Ponto Flutuante 32-bits, de precisão simples no padrão IEEE 754
        float fooFloat = 234.5f;
        // f é usado para indicar que o valor da variável é do tipo float;
        // caso contrário, ela é tratada como double.

        // Double - Ponto Flutuante 64-bits, de precisão dupla no padrão IEEE 754
        double fooDouble = 123.4;

        // Boolean - true & false
        boolean fooBoolean = true;
        boolean barBoolean = false;

        // Char - Um caractere Unicode de 16 bits
        char fooChar = 'A';

        // Usa-se o final para fazer com que a variável seja imutável.
        final int HORAS_QUE_TRABALHEI_POR_SEMANA = 9001;

        // Strings
        String fooString = "Aqui está minha String!";

        // \n é um caractere de escape que inicia uma nova linha
        String barString = "Imprimir em uma nova linha?\nSem problemas!";
        // \t é um caractere de escape que adiciona um caractere de tabulação
        String bazString = "Você quer adicionar tabulação?\tSem problemas!";
        System.out.println(fooString);
        System.out.println(barString);
        System.out.println(bazString);

        // Arrays
        //O tamanho do array precisa ser determinado na sua declaração
        //O formato para declarar um array é:
        //<tipo de dado> [] <nome da variável> = new <tipo de dado>[<tamanho do array>];
        int [] intArray = new int[10];
        String [] stringArray = new String[1];
        boolean [] booleanArray = new boolean[100];

        // Outra maneira de declarar e inicializar um array
        int [] y = {9000, 1000, 1337};

        // Indexando um array - Acessando um elemento
        System.out.println("intArray no índice 0: " + intArray[0]);

        // O primeiro termo de um array é o 0 e eles são mutáveis.
        intArray[1] = 1;
        System.out.println("intArray no índice 1: " + intArray[1]); // => 1

        // Outras estruturas que devem ser vistas
        // ArrayLists - São parecidos com os arrays, porém oferecem mais funcionalidades
        //             e o tamanho é mutável.
        // LinkedLists
        // Maps
        // HashMaps

        ///////////////////////////////////////
        // Operadores
        ///////////////////////////////////////
        System.out.println("\n->Operadores");

        int i1 = 1, i2 = 2; // Forma abreviada de escrever múltiplas declarações.

        // Aritmética é feita da forma convencional
        System.out.println("1+2 = " + (i1 + i2)); // => 3
        System.out.println("2-1 = " + (i2 - i1)); // => 1
        System.out.println("2*1 = " + (i2 * i1)); // => 2
        System.out.println("1/2 = " + (i1 / i2)); // => 0 (0.5 arredondado para baixo)

        // Módulo
        System.out.println("11%3 = "+(11 % 3)); // => 2

        // Operadores de comparação
        System.out.println("3 == 2? " + (3 == 2)); // => false
        System.out.println("3 != 2? " + (3 != 2)); // => true
        System.out.println("3 > 2? " + (3 > 2)); // => true
        System.out.println("3 < 2? " + (3 < 2)); // => false
        System.out.println("2 <= 2? " + (2 <= 2)); // => true
        System.out.println("2 >= 2? " + (2 >= 2)); // => true

        // Operadores bit-a-bit!
        /*
        ~       Complemento de um
        <<      Deslocamento a esquerda com sinal
        >>      Deslocamento a direita com sinal
        >>>     Deslocamento a direita sem sinal
        &       E bit-a-bit
        |       OU bit-a-bit
        ^       OU exclusivo bit-a-bit
        */

        // Incrementações
        int i = 0;
        System.out.println("\n->Inc/Dec-rementação");
        System.out.println(i++); //i = 1. Pós-Incrementação
        System.out.println(++i); //i = 2. Pre-Incrementação
        System.out.println(i--); //i = 1. Pós-Decrementação
        System.out.println(--i); //i = 0. Pre-Decrementação

        ///////////////////////////////////////
        // Estruturas de Controle
        ///////////////////////////////////////
        System.out.println("\n->Estruturas de Controle");

        // Os comandos If são parecidos com o da linguagem C
        int j = 10;
        if (j == 10){
            System.out.println("Eu serei impresso");
        } else if (j > 10) {
            System.out.println("Eu não");
        } else {
            System.out.println("Eu também não");
        }

        // O Loop While
        int fooWhile = 0;
        while(fooWhile < 100)
        {
            //System.out.println(fooWhile);
            //Incrementando o contador
            //Iteração feita 99 vezes, fooWhile 0->99
            fooWhile++;
        }
        System.out.println("Valor do fooWhile: " + fooWhile);

        // O Loop Do While
        int fooDoWhile = 0;
        do
        {
            //System.out.println(fooDoWhile);
            //Incrementando o contador
            //Iteração feita 99 vezes, fooDoWhile 0->99
            fooDoWhile++;
        }while(fooDoWhile < 100);
        System.out.println("Valor do fooDoWhile: " + fooDoWhile);

        // O Loop For
        int fooFor;
        //estrutura do loop for => for(<operação_de_início>; <condição>; <passo>)
        for(fooFor=0; fooFor<10; fooFor++){
            //System.out.println(fooFor);
            //Iteração feita 10 vezes, fooFor 0->9
        }
        System.out.println("Valor do fooFor: " + fooFor);

        // O Loop For Each
        // Itera automaticamente por um array ou lista de objetos.
        int[] fooList = {1,2,3,4,5,6,7,8,9};
        //estrutura do loop for each => for(<objeto> : <array_de_objeto>)
        //lê-se: para cada objeto no array
        //nota: o tipo do objeto deve ser o mesmo do array.

        for( int bar : fooList ){
            //System.out.println(bar);
            //Itera 9 vezes e imprime 1-9 em novas linhas
        }

        // Switch
        // Um switch funciona com os tipos de dados: byte, short, char e int
        // Ele também funciona com tipos enumerados (vistos em tipos Enum)
        // como também a classe String e algumas outras classes especiais
        // tipos primitivos: Character, Byte, Short e Integer
        int mes = 3;
        String mesString;
        switch (mes){
            case 1:
                    mesString = "Janeiro";
                    break;
            case 2:
                    mesString = "Fevereiro";
                    break;
            case 3:
                    mesString = "Março";
                    break;
            default:
                    mesString = "Algum outro mês";
                    break;
        }
        System.out.println("Resultado do Switch: " + mesString);

        // Condição de forma abreviada.
        // Você pode usar o operador '?' para atribuições rápidas ou decisões lógicas.
        // Lê-se "Se (declaração) é verdadeira, use <primeiro valor>
        // caso contrário, use <segundo valor>".
        int foo = 5;
        String bar = (foo < 10) ? "A" : "B";
        System.out.println(bar); //Imprime A, pois a condição é verdadeira.


        ///////////////////////////////////////
        // Convertendo tipos de dados e Casting
        ///////////////////////////////////////

        //Conversão de Dados

        //Convertendo String para Inteiro.
        Integer.parseInt("123");//retorna uma versão inteira de "123".

        //Convertendo Inteiro para String
        Integer.toString(123);//retorna uma versão String de 123.

        // Para outras conversões confira as seguintes classes
        // Double
        // Long
        // String

        // Casting
        // Você pode também converter objetos java, há vários detalhes e
        // lida com alguns conceitos intermediários
        // Dê uma olhada no link:
        // http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html


        ///////////////////////////////////////
        // Classes e Métodos
        ///////////////////////////////////////

        System.out.println("\n->Classes e Métodos");

        // (segue a definição da classe Bicicleta)

        // Use o new para instanciar uma classe
        Bicicleta caloi = new Bicicleta(); // Objeto caloi criado.

        // Chame os métodos do objeto
        caloi.aumentarVelocidade(3); // Você deve sempre usar métodos para modificar variáveis
        caloi.setRitmo(100);

        // toString é uma convenção para mostrar o valor deste objeto.
        System.out.println("informações de caloi: " + caloi.toString());

    } // Fim do método main
} // Fim da classe LearnJava


// Você pode incluir outras classes que não são públicas num arquivo .java


// Sintaxe de declaração de Classe.
// <public/private/protected> class <nome da classe>{
//   // atributos, construtores e todos os métodos.
//   // funções são chamadas de métodos em Java.
// }

class Bicicleta {

    // Atributos/Variáveis da classe Bicicleta.
    public int ritmo;          // Public: Pode ser acessada em qualquer lugar.
    private int velocidade;    // Private: Apenas acessível a classe.
    protected int catraca; // Protected: Acessível a classe e suas subclasses.
    String nome;               // default: Apenas acessível ao pacote.

    // Construtores são uma forma de criação de classes
    // Este é o construtor padrão.
    public Bicicleta() {
        catraca = 1;
        ritmo = 50;
        velocidade = 5;
        nome = "Bontrager";
    }

    // Este é um construtor específico (ele contém argumentos).
    public Bicicleta (int ritmoInicial, int velocidadeInicial, int catracaInicial, String nome) {
        this.catraca = catracaInicial;
        this.ritmo = ritmoInicial;
        this.velocidade = velocidadeInicial;
        this.nome = nome;
    }

    // Sintaxe de um método:
    // <public/private/protected> <tipo de retorno> <nome do método>(<args>) //  

    // Classes em Java costumam implementar métodos getters e setters para seus campos.

    // Sintaxe de declaração de métodos
    // <escopo> <tipo de retorno> <nome do método>(<args>) //   
    public int getRitmo() {
        return ritmo;
    }

    //  Métodos do tipo void não requerem declaração de retorno.
    public void setRitmo(int novoValor) {
        ritmo = novoValor;
    }

    public void setEquipamento(int novoValor) {
        catraca = novoValor;
    }

    public void aumentarVelocidade(int incremento) {
        velocidade += incremento;
    }

    public void diminuirVelocidade(int decremento) {
        velocidade -= decremento;
    }

    public void setNome(String novoNome) {
        nome = novoNome;
    }

    public String getNome() {
        return nome; // retorna um dado do tipo String.
    }

    //Método para mostrar os valores dos atributos deste objeto.
    @Override
    public String toString() {
        return "catraca: " + catraca +
                " ritmo: " + ritmo +
                " velocidade: " + velocidade +
                " nome: " + nome;
    }
} // fim classe Bicicleta

// Velocipede é uma subclasse de bicicleta.
class Velocipede extends Bicicleta {
    // (Velocípedes são bicicletas com rodas dianteiras grandes
    // Elas não possuem catraca.)

    public Velocipede(int ritmoInicial, int velocidadeInicial){
        // Chame o construtor do pai (construtor de Bicicleta) com o comando super.
        super(ritmoInicial, velocidadeInicial, 0, "PennyFarthing");
    }

    // Você pode marcar um método que você está substituindo com uma @annotation
    // Para aprender mais sobre o que são as annotations e sua finalidade
    // dê uma olhada em: http://docs.oracle.com/javase/tutorial/java/annotations/
    @Override
    public void setEquipamento(int catraca) {
        catraca = 0;
    }

}

// Interfaces
// Sintaxe de declaração de Interface
// <nível de acesso> interface <nome-da-interface> extends <super-interfaces> {
// // Constantes
// // Declarações de método
//}

// Exemplo - Comida:
public interface Comestivel {
    public void comer(); // Qualquer classe que implementa essa interface, deve
                         // implementar este método.
}

public interface Digestivel {
    public void digerir();
    // Em Java 8, interfaces podem ter métodos default.
    // public void digerir() {
    //     System.out.println("digerindo ...");
    // }
}


// Agora podemos criar uma classe que implementa ambas as interfaces.
public class Fruta implements Comestivel, Digestivel {

    @Override
    public void comer() {
        // ...
    }

    @Override
    public void digerir() {
        // ...
    }
}

// Em Java, você pode estender somente uma classe, mas você pode implementar muitas
// interfaces. Por exemplo:
public class ClasseExemplo extends ExemploClassePai implements InterfaceUm,
    InterfaceDois {

    @Override
    public void InterfaceUmMetodo() {
    }

    @Override
    public void InterfaceDoisMetodo() {
    }

}

// Classes abstratas

// Sintaxe de declaração de classe abstrata
// <Nível de acesso> abstract <nome-da-classe-abstrata> extends <estende super-abstratas-classes> {
// // Constantes e variáveis
// // Declarações de método
//}

// Marcar uma classe como abstrata significa que ela contém métodos abstratos que devem
// ser definidos em uma classe filha. Semelhante às interfaces, classes abstratas não podem
// ser instanciadas, ao invés disso devem ser estendidas e os métodos abstratos
// definidos. Diferente de interfaces, classes abstratas podem conter uma mistura de
// métodos concretos e abstratos. Métodos em uma interface não podem ter um corpo,
// a menos que o método seja estático, e as variáveis sejam finais, por padrão, ao contrário de um
// classe abstrata. Classes abstratas também PODEM ter o método "main".

public abstract class Animal
{
    public abstract void fazerSom();

    // Método pode ter um corpo
    public void comer()
    {
        System.out.println("Eu sou um animal e estou comendo.");  
        //Nota: Nós podemos acessar variáveis privadas aqui.
        idade = 30;
    }

    // Não há necessidade de inicializar, no entanto, em uma interface
    // a variável é implicitamente final e, portanto, tem
    // de ser inicializada.
    protected int idade;

    public void mostrarIdade()
    {
        System.out.println(idade);  
    }

    //Classes abstratas podem ter o método main.
    public static void main(String[] args)
    {
        System.out.println("Eu sou abstrata");
    }
}

class Cachorro extends Animal
{

    // Nota: ainda precisamos substituir os métodos abstratos na
    // classe abstrata.
    @Override
    public void fazerSom()
    {
        System.out.println("Bark");
        // idade = 30;    ==> ERRO!  idade é privada de Animal
    }

    // NOTA: Você receberá um erro se usou a
    // anotação Override aqui, uma vez que java não permite
    // sobrescrita de métodos estáticos.
    // O que está acontecendo aqui é chamado de "esconder o método".
    // Vejá também este impressionante SO post: http://stackoverflow.com/questions/16313649/
    public static void main(String[] args)
    {
        Cachorro pluto = new Cachorro();
        pluto.fazerSom();
        pluto.comer();
        pluto.mostrarIdade();
    }
}

// Classes Finais

// Sintaxe de declaração de classe final
// <nível de acesso> final <nome-da-classe-final> {
// // Constantes e variáveis
// // Declarações de método
//}

// Classes finais são classes que não podem ser herdadas e são, portanto, um
// filho final. De certa forma, as classes finais são o oposto de classes abstratas,
// porque classes abstratas devem ser estendidas, mas as classes finais não podem ser
// estendidas.
public final class TigreDenteDeSabre extends Animal
{
    // Nota: Ainda precisamos substituir os métodos abstratos na
    // classe abstrata.
    @Override
    public void fazerSom();
    {
        System.out.println("Roar");
    }
}

// Métodos Finais
public abstract class Mamifero()
{
    // Sintaxe de Métodos Finais:
    // <modificador-de-acesso> final <tipo-de-retorno> <nome-do-método>(<argumentos>)

    // Métodos finais, como classes finais, não podem ser substituídos por uma classe filha,
    // e são, portanto, a implementação final do método.
    public final boolean EImpulsivo()
    {
        return true;
    }
}


// Tipo Enum
//
// Um tipo enum é um tipo de dado especial que permite a uma variável ser um conjunto de constantes predefinidas. A 
// variável deve ser igual a um dos valores que foram previamente definidos para ela.
// Por serem constantes, os nomes dos campos de um tipo de enumeração estão em letras maiúsculas.
// Na linguagem de programação Java, você define um tipo de enumeração usando a palavra-chave enum. Por exemplo, você poderia
// especificar um tipo de enum dias-da-semana como:

public enum Dia {
    DOMINGO, SEGUNDA, TERÇA, QUARTA,
    QUINTA, SEXTA, SABADO 
}

// Nós podemos usar nosso enum Dia assim:

public class EnumTeste {

    // Variável Enum
    Dia dia;

    public EnumTeste(Dia dia) {
        this.dia = dia;
    }

    public void digaComoE() {
        switch (dia) {
            case SEGUNDA:
                System.out.println("Segundas são ruins.");
                break;

            case SEXTA:
                System.out.println("Sextas são melhores.");
                break;

            case SABADO: 
            case DOMINGO:
                System.out.println("Finais de semana são os melhores.");
                break;

            default:
                System.out.println("Dias no meio da semana são mais ou menos.");
                break;
        }
    }

    public static void main(String[] args) {
        EnumTeste primeiroDia = new EnumTeste(Dia.SEGUNDA);
        primeiroDia.digaComoE(); // => Segundas-feiras são ruins.
        EnumTeste terceiroDia = new EnumTeste(Dia.QUARTA);
        terceiroDia.digaComoE(); // => Dias no meio da semana são mais ou menos.
    }
}

// Tipos Enum são muito mais poderosos do que nós mostramos acima.
// O corpo de um enum pode incluir métodos e outros campos.
// Você pode ver mais em https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

```

## Leitura Recomendada

Os links fornecidos aqui abaixo são apenas para ter uma compreensão do tema, use o Google e encontre exemplos específicos.

Outros tópicos para pesquisar:

* [Tutorial Java para Sun Trail / Oracle](http://docs.oracle.com/javase/tutorial/index.html)

* [Modificadores de acesso do Java](http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)

* [Coceitos de Programação Orientada à Objetos](http://docs.oracle.com/javase/tutorial/java/concepts/index.html):
    * [Herança](http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)
    * [Polimorfismo](http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html)
    * [Abstração](http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)

* [Exceções](http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html)

* [Interfaces](http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)

* [Tipos Genéricos](http://docs.oracle.com/javase/tutorial/java/generics/index.html)

* [Conversões de código Java](http://www.oracle.com/technetwork/java/codeconv-138413.html)

Livros:

* [Use a cabeça, Java] (http://www.headfirstlabs.com/books/hfjava/)

Apostila:

* [Java e Orientação a Objetos] (http://www.caelum.com.br/apostila-java-orientacao-objetos/)

* [Java para Desenvolvimento Web] (https://www.caelum.com.br/apostila-java-web/)
