Voici ma question de devoirs:
Écrivez une déclaration de classe pour une classe "Horloge". Il doit avoir des variables d'instance pour les heures, les minutes, les secondes (tous les entiers). Il devrait également avoir une méthode toString () pour afficher l'heure dans le format indiqué ci-dessous. Écrivez une classe "ClockDriver" distincte pour a) créer une instance d'horloge, b) définir les heures, les minutes et les secondes de l'horloge, et c) afficher l'heure de l'horloge à l'aide de getTime (). Utilisez l'exemple de la classe Chien à la page 36 comme guide. L'échantillon est illustré ci-dessous:
Le temps est 3:45:00
// ne vous inquiétez pas si vous ne pouvez pas obtenir les deux zéros
// le deuxième champ. C'est un problème de formatage
// nous traiterons plus tard
Voici ma classe d'horloge:
class Clock {
int hours;
int minutes;
int seconds;
public String toString() {
String temp = ("");
return temp.format("%02d:%02d:%02d", hours, minutes, seconds);
} //end method toString
public void getTime() {
System.out.print("The time is " + toString());
} //end method getTime
} //end class Clock
Et voici ma classe ClockDriver:
public class ClockDriver {
public static void main (String[] args) {
Clock c = new Clock();
c.hours = 4;
c.minutes = 30;
c.seconds = 00;
c.getTime();
} //end main
} //end class ClockDriver
Même s'il compile bien et fonctionne bien, je reçois ce que je pense être un avertissement de IDE disant que mon
return temp.format("%02d:%02d:%02d", hours, minutes, seconds);
la ligne accède à un membre statique via une référence d'instance. Plus précisément, le
temp.format
bit.
Mes questions sont donc:
1.) Pourquoi l'accès à un membre statique via une référence d'instance n'est-il pas nécessairement encouragé?
2.) Existe-t-il un meilleur moyen de mettre cela ensemble afin que je n'accède pas à un membre statique via une référence d'instance?
Merci d'avance!
Les méthodes statiques appartiennent à la classe elle-même, pas à n'importe quelle instance. Bien que vous puissiez appeler une méthode static
à partir d'une instance de la classe, vous n'avez pas besoin d'utiliser une instance de la classe, et vous ne devriez pas. Cela peut être déroutant, car il semble que la méthode ne soit pas static
, même si elle est static
.
La meilleure façon et la plus claire d'appeler une méthode static
consiste à utiliser le nom de classe lui-même, et non une instance de la classe, pour appeler la méthode:
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
Et vous n'avez pas du tout besoin de l'instance temp
.
Gardez à l'esprit que si une instance d'une certaine classe, appelons-la c, a une fonction, void foo()
, et vous utilisez l'instance c
pour appeler foo
comme ceci :
c.foo();
ce que l'on appelle en réalité:
foo(c);
lors de l'appel d'une fonction statique void foo2 ():
Class.foo2();
est appelé tel qu'il apparaît.
L'appel d'une fonction statique à l'aide d'une instance indique un utilisateur qui n'est probablement pas sûr de ce qu'il fait.
Vous ne devez en fait pas utiliser la chaîne temp
. Vous devez l'appeler comme String.format
. Pour répondre à votre question, c'est déroutant, car l'appel ne regarde pas vraiment temp
.