A noção de "cidadão de primeira classe" ou "elemento de primeira classe em uma linguagem de programação foi introduzida pelo cientista britânico de computação Christopher Strachey nos anos 60, no contexto de funções de primeira classe. A formulação mais famosa deste princípio está provavelmente em Estrutura e Interpretação de Programas de Computador por Gerald Jay Sussman e Harry Abelson:
- They may be named by variables.
- They may be passed as arguments to procedures.
- They may be returned as the results of procedures.
- They may be included in data structures.
Basicamente, isso significa que você pode fazer com este elemento de linguagem de programação tudo o que você pode fazer com todos os outros elementos na linguagem de programação.
É tudo sobre "direitos iguais": você pode fazer todos os itens acima, com, por exemplo, inteiros, então por que qualquer outra coisa deveria ser diferente?
A definição acima é um pouco restritiva no sentido de que ela só fala sobre o aspecto da primeira classe como relacionado a ser objetos do programa. Uma definição mais geral seria que uma coisa é de primeira classe, se você pode fazer tudo com ela, você também pode fazer com outras coisas do mesmo tipo.
Por exemplo, os operadores Java e os métodos Java são de tipo semelhante. Você pode definir novos métodos, você pode escolher (um pouco) livremente os nomes de seus próprios métodos, você pode substituir métodos, você pode sobrecarregar métodos. James Gosling pode fazer tudo isso com os operadores também, mas você e eu não conseguimos. Quero dizer, ao contrário da crença popular, o Java suporta a sobrecarga do operador: por exemplo, o operador +
está sobrecarregado para byte
, short
, int
, long
, float
, double
e String
, e IIRC no Java 7 também para BigInteger
e BigDecimal
(e provavelmente um casal que eu esqueci), é só que você não tem nenhuma influência acima dele. Isso claramente torna os operadores de segunda classe de acordo com essa segunda definição. Note que os métodos ainda não são objetos de primeira classe de acordo com a primeira definição. (Isso torna os operadores de terceira classe?)