web-dev-qa-db-fra.com

Java Aide aux devoirs (Accès au membre statique via la référence d'instance)

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!

24
Bit Deception

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.

42
rgettman

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.

2
TomF

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.

0
tbodt