Aprogramação orientada a objetos surgiu como uma alternativa de organização do código de forma que seu desenvolvimento e manutenção fossem a mais próximas o possível das entidades/objetos que elas representam no mundo real. Se um programa em questão é para uma fábrica de carros, por exemplo, é muito provável que na modelagem deste programa existam as classes Carro, Porta, Roda, Volante… Se for para um supermercado, é provável que existam as classes Carrinho, Produto, Caixa… e assim por diante.
No Java, todos os objetos são representados por classes. Nessas classes, ficam armazenados todos os comportamentos e características que esta entidade conterá. Esses comportamentos e características são formadas por métodos e atributos (às vezes até mesmo outras classes internas), respectivamente. Os objetos em si são instâncias de classes, ou seja, os objetos são o que dão vida a estrutura projetada em uma classe. Fazendo uma analogia, a classe seria como a planta baixa de uma casa e o objeto a sua construção. Ou seja, com um único planejamento, é possível ter várias réplicas de uma casa. Um diz respeito ao planejamento e o outro a execução.

Figura 1 - Analogia da relação entre uma classe e um objeto.
Para criar (instanciar) um novo objeto, é usado a palavra reservada new acompanhada do método construtor da classe (que por sua vez, pode conter parâmetros). Por exemplo:

Neste código, a variável exemplo é um novo objeto da classe String. A partir deste ponto, é possível usar a variável com todos os métodos disponíveis na implementação da classe. Este exemplo foi com uma classe já implementada e disponibilizada pelo Java, mas é possível criar qualquer classe utilizando a palavra reservada class. No exemplo abaixo, uma classe Produto é criada com um atributo e um método.

Além dos conceitos de classe e objeto, a programação orientada a objetos conta com um outro conceito muito importante chamado encapsulamento. O conceito de encapsulamento está associado à forma como os atributos e métodos de uma classe, como os criados no exemplo anterior, são visíveis para as demais classes. A ideia deste conceito é fazer da classe uma pequena cápsula, ou seja, encapsular os dados de modo a restringir o acesso ao seu conteúdo.
O encapsulamento é importante pois se dentro de uma classe todos os seus métodos e atributos fossem acessíveis por todas as outras classes, seria praticamente impossível garantir a segurança de uma aplicação e, além disso, bastante improvável de estruturar o código de forma organizada, afinal, todas as pessoas envolvidas em um mesmo projeto poderiam usar todos os métodos de todas classes livremente, mesmo que não tenham sido pensadas para serem usadas desta forma. Em resumo, a literatura aponta três grandes benefícios do uso do encapsulamento:
Para fazer uso destes benefícios, o Java oferece alguns níveis de visibilidade para seus elementos. Esses níveis são chamados de modificadores de acesso. Os modificadores disponíveis são:

Independente do tipo de visibilidade, uma vez que a classe é instanciada, seus métodos e atributos são acessíveis através do operador de ponto (ponto final). No exemplo abaixo, a classe Pessoa invoca o seu próprio método e seus atributos no método construtor, ou seja, o método que é invocado quando a classe vai criar( instanciar) um novo objeto:

Nesta classe Pessoa, há dois atributos marcados como privados (private). Eles são: nome e idade. Sendo privados, eles são acessíveis somente dentro da própria classe. Por outro lado, dentro do construtor da classe há dois métodos sendo chamados: setNome() e setIdade(). Esses métodos evitam que seja feito o acesso direto aos atributos da classe e os torna disponíveis para que outras classes possam modificá-las. Ou seja, desta forma é possível ter atributos que são privados e jamais vistos por outras entidades.
Atividade Extra