Portal IDEA

Java Básico e Intermediário

 JAVA BÁSICO E INTERMEDIÁRIO

 

 

Introdução à Programação Orientada a Objetos

Conceitos de orientação a objetos

 

A programação orientada a objetos (POO) é um paradigma de desenvolvimento de software que organiza o código com base em entidades chamadas objetos, os quais representam elementos do mundo real. Essa abordagem revolucionou a forma de programar ao introduzir conceitos que tornam o código mais estruturado, reutilizável e próximo da lógica humana. A linguagem Java foi projetada desde o início sob esse paradigma, tornando-se uma das principais ferramentas para o ensino e aplicação de orientação a objetos em ambientes acadêmicos e profissionais. Este texto apresenta os principais conceitos desse modelo, abordando classes, objetos, atributos e métodos, o encapsulamento e os construtores, e finalizando com uma reflexão sobre a modelagem prática de sistemas orientados a objetos.

Classes, objetos, atributos e métodos

O ponto central da orientação a objetos é a noção de classe, que pode ser entendida como um modelo ou molde para a criação de objetos. A classe define o comportamento e as características de um determinado tipo de entidade, descrevendo quais dados ela possui (atributos) e quais ações pode executar (métodos). Assim, uma classe funciona como um plano estrutural que orienta a construção de múltiplos objetos com propriedades semelhantes, mas comportamentos próprios.

Um objeto, por sua vez, é uma instância concreta de uma classe. Ele é o elemento ativo dentro do programa, possuindo um estado, um comportamento e uma identidade. O estado é definido pelos valores de seus atributos, o comportamento é determinado pelos métodos que pode executar, e a identidade diferencia um objeto de outro, mesmo quando ambos pertencem à mesma classe. Por exemplo, em um programa que representa veículos, a classe “Carro” define os atributos e comportamentos genéricos, enquanto cada carro específico criado no programa — com cor, modelo e potência distintas — representa um objeto dessa classe.

Os atributos correspondem às características ou propriedades dos objetos. Eles armazenam os dados que descrevem o estado de uma instância e podem ser de tipos primitivos ou compostos. Já os métodos são as ações que o objeto pode realizar; representam o comportamento da classe. Os métodos podem manipular os atributos, realizar cálculos, processar informações ou interagir com outros objetos. Essa separação entre dados e comportamento é um dos fundamentos da orientação a

objetos, pois garante clareza e modularidade no código.

A interação entre objetos ocorre por meio da troca de mensagens, ou seja, da chamada de métodos de um objeto por outro. Esse modelo de comunicação torna o sistema mais próximo da realidade, já que cada componente desempenha funções específicas e se comunica com os demais para atingir um objetivo comum. Essa estrutura modular e interativa é o que confere à programação orientada a objetos sua flexibilidade e capacidade de evolução.

Encapsulamento e construtores

Um dos princípios mais importantes da orientação a objetos é o encapsulamento, que consiste em proteger os dados internos de um objeto e controlar o acesso a eles. Esse princípio assegura que os atributos não sejam modificados diretamente, mas apenas por meio de métodos específicos, chamados de métodos de acesso (getters) e métodos modificadores (setters). Essa abordagem garante que o estado do objeto permaneça consistente e evita que alterações indevidas comprometam o funcionamento do sistema.

O encapsulamento também melhora a segurança e a manutenibilidade do código, uma vez que oculta os detalhes de implementação e expõe apenas o que é necessário para o uso da classe. Isso é conhecido como o princípio do ocultamento de informações (information hiding), e faz com que as classes se tornem verdadeiros módulos independentes, capazes de evoluir sem impactar outras partes do programa.

Outro elemento essencial da estrutura de uma classe é o construtor. Ele é um método especial responsável por inicializar os objetos no momento de sua criação. O construtor define o estado inicial dos atributos e garante que o objeto esteja pronto para uso logo após ser instanciado. Em Java, o construtor tem o mesmo nome da classe e pode receber parâmetros para permitir diferentes formas de inicialização. Quando nenhum construtor é declarado, o compilador gera automaticamente um construtor padrão sem parâmetros.

Além do construtor padrão, é possível definir múltiplos construtores com diferentes listas de parâmetros, prática conhecida como sobrecarga de construtores. Isso oferece maior flexibilidade na criação de objetos, permitindo que sejam inicializados de acordo com as necessidades específicas do contexto de uso.

