public class MaMontre {
	public static void main(String[] args) {
		Watch h1 = new Watch(); //Instanciation d'un objet watch (une montre)
		Watch h2 = new Watch(23, 58); //Instanciation d'un objet watch, on précise nous même l'heure lors de l'instanciation de l'objet
		//Watch h3 = new Watch(29, 588); // si on décommente, le programme doit planter (ERROR)

		h1.printHour(); // minuit
		h1.tick(); // minuit 1 minute
		h1.printHour();

		h2.printHour(); // 23:58
		h2.tick();
		h2.tick();
		h2.tick();
		h2.printHour();
		h2.tick(60);
		h2.printHour();

		System.out.println("----------------------------------------");
		Watch w = new Watch (23, 58);
	    w.printHour();

	    w.tick();
	    w.printHour();

	    w.tick (5);
	    w.printHour();
	}
}

class Watch { //création d'une classe watch, variables d'initialisations dés la ligne suivante
	int heures;
	int minutes;

	Watch() { // par défaut : 00h00
		heures = 0;
		minutes = 0;
	}

	/*
	 * throws Exception dans la signature du constructeur permet de dire
	 * à Java que ce constructeur, lorsqu'il est appelé, peut éventuellement
	 * lancer une nouvelle Exception
	 *
	 * => l'instruction throw new Exception("..."); permet de dire à Java
	 * qu'il faut créer un objet Exception avec un String en paramètre pour
	 * donner le motif et ensuite le throw permet de lancer l'exception
	 */
	Watch(int h, int m) throws Error { // heure : hh:mm
		// petite vérification
		if(h > 23 || h < 0 || m > 59 || m < 0) { // problème !
			throw new Error("Erreur : heure incorrecte.");//définition d'un message d'erreur
		}
		heures = h;
		minutes = m;
	}

	public void tick() {
		if(minutes == 59) { // le cas XX : 59
			if(heures == 23) { // le cas 23 : 59
				heures = 0; // XX + 1 = 0
				minutes = 0;
			} else {
				heures += 1; // XX + 1
				minutes = 0;
			}
		} else {
			minutes += 1; // le cas sans problème
		}
	}
	public void tick(int n) {
		// cette boucle permet de tick() n fois
		for(int i = 0; i < n; i++) {
			tick();
		}
	}

	/*
	 * on surcharge (override) la méthode toString héritée de l'objet Object (parent de tous les
	 * objets) et on renvoie un String qui est la représentation de l'objet courant càd
	 * les heures et les minutes de l'horloge
	 */
	public String toString() {
		return heures + ":" + minutes;
	}

	public void printHour() {
		System.out.println(this);
	}

}