Le constructeur est une méthode spéciale d'une classe, permettant d'initialiser les membres de cette classe et également, d'exécuter différentes opérations initiales définies par le programmeur.

L'instanciation d'une classe (ou la création d'un objet) nécessite l'utilisation de l'opérateur new appelant un constructeur.

NomClasse ref_objet = new Constructeur();

L'identificateur du constructeur doit être en tout point identique à l'identificateur de la classe.

IdentificateurClasse ref_objet = new IdentificateurClasse();

En l'absence d'une déclaration de constructeur dans une classe, le compilateur Java en génère automatiquement un par défaut, lequel n'aura pas d'argument et aucune autre fonction que de créer un objet.

public class UneClasse {
  // Aucun constructeur défini
  ...
}
// est équivalent à
public class UneClasse {
  // Génération automatique de ce constructeur
  public UneClasse(){
    super();
  }
  ...
}

Le modificateur d'accès du constructeur par défaut, est toujours le même que celui de sa classe.

Afin d'éviter cette création automatique, il peut être parfois préférable de déclarer un constructeur mieux adapté aux besoins de la classe.

class NomClasse {
  // méthode constructeur
  modificateur NomClasse([type Paramètre, ...])
                         [throws ClasseExceptions...] {
  // Bloc d'instructions...
  }
}
...
//Instanciation de la classe
NomClasse ref_objet = new NomClasse([Arguments]);

Le constructeur doit avoir un identificateur en tout point semblable à celui de sa classe.

Les constructeurs peuvent être déclarés avec un modificateur d'accès public, protected, par défaut ou private.
Les constructeurs sont par défaut uniquement accessibles dans le paquetage de la classe parente.
Le modificateur private entraîne l'impossibilité d'instancier la classe du constructeur et également de l'étendre.

Un constructeur ne peut être déclaré avec les modificateurs suivants : abstract, static, final, native, synchronized, ou strictfp.
Si la classe est FP-Strict, le constructeur l'est également implicitement.

Le constructeur ne peut retourner une valeur, et donc, sa déclaration ne contient aucun type de retour. En fait, l'instance de l'objet est toujours le type retourné par un constructeur.

Le constructeur peut posséder un à plusieurs paramètres permettant notamment l'affectation des champs de l'objet avec des valeurs fournies par l'utilisateur.

class Article {
  int idProduit;
  float prix;
  float reduction;

  Article(int idProduit, float prix, float reduction) {
    this.idProduit = idProduit;
    this.prix = prix;
    this.reduction = reduction;
  }
}

Article livre = new Article(9782212075021, 55.0, 5.0);

La clause throws optionnelle permet d'indiquer que le constructeur peut déclencher les exceptions spécifiées.

La définition d'un constructeur doit apparaître au moins une fois dans une classe, mais n'est en aucun cas une nécessité absolue, dans la mesure où aucune initialisation particulière ne serait nécessaire au démarrage de l'objet.

Parfois, il est utile de définir dans une classe, plusieurs constructeurs avec des signatures distinctes (voir La surcharge des méthodes). Cela permet d'initialiser un objet de plusieurs façons différentes.

class Article {
  String nomProduit;
  int idProduit;
  float prix;
  float reduction;

  public Article(int idProduit, float prix, float reduction) {
    this.idProduit = idProduit;
    this.prix = prix;
    this.reduction = reduction;
  }

  public Article(String nomProduit, float prix, float reduction) {
    this.nomProduit = nomProduit;
    this.prix = prix;
    this.reduction = reduction;
  }
}
...
Article livre = new Article(9782744090004, 329.0, 0.0);

Article livre = new Article("Maîtrisez Java 2", 329.0, 0.0);

Utilisé avec des constructeurs multiples, le mot clé this contient la liste des arguments correspondant à la liste des paramètres d'un des constructeurs de la classe en cours, permettant d'abréger la rédaction des affectations dans les définitions suivantes.

import java.util.*;
import java.text.*;

class UneClasse {
  String date_envoi;
  String expediteur;

  String destinataire;

  public UneClasse(String dest, String exp){
    Date date_actuelle = new Date();
    DateFormat formatage =
             DateFormat.getDateInstance(DateFormat.FULL, Locale.FRANCE);
    date_envoi = formatage.format(date_actuelle);
    expediteur = exp;
    destinataire = dest;
    System.out.println("nUneClasse(String String)");
    System.out.println("Date : " + date_envoi);
    System.out.println("Expéditeur : " + expediteur);
    System.out.println("destinataire : " + destinataire);
  }
  public UneClasse(int jm, int mm, int aaaa,
                            String dest, String exp){
    this(dest, exp);
    date_envoi = jm + "/" + mm + "/" + aaaa;
    System.out.println("nUneClasse(int int int String String)");
    System.out.println("Date : " + date_envoi);
    System.out.println("Expéditeur : " + expediteur);
    System.out.println("destinataire : " + destinataire);
  }
  public UneClasse(String js, int jm, String mm, int aaaa,
                            String dest, String exp){
    this(dest, exp);
    date_envoi = js + " " + jm + " " + mm + " " + aaaa;
    System.out.println("nUneClasse(String int String int String String)");
    System.out.println("Date : " + date_envoi);
    System.out.println("Expéditeur : " + expediteur);
    System.out.println("destinataire : " + destinataire);
  }
  public UneClasse(int jm, String mm, int aaaa,
                            String dest, String exp){
    this(dest, exp);
    date_envoi = jm + " " + mm + " " + aaaa;
    System.out.println("nUneClasse(int String int String String)");
    System.out.println("Date : " + date_envoi);
    System.out.println("Expéditeur : " + expediteur);
    System.out.println("destinataire : " + destinataire);
  }
  public UneClasse(String dest){
    this(4, 11, 2002, dest, "ADV Consulting");
    System.out.println("nUneClasse(String)");
    System.out.println("Date : " + date_envoi);
    System.out.println("Expéditeur : " + expediteur);
    System.out.println("destinataire : " + destinataire);
  }

  public static void main(String[] args){
    UneClasse obj1 = 
        new UneClasse("adresse destinataire", "adresse expéditeur");
    UneClasse obj2 = 
        new UneClasse(2, 11, 2002, 
                          "adresse destinataire", "adresse expéditeur");
    UneClasse obj3 = 
        new UneClasse("Samedi", 2, "Novembre", 2002, 
                          "adresse destinataire", "adresse expéditeur");
    UneClasse obj4 = new UneClasse("adresse destinataire");
  }
}

Dans des conditions similaires, le mot clé super contient la liste des arguments correspondant à la liste des paramètres d'un des constructeurs de la superclasse, permettant d'invoquer directement ce constructeur à partir de la classe étendue.

import java.util.*;
import java.text.*;

class SousClasse extends SuperClasse {
  String date_envoi;
  String destinataire;

  public SousClasse(String date_complete, String exp){
    this("Madame","MALLET", "Carole", 
                  "1 allee d'Artois", 
                  93330, "Neuilly-sur-Marne");
    date_envoi = date_complete;
    expediteur = exp;
    System.out.println("Date : " + date_envoi);
    System.out.println("Expéditeur : " + expediteur);
    System.out.println("destinataire : " + destinataire);
  }

  public SousClasse(String civilite,
                                String nom,
                                String prenom,
                                String adresse,
                                int code_postal,
                                String ville){
    super(nom, prenom, adresse, code_postal, ville);
    Date date_actuelle = new Date();
    DateFormat formatage = 
             DateFormat.getDateInstance(DateFormat.FULL, Locale.FRANCE);
    this.date_envoi = formatage.format(date_actuelle);
    this.destinataire = 
                       civilite + " " + super.adresse_expedition;
    System.out.println("Date : " + date_envoi);
    System.out.println("destinataire (SousClasse) :n" 
                             + destinataire);
  }

  public SousClasse(int date_complete, String exp){
    super("144 avenue Saint Antoine", 13015);
    Integer dd = new Integer(date_complete);
    date_envoi = dd.toString();
    expediteur = exp;
    this.destinataire = super.adresse_expedition;
    System.out.println("Date : " + date_envoi);
    System.out.println("Expéditeur : " + expediteur);
    System.out.println("destinataire : " + destinataire);
  }

  public static void main(String[] args){
    SousClasse obj =
                  new SousClasse("Mademoiselle", "DUBOIS", "Laure", 
                                              "99 cours Vitton", 
                                              69006, "Lyon");
    SousClasse obj4 = new SousClasse("02/11/2002", "M. Jean SOUPIR");
    SousClasse obj3 = new SousClasse(29102002, "M. Marc MILLAUD");
  }
}

class SuperClasse {
  static String adresse_expedition;

  public SuperClasse(String nom, 
                                  String prenom, 
                                  String adresse, 
                                  int code_postal, 
                                  String ville){
    adresse_expedition = nom + " " + prenom + "n" 
                             + adresse + "n" 
                             + code_postal + " " + ville;
    System.out.println("Adresse d'expédition (SuperClasse) :n" 
                             + adresse_expedition);
  }

  public SuperClasse(String adresse, int code_postal){
    adresse_expedition = "Societe ADV Internet Consuting" 
                             + adresse + "n" 
                             + code_postal + " " + "Marseille";
    System.out.println("nAdresse d'expedition (SuperClasse) 
                             + adresse_expedition);
  }
}

Si this et super doivent être utilisés dans des constructeurs, il faut qu'ils apparaissent en tant que première instruction. Par voie de conséquence, il n'est possible d'utiliser qu'un seul de ces mots clés dans une définition de constructeur.

La liste des arguments du mot-clé this ou super provoquera respectivement l'appel du constructeur de la classe ou de la superclasse possédant les paramètres appropriés.

D'autre part, la liste des arguments présentées par les mots clés this et super, doit correspondre parfaitement à l'énumération des paramètres du constructeur référence (types, nombre et séquence des paramètres).
L'identificateur de chaque paramètre n'a aucune importance.

Un appel explicite du constructeur d'une superclasse doit être effectué avec le mot clé super dans les constructeurs des classes étendues, si cette superclasse ne possède pas de constructeur sans arguments.