Assim, o programador pode criar objetos completos ou parciais, conforme a disponibilidade de informações no momento da execução.

O encapsulamento e o uso correto de construtores caminham lado a lado com outro princípio fundamental da orientação a

objetos: a coesão. Uma classe coesa é aquela que concentra responsabilidades relacionadas e mantém o controle sobre seus próprios dados. Esses conceitos são cruciais para o desenvolvimento de programas bem estruturados, que se mantêm legíveis, organizados e fáceis de evoluir.

Exercícios práticos de modelagem

A compreensão dos conceitos de orientação a objetos se consolida por meio da modelagem prática, que consiste em transformar situações reais em estruturas lógicas representadas por classes e objetos. Modelar é o processo de identificar as entidades de um sistema, seus atributos, comportamentos e relacionamentos, de forma a construir uma representação fiel e funcional da realidade dentro do software.

Um exercício clássico de modelagem é o desenvolvimento de um sistema de cadastro, como o de alunos em uma escola. Nesse exemplo, podem ser criadas classes como “Aluno”, “Professor” e “Turma”. A classe “Aluno” teria atributos como nome, matrícula e notas, e métodos para calcular médias e verificar aprovações. Já a classe “Professor” poderia conter métodos para registrar aulas e lançar avaliações, enquanto “Turma” serviria para agrupar alunos e associá-los a um professor. Essa estrutura modular permite que cada classe mantenha responsabilidades bem definidas e interaja com as demais de forma ordenada.

Outro exemplo de modelagem prática é o sistema de controle de estoque. Classes como “Produto”, “Fornecedor” e “Pedido” representam as entidades principais. O produto teria atributos como preço, quantidade e código de identificação, além de métodos para atualizar o estoque e calcular valores totais. O fornecedor manteria dados de contato e relação de produtos, enquanto o pedido registraria as movimentações de entrada e saída de mercadorias. Essa forma de organização permite que o sistema cresça sem perder consistência, com a inclusão de novas funcionalidades ou integrações.

Durante o processo de modelagem, é importante seguir alguns princípios da engenharia de software, como responsabilidade única (cada classe deve ter apenas uma função bem definida) e baixo acoplamento (as classes devem depender minimamente umas das outras). Essas boas práticas garantem que o sistema seja flexível, de fácil manutenção e menos suscetível a erros.

Os exercícios de modelagem também servem como ponto de partida para compreender outros conceitos mais avançados da programação orientada a objetos, como herança, polimorfismo e interfaces, que expandem a capacidade de abstração e

reutilização do código. Dessa forma, a prática da modelagem não apenas solidifica os fundamentos, mas também prepara o programador para lidar com sistemas complexos e em constante evolução.

Considerações finais

A orientação a objetos trouxe uma nova maneira de pensar e desenvolver programas, aproximando a lógica computacional da realidade cotidiana. Compreender classes, objetos, atributos e métodos é fundamental para estruturar programas claros e funcionais. O encapsulamento protege e organiza os dados, enquanto os construtores asseguram que os objetos sejam criados corretamente e de forma controlada. A modelagem prática permite transformar problemas reais em soluções digitais estruturadas, promovendo a aplicação direta dos conceitos teóricos.

Esses fundamentos são indispensáveis para qualquer desenvolvedor que deseje dominar a linguagem Java ou outras linguagens modernas baseadas em objetos. Mais do que uma técnica de programação, a orientação a objetos representa um modo de pensar que favorece a clareza, a modularidade e a evolução contínua dos sistemas de software.

Referências Bibliográficas

  • DEITEL, Paul; DEITEL, Harvey. Java: Como Programar. 10ª ed. São Paulo: Pearson, 2016.
  • SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 2ª ed. Rio de Janeiro: Alta Books, 2019.
  • HORSTMANN, Cay S. Core Java Volume I: Fundamentals. 12ª ed. Upper Saddle River: Prentice Hall, 2021.
  • ECKEL, Bruce. Thinking in Java. 4ª ed. Prentice Hall, 2006.
  • ORACLE. The Java™ Tutorials. Disponível em: https://docs.oracle.com/javase/tutorial/. Acesso em: out. 2025.

 

Herança e Polimorfismo em Java

 

