Cette notion apparait dès qu'une classe est considérée comme un objet. La classe a les droits d'un objet :
UneClasse := new(¯MétaClasse, "UneClasse",[(var1, Type1), ...])
L'identificateur UneClasse, à gauche du symbole d'affectation (:=), désigne une variable, qui a pour valeur la nouvelle classe créée. Les ``[, ]'' symbolisent les listes (pas de variables de classes ici). L'invariant par défaut est vrai. Les méthodes d'instance seront définies ultérieurement.
structure ¯champs : Liste[Champ]contrainte : Invariant
variablesDeClasse : Liste[Champ]
m'ethodes : Dictionnaire[M'ethode]
m'ethodesDeClasse : Dictionnaire[M'ethode]
m'ethodes new : String Liste[Champ] Invariant Liste[Champ] Classe
meta.classeLa classe MétaClasse
La présence de méta-classes rend le langage souvent plus uniforme, en particulier la création des instances peut se faire par envoi de message. Un autre avantage est de pouvoir paramétrer et redéfinir le comportement du système objet. La présence de méta-classes s'accompagne souvent d'un protocole des méta-objets. Celui-ci donne une définition quasi-réflexive des classes et des méta-classes primitives du système. Il permet de plus une reconfiguration partielle du système. Ceci est possible par la définition de nouvelles méta-classes ayant des comportements différents de ceux prédéfinis, par exemple, au niveau de l'héritage ou de la création et de l'initialisation des instances. Les méta-objets n'existent pas dans tout les langages de classes, par exemple il n'y en a pas en Eiffel, en SCOOPS ou en C++. Dans un système avec méta-objets comme ObjVlisp [Coi87] la distinction entre classe et méta-classe disparaît dans la mesure où une classe est aussi une instance. Les variables et méthodes de classes ne seront plus rangées dans la structure de la classe comme dans la meta.classe mais dans la méta-classe.
En Smalltalk, chaque classe Classe est instance d'une seule méta-classe appelée Classe class. La méta-classe contient la structure (variables de classes, variables d'instance de la méta-classe) et le protocole de classe (méthodes de classes). Dans le protocole de la méta-classe, figurent les méthodes d'instanciation, les méthodes d'initialisations des variables de la structure de la classe et des méthodes globales accessibles sans créer d'instances de la classe (par exemple écriture sur la console, lancement du ramasse-miette, etc.).