image

Acesse bootcamps ilimitados e +650 cursos pra sempre

75
%OFF
Article image
Guilherme Oliveira
Guilherme Oliveira12/12/2025 02:46
Compartilhe

Java.getFundamentos(): Fundamentos em Java e Orientação a Objetos

    Atenção: Os exemplos deste artigo foram escritos em versões anteriores ao Java 25. Mais especificamente, na versão do Java 21. (Pelo fato da sintaxe do 25 ser, no momento, menos popular).

    I - Introdução

    Você conhece a linguagem de programação Java?

    Java foi lançado em 1995 pela empresa Sun Microsystems, vendendo o slogan de “Write once, run anywhere”, já demonstrando sua essência, uma linguagem multiplataforma, que tem uma estrutura baseada em programação orientada a objetos.

    Hoje o Java é uma linguagem amplamente utilizada pelo mundo inteiro, pelo fato de ser de uso gratuito e versátil, por isso é uma linguagem muito forte no mundo corporativo. Também por conta da sua confiabilidade para lidar com sistemas robustos de maneira segura e escalável.

    Neste artigo, vamos aprender os fundamentos da linguagem Java e da orientação a objetos com alguns exemplos e dicas de boas práticas.

    II - Classes, Variáveis, Métodos, e tudo o que há de bom

    Esses foram os ingredientes escolhidos para serem fundamentais na programação com java, e fazem parte de toda a construção de qualquer sistema em Java, seja ele um simples “Hello World”, ou sendo uma aplicação complexa e estruturada de uma grande corporação

    II.I - Classes em Java

    Uma classe em Java serve para definir um modelo que será utilizado para criar objetos, um objeto pode ser instanciado a partir dele em qualquer lugar da sua aplicação Java.

    Abaixo vamos criar nossa primeira classe, que vai ser trabalhada ao longo deste artigo.

    public class Personagem {
    }
    

    Para declarar uma classe no Java, você inclui o modificador de acesso public ou o default (falaremos sobre modificadores de acesso mais adiante), a palavra reservada class para indicar que ali está sendo criada uma classe, o nome da classe, que no Java devem ser escritos utilizando PascalCase e a abertura e fechamento de chaves onde vão ser definidos futuramente os atributos e métodos dessa classe.


    II.II - Variáveis

    Assim como em qualquer outra linguagem de programação, no Java as variáveis são campos utilizados para salvar valores em memória durante o tempo de execução da aplicação. As variáveis do Java possuem algumas regras que devemos saber antes de começarmos a utilizá-las:

    • Nomenclatura da variável: O nome de uma variável no Java pode conter letras, números, underline ”_” e o símbolo do dólar “$”. O primeiro caractere do nome pode ser tanto a letra, quanto um “$” ou um “_” , porém, é fortemente recomendado que utilize sempre uma letra minúscula como primeiro caractere, e a escrita seja feita em camelCase;
    • Os nomes são case-sensitive: O Java diferencia as letras maiúsculas e minúsculas, portanto, você só consegue invocar sua variável se escrever exatamente igual você definiu o nome dela;
    • Não nomear com palavras reservadas: O nome da sua variável não pode ser igual o de uma palavra reservada do Java (Ex: public, private, int, break, etc…);
    • Boas práticas: Não utilize nomes ou abreviações confusas para nomear suas variáveis (Ex: em uma classe carro, em vez de utilizar var1 ou pdm para indicar a potência do motor do carro, seria melhor utilizar um nome autoexplicativo, como potenciaMotor), essas boas práticas ajudam seu código a ficar mais legível e facilita na compreensão para outros desenvolvedores ou para acrescentar algo futuramente

    Variáveis no Java possuem tipagem estática e forte, por isso você tem que definir de qual tipo é aquela variável já na criação dela, que vai ser verificado no tempo de compilação se o valor atribuído para ela é válido, a partir do momento de criação dela, a mesma não pode ser convertida para outro tipo de maneira automática, somente em casos que não haja potencial perda de informações. Caso tenha o risco de perder informações, só pode ser convertido se explícito no código.


    II.II.I - Tipos de Dados

    O tipo de dado de uma variável no Java indica os valores que ela pode armazenar. Veja abaixo uma tabela com os tipos mais comuns de dados que o Java utiliza:

    image

    II.II.II - Principais Tipos de Variáveis


    II.II.II.I - Variáveis de Instância

    A variável de instância é o campo utilizados por objetos para armazenar seus valores próprios, de forma independente de outros objetos da mesma classe.

    No exemplo abaixo vamos criar uma variável de instância para a nossa classe Personagem que vai representar o nome do personagem:

    public String nome;
    

    Essa é uma variável de instância porque ela é exclusiva para cada personagem instanciado, e cada um vai ter seu próprio valor independente do valor dos demais personagens.


    II.II.II.II - Variáveis Estáticas

    Uma variável estática é um campo que possui uma única cópia compartilhada entre todas as instâncias de uma classe, essa variável pertence à classe e pode ser acessada por um objeto instanciado ou diretamente pela classe. Para criar uma variável estática no Java, utilizamos a palavra reservada static.

    No exemplo abaixo vamos criar uma variável estática na nossa classe Personagem para contabilizar quantos personagens já foram criados:

    public static Integer quantidadePersonagensCriados = 0;
    

    Essa é uma variável estática, porque ela pertence à classe e não à uma instância específica da classe.


    II.II.II.III - Constantes

    Constantes têm o mesmo papel que as variáveis: armazenar valores. Porém, diferente de variáveis, o valore inserido em uma constante é imutável.

    Para definir que o campo é uma constante, você tem que incluir a palavra reservada final. Assim como uma variável comum, ela pode ser tanto de instância quanto estática (por padrão, as constantes geralmente são estáticas).

    No exemplo abaixo vamos criar duas constantes para nossa classe Personagem:

    • Uma estática para representar o nível máximo permitido:
    • Uma de instância para representar a classe desse personagem (guerreiro, ladino, monge, etc):
    public static final Integer NIVEL_MAXIMO = 100;
    public final String classe = "Guerreiro";
    

    Agora olha o que acontece se tentarmos alterar o valor de uma constante

    classe = "Mago"; // Erro de compilação
    

    Note duas coisas interessantes:

    • O padrão de nomenclatura de uma constante estática é diferente, ele usa o padrão SCREAMING_SNAKE_CASE.
    • Quando chega no momento de compilar, se é identificado a tentativa de mudança de uma constante, a compilação para naquele momento, antes mesmo de rodar a aplicação.

    II.III Criando um Objeto

    Conseguimos instanciar um objeto a partir de uma classe do Java, esse objeto possui as características próprias e usa a classe como um modelo para seguir, o objeto será criado na memória e você terá uma referência dele, que poderá utilizar para acessar esse objeto e suas informações.

    Personagem meuPersonagem = new Personagem();
    

    No código acima instanciamos um novo objeto Personagem assim que utilizamos o trecho new Personagem(), e salvamos sua referência na variável meuPersonagem.

    O livro Use a Cabeça! Java temos o trecho que descreve bem a relação entre uma classe e um objeto:

    “Uma classe é um modelo para um objeto. Ela informa à máquina virtual como criar um objeto desse tipo específico” — Kathy Sierra, Bert Bates & Trisha Gee. Use a Cabeça! Java, 3ª edição.

    II.IV - Métodos

    Métodos são blocos de código que podem realizar alguma ação ou retornar algum valor. Métodos no contexto de classes, são ações que objetos daquela classe podem realizar.

    II.IV.I - Exemplo de método que não retorna um valor:

    public void usarHabilidade(String nomeDaHabilidade) {
      System.out.print("Usando " + nomeDaHabilidade + "!");
    }
    

    Executando o método

    usarHabilidade("Magia");
    

    Saída no terminal

    Usando Magia!
    

    No exemplo acima criamos um método que apenas realiza uma ação, observe os seguintes pontos:

    • Dentro dos parênteses o método solicita um argumento, nesse caso é o nome da habilidade que ele vai usar
    • O que o método vai executar fica entre chaves {};
    • System.out.println é a chamada de um método da biblioteca padrão do Java, que serve para imprimir coisas no terminal;
    • A palavra void, que indica que ele não vai retornar nenhum valor após a sua execução.

    II.IV.I - Exemplo de método que retorna um valor:

    public int contarUmMaisUm() {
      return 2;
    }
    

    Executando o método

    System.out.print(contarUmMaisUm());
    

    Saída no terminal

    2
    

    Por questões de boas práticas, a nomenclatura de um método no Java utiliza camelCase, e deve estar bem explícito o que aquele método retorna ou a ação que ele realiza. E deve começar com um verbo ou verbo auxiliar (ex: fazerBolo, podeAcessar, etc.).


    II.V - Classe Main

    A classe main vai ser o ponto de entrada para a sua aplicação em java, dentro dela vai ter o método main, que é onde começa a execução da sua aplicação .

    public class Application {
      public static void main(String[] args) {
          // Aqui vai as instruções para rodar a sua aplicação
      }
    }
    

    Veja que o nome da classe não precisa ser Main, o que define ela como a classe principal é o método main.

    II.VI - Modificadores de acesso

    Até agora você viu métodos e classes que começavam com a palavra reservada public. Essas palavras reservadas são chamadas de modificadores de acesso.

    Os modificadores de acesso determinam onde uma classe, campo ou método podem ser acessados e utilizados dentro da aplicação, conheça quais são eles, por ordem de restrição:

    • private:
    • Pode ser usado em variáveis e métodos;
    • Só pode ser acessado dentro da classe onde foi definido.
    • default (ou package-private):
    • Pode ser usado em classes, variáveis e métodos;
    • Só pode ser acessado por classes do mesmo pacote.
    • protected:
    • Pode ser usado em variáveis e métodos;
    • Pode ser acessado dentro do mesmo pacote;
    • Pode ser acessado por subclasses em qualquer pacote.
    • public:
    • Pode ser utilizado em classes, variáveis e métodos;
    • Pode ser acessado por qualquer classe, em qualquer pacote da aplicação.

    III - Programando com Orientação a Objetos

    Até aqui você já aprendeu tudo que era necessário para começar a programar utilizando orientação a objetos: aprendeu o que é uma classe, o que é um objeto e o que são métodos e variáveis.

    No conceito que vamos discorrer agora, o objeto possui atributos que ele conhece sobre si mesmo, que são suas variáveis, e ações que ele pode realizar, que são os seus métodos.

    III.I - A Classe Personagem

    No decorrer do artigo, utilizamos como exemplo a classe Personagem, criamos suas variáveis e seus métodos, juntando tudo em um só arquivo, temos o seguinte:

    public class Personagem {
      public static Integer quantidadePersonagensCriados = 0;
      public static final Integer NIVEL_MAXIMO = 100;
    
      public String nome;
      public final String classe = "Guerreiro";
    
      public void usarHabilidade(String nomeDaHabilidade) {
      System.out.println("Usando " + nomeDaHabilidade + "!");
      }
    }
    

    Essa é a classe Personagem que temos no momento, ela é o modelo que nossos objetos vão seguir. Mas tem muita coisa errada nela.

    Vamos ir para a Classe Main só para testar essa classe que criamos no momento:

    public class Main {
      public static void main(String[] args) {
          // Instanciando um novo personagem
          Personagem personagem = new Personagem();
    
          // Adicionando um nome ao personagem
          personagem.nome = "Patolino";
    
          // Atualizando a quantidade de personagens criados
          personagem.quantidadePersonagensCriados = 1;
    
      }
    }
    

    Testando a nossa classe no momento, vimos que falta modificar muita coisa, vamos contar os problemas aqui:

    • Não conseguimos definir a classe do personagem, ele é guerreiro por padrão, e não conseguimos mudar isso;
    • Para definir os atributos do personagem, atribuímos o valor somente depois de já ter instanciado ele. Seria melhor escolher o nome e a classe no momento da criação;
    • Acessamos diretamente a variável do nosso objeto, isso é perigoso. As variáveis de uma classe não devem ficar expostas para qualquer um acessar e modificar;
    • Foi realizada a ação de pôr um nome no personagem diretamente no campo, mas ações devem ser realizadas via métodos;
    • Modificamos diretamente a variável quantidadePersonagensCriados, se alguém quiser pôr que foram criados 100000 personagens sem corresponder à realidade, nada poderia impedir;
    • Não faz sentido ter que mudar o valor de quantidadePersonagensCriados manualmente toda vez que instanciarmos um personagem, isso deveria ser trabalho da classe, não nosso.

    Mas e agora? O que faremos?

    Vamos chamar o Guerreiro Patolino para nos salvar?

    Nada disso, vamos refatorar a nossa classe e passar por cima desses problemas, vamos pensar em uma solução.

    • Para o problema 1, queremos que a classe do personagem seja mutável, para nós mesmo escolhermos o valor, então vamos retirar o modificador final;
    • Para o problema 2, queremos de incluir o nome e a classe do personagem no momento que criamos ele, e não adicionar os valores futuramente. Para isso, precisamos de um construtor.
    • Para os problemas 3, 4, 5 e 6, precisamos que o objeto modifique os próprios valores, e não que a gente tenha que fazer isso por ele. Também não podemos deixar as variáveis dele expostas para serem acessadas diretamente. Isso significa que precisamos trabalhar melhor o encapsulamento da nossa classe.

    Então vamos entender melhor esses conceitos, para corrigirmos a nossa classe.


    III.II - Construtor

    Construtores são utilizados para construir objetos a partir do modelo da classe, recebendo nos argumentos os valores necessários para instanciar o objeto.

    Um construtor se parece um pouco com um método, exceto por duas características:

    • Ele não tem um tipo de retorno
    • Ele tem o mesmo nome da classe.
    // Construtor com argumentos
    public Personagem(String nome, String classe) {
      this.nome = nome;
      this.classe = classe;
      quantidadePersonagensCriados++;
    }
    

    Agora, quando instanciarmos um personagem, podemos incluir os parâmetros:

    Personagem personagem = new Personagem("Patolino", "Mago");
    

    Agora sim, nosso personagem Patolino é um mago!

    Vamos explicar algumas coisas novas que nós vimos agora:

    • O this que vem antes do nome das variáveis, indica que estamos acessando o atributo do próprio objeto, enquanto as variáveis o this, são os argumentos que foram recebidos pelo construtor.
    • Aquela última linha em cada construtor, adiciona 1 na variável quantidadePersonagensCriados sempre que um personagem novo é instanciado.

    III.III - Encapsulamento

    Encapsulamento é um conceito da programação orientada a objetos que consiste em proteger os dados internos de um objeto, evitando que códigos externos consigam acessá-las diretamente. Controlando o acesso delas através de métodos, garantindo maior segurança.

    III.III.I - Getters e Setters

    Para acessar as variáveis da nossa classe, vamos utilizar métodos getters e setters:

    • Getter: Utilizado para retornar dessa variável;
    • Setter: Utilizado para definir ou modificar o valor da variável.
    // Getter da variável nome
    public String getNome() {
      return this.nome;
    }
    
    // Setter da variável nome
    public void setNome(String nome) {
      this.nome = nome;
    }
    

    Simples, não?

    Agora vamos aplicar esse conceito na nossa classe Personagem, mudando as variáveis da nossa classe para private e criando os getters e setters:

    public class Personagem {
      private static Integer quantidadePersonagensCriados = 0;
      private static final Integer NIVEL_MAXIMO = 100;
    
      private String nome;
      private String classe;
    
      public Personagem(String nome, String classe) {
          this.nome = nome;
          this.classe = classe;
          quantidadePersonagensCriados++;
      }
    
      public String getNome() {
          return this.nome;
      }
    
      public void setNome(String nome) {
          this.nome = nome;
      }
    
      public String getClasse() {
          return classe;
      }
    
      public void setClasse(String classe) {
          this.classe = classe;
      }
    
      public static Integer getQuantidadePersonagensCriados() {
          return quantidadePersonagensCriados;
      }
    
      public void usarHabilidade(String nomeDaHabilidade) {
          System.out.println("Usando " + nomeDaHabilidade + "!");
      }
    }
    

    A variável quantidadePersonagensCriados não possui setter pelo fato dela não ser modificada manualmente, ela só é modificada no momento que um novo objeto é instanciado.


    IV - Refinando os Campos da Classe

    Agora que a classe está funcional, podemos instanciar um novo personagem.

    Personagem personagem = new Personagem("Ron", "Bruxo");
    

    image

    Mas... o que garante que estamos falando sobre o personagem Ron Weasley de Harry Potter?

    Quando criamos uma classe, precisamos pensar com cuidado quais atributos um objeto daquela classe precisa ter, e quais métodos ela vai executar.

    Então antes de criarmos uma classe, precisamos planejar:

    • O que nossa classe vai ser?
    • Para que ela vai servir?
    • Quais atributos um objeto dessa classe precisa?
    • Quais ações um objeto dessa classe deve executar?

    Assim vamos conseguir definir uma classe prestativa e funcional, vamos pensar um pouco nesses pontos.

    Temos o campo nome na nossa classe, mas seria um nome completo? Só o primeiro nome? Pode ser um nome abreviado? Ou é o nome pelo qual conhecem o personagem?

    Bom, podemos mudar o campo nome para nomeCompleto. E podemos pensar em outros campos.

    Outros campos interessantes para um personagem seriam, por exemplo:

    • Nome Popular: Para identificarmos o personagem por um nome conhecido;
    • Idade: Para sabermos a idade do personagem;
    • Nível: Para representar o nível do personagem, já que temos um campo para nível máximo.

    Diagrama simples da classe personagem:

    image

    Agora que já sabemos o que nossos objetos da classe Personagem precisam, vamos pôr a mão na massa.

    public class Personagem {
      private static Integer quantidadePersonagensCriados = 0;
      private static final Integer NIVEL_MAXIMO = 100;
    
      private String nomeCompleto;
      private String nomePopular;
      private Integer idade;
      private String classe;
      private Integer nivel;
      ...
    }
    

    Agora vamos instanciar o nosso personagem para ver se os novos campos vão ajudar a identificar melhor o personagem:

    Personagem personagem = new Personagem("Ronaldo de Assis Moreira", "Ronaldinho Gaúcho", 45, "Bruxo");
    

    image

    Erramos no palpite!

    No final das contas, não era o Bruxo que imaginamos, era outro Bruxo!

    Pelo menos isso deixa claro a importância de um bom planejamento na criação das suas classes.

    Quando os atributos são bem definidos, fica mais fácil de dar uma identidade ao objeto no momento da instanciação.

    Conclusão

    Neste artigo tivemos introdução à linguagem Java e à Programação Orientada a Objetos, exploramos alguns conceitos fundamentais a criação de classes completas com a definição de variáveis, implementação de métodos, utilização de construtores e aplicação do encapsulamento para garantir melhores práticas na proteção dos dados.

    Referências 

    Compartilhe
    Recomendados para você
    GitHub Copilot - Código na Prática
    CI&T - Backend com Java & AWS
    Nexa - Machine Learning e GenAI na Prática
    Comentários (0)