A orientação a objetos é um dos paradigmas mais poderosos e difundidos da programação moderna, permitindo que sistemas sejam construídos de maneira modular, reutilizável e próxima à forma como o ser humano percebe o mundo. Dentro desse paradigma, dois conceitos se destacam como pilares fundamentais: herança e polimorfismo. Esses mecanismos promovem a reutilização de código, a extensibilidade e a flexibilidade das aplicações, tornando o desenvolvimento mais eficiente e organizado. Na linguagem Java, esses conceitos são aplicados de forma estruturada e padronizada, reforçando a coesão e a manutenção do código. Este texto aborda o conceito e a implementação da herança, a sobrescrita e o polimorfismo dinâmico, além da importância da classe Object e do método toString(), que formam a base do modelo de objetos da linguagem.

Conceito e

implementação de herança

A herança é um dos princípios centrais da programação orientada a objetos e tem como objetivo permitir que uma classe compartilhe características e comportamentos com outra. Em termos conceituais, a herança representa uma relação de especialização, na qual uma classe filha (ou subclasse) herda atributos e métodos de uma classe pai (ou superclasse). Essa estrutura possibilita que o programador evite a repetição de código e promova a reutilização de componentes já existentes, o que torna o desenvolvimento mais ágil e o código mais fácil de manter.

A herança reflete a ideia de que muitas entidades no mundo real compartilham características comuns. Por exemplo, em um sistema que representa animais, pode-se criar uma classe genérica chamada “Animal”, contendo atributos como nome e idade, e métodos como “alimentar” e “dormir”.

As subclasses, como “Cachorro” e “Gato”, herdam essas características e podem adicionar comportamentos específicos, como “latir” ou “miar”. Esse processo de especialização é o que caracteriza a herança: uma classe mais específica amplia ou modifica as funcionalidades de uma classe mais genérica.

Em Java, a herança é simples, ou seja, uma classe só pode herdar diretamente de uma única superclasse. Essa escolha foi feita para evitar ambiguidades e conflitos que ocorrem em linguagens que permitem herança múltipla. No entanto, Java oferece um recurso complementar chamado interfaces, que possibilita implementar comportamentos adicionais sem quebrar a hierarquia de classes. Assim, combina-se a herança de classes com a implementação de interfaces para obter flexibilidade e robustez.

A herança também permite o uso de métodos e atributos protegidos, que ficam acessíveis apenas dentro da classe e de suas subclasses, mantendo o equilíbrio entre encapsulamento e extensibilidade. Por outro lado, a herança deve ser aplicada com cautela: quando mal utilizada, pode gerar dependências desnecessárias e dificultar a manutenção. A boa prática consiste em utilizá-la apenas quando há uma clara relação “é um tipo de” entre as classes envolvidas. Essa relação semântica garante que o uso da herança respeite a lógica natural do sistema.

Sobrescrita e polimorfismo dinâmico

A sobrescrita de métodos é um dos principais mecanismos que permitem o uso efetivo da herança. Ela ocorre quando uma subclasse redefine um método herdado da superclasse, adaptando seu comportamento às necessidades específicas da nova classe. Assim, o método mantém

os principais mecanismos que permitem o uso efetivo da herança. Ela ocorre quando uma subclasse redefine um método herdado da superclasse, adaptando seu comportamento às necessidades específicas da nova classe. Assim, o método mantém o mesmo nome, tipo de retorno e parâmetros, mas executa uma lógica diferente. A sobrescrita garante que as classes derivadas possam especializar os comportamentos herdados, mantendo a estrutura geral da hierarquia.

A sobrescrita está intimamente ligada ao conceito de polimorfismo, que significa “muitas formas”. Em programação, o polimorfismo permite que um mesmo método ou referência possa se comportar de maneiras diferentes, dependendo do tipo do objeto que o utiliza. Em outras palavras, um método chamado em uma variável de tipo genérico pode executar ações distintas conforme o objeto real associado a ela.

O polimorfismo dinâmico ocorre em tempo de execução, quando o sistema identifica qual implementação do método deve ser executada com base no tipo real do objeto. Essa característica torna o código mais flexível e extensível, pois permite que novas classes sejam adicionadas ao sistema sem necessidade de alterar o código existente. Por exemplo, se uma classe “Animal” possui um método “emitirSom()” e suas subclasses “Cachorro” e “Gato” sobrescrevem esse método, o programa pode chamar “emitirSom()” de forma genérica, e cada objeto responderá com o som apropriado.

