web-dev-qa-db-fra.com

Puis-je utiliser les méthodes d'une classe sans instancier cette classe?

J'ai une classe avec plusieurs méthodes et il n'y a pas de constructeur parmi ces méthodes.

Je me demande donc s'il est possible d'appeler une méthode d'une classe sans créer une instance de la classe.

Par exemple, je peux faire quelque chose comme ça:

NameOfClass.doMethod(x1,x2,...,xn)

En général, je ne vois pas pourquoi cela devrait être impossible. J'appelle simplement une fonction qui fait quelque chose (ou renvoie des valeurs). Si cela est possible, que se passera-t-il si la méthode définit une valeur pour une variable privée de la classe? Comment puis-je atteindre cette valeur? De la même manière?

NameOfClass.nameOfVariable
23
Roman

Cela s'appelle des variables statiques et des méthodes méthodes statiques . Essayez-le et voyez qu'il compile.

27
Yoni

Si les méthodes sont statiques, oui.

Mais vous ne pourrez pas accéder à des membres non statiques.

12
µBio

Comme beaucoup l'ont fait remarquer: cela n'est possible que si la méthode est statique. Peut-être qu’un peu de fond OOP est dans l’ordre: une méthode doit toujours appartenir à une classe. Alors, à quoi sert d'appeler une méthode sans une instance de classe? Dans un monde OO parfait, il ne devrait y avoir aucune raison de faire cela. De nombreux cas d'utilisation liés aux méthodes statiques parlent d'attribuer une sorte d'identité à votre classe. Bien que cela soit parfaitement raisonnable dans un monde de programmation, il n’est pas très convaincant en matière de conception orientée objet.

Comme nous programmons dans un monde imparfait, il y a souvent un cas d'utilisation d'une "fonction libre" (la façon dont Java ou C++ implémente sort () par exemple). Comme Java ne prend pas directement en charge les fonctions libres, les classes contenant uniquement des "méthodes" statiques sont utilisées pour exprimer cette sémantique, avec l'avantage supplémentaire que le wrapper de classe fournit un "espace de noms". Ce que vous pensez de cette solution de contournement et si vous le considérez comme une faille dans la conception du langage, l’OMI est une question d’opinion.

6
pmr

1)OUI, vous pouvez utiliser les méthodes d'une classe sans créer une instance ou un objet de cette classe en utilisant le mot-clé "Static" .

2) Si vous déclarez la méthode en tant que "Static" , vous pouvez appeler cette méthode par:

                *ClassName.MethodName()* 

3) par exemple 

class Hello {

   public static void print()
   {

     System.out.println("HelloStatic");
   }  

}


class MainMethod {
    public static void main(String args[])
    {
       // calling static method
       Hello.print();
    } 
}  

4) Le résultat du programme ci-dessus serait: HelloStatic

5
Aviral Kumar

Dans la plupart des langues, vous ne pouvez le faire que si method est statique. Et les méthodes statiques ne peuvent changer que les variables statiques.

2
user272879

J'ai une classe avec plusieurs méthodes et il n'y a pas de constructeur parmi ces méthodes.

Si vous ne définissez pas explicitement un constructeur, vous obtenez un constructeur par défaut fourni par le compilateur. Donc, si ces méthodes ne sont pas statiques, essayez ceci:

NameOfClass x = new NameOfClass();
x.doMethod(x1,x2,...,xn);
2
Mark Byers

Une méthode sur une classe opère dans le contexte d'une instance; il a accès aux variables membres de l'instance. Vous comprenez cela, car vous demandez ce qui se passe si la méthode accède à l'une de ces variables.

Vous pouvez comprendre pourquoi cela ne fonctionne pas en vous posant la question: "Où sont les données?" Si vous n'avez pas d'instance, où se trouve la variable d'instance? Où sont les données? Et la réponse est qu'il n'a pas de place et donc ne fonctionne pas.

La différence avec une fonction statique et des variables membres statiques réside dans le fait que vous pouvez répondre à la question sur l'emplacement des données. Les variables statiques disponibles, qu’il existe ou non une instance spécifique. La décision spécifique à une instance ou à une classe est une décision que vous devez prendre en fonction de ce que vous voulez réellement faire.

2
janm

J'ai une classe avec plusieurs méthodes et il n'y a pas de constructeur parmi ces méthodes.

Voulez-vous dire que vous avez quelque chose comme:

public class X
{
    public void foo()
    {
    }
}

ou voulez-vous dire que vous avez quelque chose comme:

public class X
{
    private X()
    {
    }

    public void foo()
    {
    }
}

Si c'est le cas, alors, oui, il y a un constructeur et il ressemblera à ceci:

public X()
{
    super();
}

si c'est la deuxième façon, il y a probablement une méthode comme:

public static X createInstance()
{
    return (new X());
}

Si vous voulez vraiment dire que les classes peuvent avoir des méthodes qui font des choses sans jamais créer d'instance, alors oui, vous pouvez simplement rendre toutes les méthodes et les variables statiques (généralement ce n'est pas une bonne idée, mais pour certaines choses c'est parfait).

1
TofuBeer

Ce serait des méthodes statiques. 

1
Tony The Lion

Puisque qre est une méthode statique et ne dispose pas d'un accès aux instances de la classe englobante, vous devez d'abord créer une instance, puis y accéder. Par exemple:

public class Foo {
   private int bar;

   public static void qre() {
      Foo foo = new Foo();
      foo.bar = 5;
      System.out.println("next bar: " + (++5));
   }
}
0
Boris Pavlović

Dans une encapsulation appropriée, vous ne devriez pas "voir" ce qui se passe à l'instanciation. Compter sur le manque de constructeur d'une classe revient à casser cette forme. La conception de la classe a pour but d’ajouter ultérieurement l’initialisation formelle de l’état dans le constructeur. Votre "contrat" ​​avec la classe est seulement que vous pouvez utiliser les méthodes telles qu'elles sont actuellement conçues. 

Si vous souhaitez utiliser les fonctionnalités de cette méthode sans surcharge de classe, il est peut-être préférable de l'inclure dans votre classe "client" existante (bien sûr, il s'agit simplement d'un codage "copier-coller" et il est considéré comme un anti-motif. de la conception de logiciels. 

0