Idealmente, existe essa ideia de que "classe é o molde (ou a receita, ou a planta da casa), e a instância é o objeto em si (ou o bolo, ou a casa propriamente dita)". Neste caso, os campos (que não é a mesma coisa que atributo) seriam uma forma de guardar o estado do objeto (informações que determinam o valor daquela instância, a grosso modo). E os métodos são formas de se manipular o objeto, ou obter informações dele.
Mas nada impede que se tenha apenas métodos. Isso é comum em classes utilitárias, cujo objetivo é "fazer algo", sem depender do estado interno. Um exemplo que tem no Java é a classe Math
, que só possui métodos estáticos. Afinal, para arredondar um número para baixo não precisa de variáveis de instância para guardar o estado interno do objeto Math
. O método Math.floor
só faz o cálculo e pronto. Por que precisaria de m = new Math()
para depois chamar m.floor
, sendo que o método floor
faz todo o trabalho, sem precisar de nenhuma variável de instância?
Isso é por causa da limitação regra da linguagem que diz que tudo precisa estar dentro de uma classe. Não pode ter uma função "solta" ou em módulos, que nem no JavaScript, por exemplo. Daí que muitas vezes a classe só está lá para cumprir esta "burocracia" da linguagem.
E nem vou mencionar que muitas vezes as pessoas programam em Java de forma procedural. O fato do código estar em uma classe não garante que ele será orientado a objeto.
Obs: nas versões mais novas é possível rodar um programa sem criar uma classe explicitamente, mas não se engane, pois internamente ainda é criada uma classe.
E vale lembrar - como eu já disse aqui e aqui - que não existe uma definição única, canônica e universal sobre Orientação a Objetos (sugiro que leia esses links, e também os outros links que estão lá). Mas só pra resumir:
- existem várias "escolas"/vertentes de orientação a objeto (uma delas se tornou a mais comum, e muita gente acha que é a única, ou a "certa")
- usar classes não é a única forma de se obter um código OO (independente da vertente escolhida). JavaScript, por exemplo, usa protótipos (até existe a palavra-chave
class
, mas ela é um syntatic sugar)
Ou seja, existe a definição "clássica" de classe: o molde a partir do qual serão criadas as instâncias. Mas dependendo da linguagem, este conceito pode acabar sendo subvertido. No caso do Java, como tudo precisa estar dentro de uma classe, os módulos (muito comuns em outras linguagens) acabam sendo emulados como classes utilitárias, que geralmente só possuem métodos estáticos e nem dá para criar uma instância (muitas têm o construtor privado - não tem como fazer new Math()
por exemplo).