Esse comportamento dinâmico é uma das principais forças da orientação a objetos, pois facilita o uso de polimorfismo em coleções, métodos genéricos e interfaces, além de permitir a implementação de sistemas baseados em abstrações, em vez de classes concretas. O polimorfismo reduz o acoplamento entre as partes do código e aumenta a flexibilidade para futuras expansões, o que é essencial em projetos de longo prazo.

Entretanto, é importante compreender que o polimorfismo deve ser utilizado de maneira planejada, pois o excesso de hierarquias ou sobrescritas desnecessárias pode dificultar a leitura e depuração do código. O equilíbrio entre generalização e especialização é o que torna o design orientado a objetos eficiente e sustentável.

A classe Object e o método toString()

No topo da hierarquia de classes em Java encontra-se a classe Object, a superclasse de todas as outras classes da linguagem. Isso significa que todas as classes em Java, mesmo que não o declarem explicitamente, herdam da classe Object e, portanto, possuem um conjunto de métodos básicos que podem ser

a superclasse de todas as outras classes da linguagem. Isso significa que todas as classes em Java, mesmo que não o declarem explicitamente, herdam da classe Object e, portanto, possuem um conjunto de métodos básicos que podem ser utilizados ou sobrescritos. Essa estrutura padronizada é um dos elementos que tornam o Java uma linguagem coerente e consistente, pois garante que todos os objetos compartilhem comportamentos mínimos comuns.

Entre os métodos herdados da classe Object estão equals(), hashCode(), clone(), getClass(), finalize() e toString(). Dentre esses, o método toString() é um dos mais utilizados e frequentemente sobrescritos. Sua função é retornar uma representação textual de um objeto, geralmente usada para exibição ou depuração. Por padrão, o método toString() retorna o nome da classe seguido por um código hash numérico, o que nem sempre é útil para o programador. Por isso, é comum sobrescrever esse método para retornar informações mais significativas sobre o estado do objeto, como seus atributos e valores.

A sobrescrita do toString() é uma prática recomendada em Java, pois facilita a leitura de dados e a compreensão do comportamento de objetos durante o desenvolvimento. Por exemplo, ao exibir uma lista de objetos no console, cada item pode apresentar suas informações de maneira clara e organizada, tornando o processo de teste e depuração mais eficiente. Além disso, o método é amplamente utilizado em bibliotecas e frameworks para conversão automática de objetos em texto, como em logs, interfaces gráficas e respostas de APIs.

O fato de todos os objetos em Java derivarem de Object também possibilita o uso de recursos genéricos, já que qualquer estrutura que manipule tipos de dados distintos pode tratá-los como instâncias de Object. Esse princípio reforça o caráter unificado e polimórfico da linguagem, permitindo a criação de sistemas que funcionam com diferentes tipos de objetos de forma genérica e segura.

Considerações finais

Os conceitos de herança e polimorfismo são fundamentais para compreender o funcionamento da linguagem Java e o paradigma orientado a objetos. A herança promove a reutilização e a organização do código, permitindo que classes compartilhem atributos e métodos de forma hierárquica e lógica. A sobrescrita e o polimorfismo dinâmico trazem flexibilidade e extensibilidade, possibilitando que o comportamento dos objetos varie conforme o contexto de execução, sem comprometer a estrutura geral do sistema. Já a classe Object e

e o método toString() representam a base da unificação entre todos os objetos Java, reforçando o princípio de que tudo na linguagem deriva de uma raiz comum.

Com a aplicação correta desses conceitos, o desenvolvedor é capaz de construir sistemas mais coesos, escaláveis e de fácil manutenção. A herança e o polimorfismo não apenas reduzem a redundância de código, mas também incentivam a criação de soluções que se adaptam às mudanças e evoluem de forma natural. Assim, compreender e dominar esses mecanismos é um passo essencial na formação de qualquer programador Java que aspire à excelência técnica e à construção de software orientado a boas práticas.

Referências Bibliográficas

  • DEITEL, Paul; DEITEL, Harvey. Java: Como Programar. 10ª ed. São Paulo: Pearson, 2016.
  • SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 2ª ed. Rio de Janeiro: Alta Books, 2019.
  • HORSTMANN, Cay S. Core Java Volume I: Fundamentals. 12ª ed. Upper Saddle River: Prentice Hall, 2021.
  • ECKEL, Bruce. Thinking in Java. 4ª ed. Prentice Hall, 2006.
  • ORACLE. The Java™ Tutorials. Disponível em: https://docs.oracle.com/javase/tutorial/. Acesso em: out. 2025.

 

Interfaces e Boas Práticas em Java

 

A programação orientada a objetos é sustentada por princípios que visam a modularidade, a clareza e a reutilização de código. Dentro desse contexto, os conceitos de interfaces, classes abstratas e boas práticas de programação limpa são fundamentais para o desenvolvimento de sistemas robustos, escaláveis e de fácil manutenção. A linguagem Java foi concebida com esses princípios em sua base, oferecendo mecanismos que incentivam o design estruturado e o uso consciente dos recursos da orientação a objetos. Este texto aborda os conceitos e aplicações de interfaces e classes abstratas, a importância dos pacotes e da organização do código, e as principais boas práticas e princípios da programação limpa que orientam o desenvolvimento de software de qualidade.

Interfaces e classes abstratas

As interfaces e as classes abstratas representam dois dos principais mecanismos de abstração em Java. Ambas permitem definir comportamentos genéricos que podem ser implementados ou especializados por outras classes, promovendo a flexibilidade e a reutilização de código. No entanto, cada uma delas possui um papel e um propósito distintos dentro da arquitetura de um sistema.

Uma interface é um contrato que define um conjunto de métodos que uma classe deve obrigatoriamente

implementar. Diferente de uma classe comum, a interface não contém lógica concreta, mas apenas as assinaturas dos métodos, indicando o que deve ser feito, e não como. Essa característica permite que diferentes classes implementem a mesma interface de maneiras diversas, respeitando o princípio do polimorfismo.

Por exemplo, as interfaces são amplamente utilizadas em frameworks e bibliotecas para padronizar comportamentos, garantindo que classes distintas possam ser tratadas de forma uniforme.

Além disso, uma classe pode implementar múltiplas interfaces, o que confere ao Java uma forma controlada de herança múltipla, sem os problemas de ambiguidade que ocorrem em outras linguagens. Esse recurso é fundamental para o desenvolvimento de sistemas modulares e extensíveis, permitindo que novas funcionalidades sejam adicionadas sem necessidade de alterar o código existente.

As classes abstratas, por sua vez, servem como modelos parciais que podem conter tanto métodos abstratos (sem implementação) quanto métodos concretos (já implementados). Elas são utilizadas quando há a necessidade de compartilhar comportamentos comuns entre diversas classes, mas ainda manter a possibilidade de especialização. Uma classe abstrata não pode ser instanciada diretamente; ela serve de base para outras classes que estendem suas funcionalidades.

A escolha entre interface e classe abstrata depende do contexto de uso: interfaces são ideais para definir contratos de comportamento sem estado, enquanto classes abstratas são adequadas quando há características compartilhadas e uma hierarquia lógica entre as classes. Ambas promovem a abstração, princípio essencial da programação orientada a objetos, que visa simplificar a complexidade de um sistema ao representar apenas os aspectos relevantes de cada entidade.

Pacotes e organização do código

A organização do código é um fator determinante para a qualidade de um sistema. Em Java, isso é alcançado principalmente por meio dos pacotes (packages), que são agrupamentos lógicos de classes, interfaces e outros componentes relacionados. Os pacotes funcionam como diretórios virtuais que ajudam a estruturar o projeto, evitando conflitos de nomes e facilitando a manutenção do código.

Cada pacote representa uma unidade funcional dentro do sistema, podendo agrupar componentes que desempenham papéis semelhantes ou que pertencem a uma mesma área de responsabilidade. Por exemplo, em uma aplicação empresarial, é comum organizar pacotes como model (para

classes de dados), controller (para lógica de controle) e view (para interface com o usuário). Essa divisão, inspirada no padrão de arquitetura MVC (Model-View-Controller), contribui para a separação de responsabilidades e para a modularidade do código.

A utilização correta dos pacotes também melhora a legibilidade e o desempenho de um projeto. Em sistemas grandes, a ausência de uma estrutura organizada pode gerar confusão e dificultar o trabalho em equipe. Por isso, é recomendável adotar convenções de nomenclatura padronizadas, utilizando letras minúsculas e hierarquias baseadas no domínio do projeto. Por exemplo, um pacote de uma empresa fictícia chamada “Idea Cursos” poderia ser identificado como br.idea.cursos.modulo, seguindo a convenção de domínio reverso adotada internacionalmente.

Além da estrutura física, a organização lógica do código também é essencial. O uso adequado de modificadores de acesso (public, private, protected) define claramente o nível de visibilidade e de interação entre os componentes, prevenindo acessos indevidos e preservando o encapsulamento.

Essa abordagem reduz o acoplamento entre módulos e melhora a coesão interna das classes, favorecendo a manutenção e a evolução do software.

Boas práticas e princípios de programação limpa

A qualidade de um programa não está apenas em seu funcionamento, mas também em sua legibilidade, clareza e simplicidade. O conceito de programação limpa (clean code), popularizado por Robert C. Martin, propõe um conjunto de boas práticas que visam tornar o código mais compreensível, sustentável e fácil de modificar. Em Java, aplicar esses princípios é essencial para garantir que os sistemas sejam escaláveis e de longa duração.

Entre as principais boas práticas, destaca-se o uso de nomes significativos para classes, métodos e variáveis. O código deve ser autoexplicativo, de modo que qualquer desenvolvedor consiga compreender sua função sem depender de comentários extensos. Métodos curtos, com uma única responsabilidade, também são recomendados, pois aumentam a clareza e facilitam os testes e a reutilização.

Outro princípio importante é o da responsabilidade única (Single Responsibility Principle), que estabelece que cada classe ou método deve ter apenas uma razão para mudar. Isso evita que uma mesma parte do código acumule funções distintas e se torne difícil de manter. Da mesma forma, o princípio Open/Closed recomenda que o código esteja aberto para extensão, mas fechado para modificação,

permitindo evoluir sem comprometer a estabilidade do sistema.

O uso consciente da herança, interfaces e composição é outra boa prática essencial. Em muitos casos, a composição — ou seja, a combinação de objetos dentro de outros — é preferível à herança, pois reduz o acoplamento e aumenta a flexibilidade. A escolha adequada entre esses recursos depende da relação semântica entre as classes e do grau de reutilização desejado.

A documentação também é um elemento importante da programação limpa. Embora o código deva ser o mais autoexplicativo possível, comentários claros sobre a finalidade de classes e métodos ajudam na compreensão do sistema como um todo. Em Java, a ferramenta Javadoc permite gerar documentação automática a partir de anotações no código, tornando essa prática ainda mais eficiente.

Por fim, a testabilidade é um dos pilares da programação de qualidade. O código bem estruturado, modular e coeso facilita a criação de testes automatizados, garantindo que cada componente funcione corretamente e que futuras alterações não introduzam erros. A aplicação desses princípios não apenas melhora a qualidade técnica do software, mas também reduz custos de manutenção e aumenta a produtividade da equipe de desenvolvimento.

Considerações finais

As interfaces, classes abstratas e boas práticas de programação limpa formam a base de um desenvolvimento orientado à qualidade e à sustentabilidade. As interfaces definem contratos e promovem o polimorfismo, as classes abstratas fornecem modelos reutilizáveis, e os pacotes garantem organização e modularidade. Já os princípios da programação limpa asseguram que o código seja compreensível, coeso e de fácil evolução.

Em conjunto, esses elementos refletem a filosofia central do Java: a criação de sistemas robustos, legíveis e escaláveis, capazes de acompanhar as mudanças tecnológicas e organizacionais. O programador que domina esses conceitos não apenas escreve código funcional, mas também constrói soluções duradouras, seguras e alinhadas às boas práticas da engenharia de software moderna.

Referências Bibliográficas

  • DEITEL, Paul; DEITEL, Harvey. Java: Como Programar. 10ª ed. São Paulo: Pearson, 2016.
  • SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 2ª ed. Rio de Janeiro: Alta Books, 2019.
  • HORSTMANN, Cay S. Core Java Volume I: Fundamentals. 12ª ed. Upper Saddle River: Prentice Hall, 2021.
  • ECKEL, Bruce. Thinking in Java. 4ª ed. Prentice Hall, 2006.
  • MARTIN, Robert C. Código
  • Limpo: Habilidades Práticas do Agile Software. São Paulo: Alta Books, 2009.
  • ORACLE. The Java™ Tutorials. Disponível em: https://docs.oracle.com/javase/tutorial/. Acesso em: out. 2025.

Quer acesso gratuito a mais materiais como este?

Acesse materiais, apostilas e vídeos em mais de 3000 cursos, tudo isso gratuitamente!

Matricule-se Agora