68 votes

Quelle est la différence entre une méthode statique et une méthode non statique ?

Voir les extraits de code ci-dessous :

Code 1

public class A {
    static int add(int i, int j) {
        return(i + j);
    }
}

public class B extends A {
    public static void main(String args[]) {
        short s = 9;
        System.out.println(add(s, 6));
    }
}

Code 2

public class A {
    int add(int i, int j) {
        return(i + j);
    }
}

public class B extends A {
    public static void main(String args[]) {
    A a = new A();
        short s = 9;
        System.out.println(a.add(s, 6));
    }
}

Quelle est la différence entre ces extraits de code ? Les deux produisent 15 comme réponse.

3 votes

Ici, Comprendre les membres des instances et des classes C'est très bien expliqué.

155voto

SapphireSun Points 2441

Une méthode statique appartient à la classe elle-même et une méthode non statique (ou méthode d'instance) appartient à chaque objet généré à partir de cette classe. Si votre méthode fait quelque chose qui ne dépend pas des caractéristiques individuelles de sa classe, rendez-la statique (cela réduira l'encombrement du programme). Sinon, elle doit être non statique.

Exemple :

class Foo {
    int i;

    public Foo(int i) { 
       this.i = i;
    }

    public static String method1() {
       return "An example string that doesn't depend on i (an instance variable)";
    }

    public int method2() {
       return this.i + 1; // Depends on i
    }
}

Vous pouvez appeler les méthodes statiques comme ceci : Foo.method1() . Si vous essayez cela avec la méthode 2, cela échouera. Mais ceci fonctionnera : Foo bar = new Foo(1); bar.method2();

31voto

VikingGlen Points 124

Les méthodes statiques sont utiles si vous n'avez qu'une seule instance (situation, circonstance) où vous allez utiliser la méthode, et que vous n'avez pas besoin de copies multiples (objets). Par exemple, si vous écrivez une méthode qui se connecte à un seul et unique site Web, télécharge les données météorologiques et renvoie les valeurs, vous pouvez l'écrire en tant que méthode statique car vous pouvez coder en dur toutes les données nécessaires dans la méthode et vous n'aurez pas de multiples instances ou copies. Vous pouvez alors accéder à la méthode de manière statique en utilisant l'une des méthodes suivantes :

MyClass.myMethod();
this.myMethod();
myMethod();

Les méthodes non statiques sont utilisées si vous avez l'intention d'utiliser votre méthode pour créer plusieurs copies. Par exemple, si vous souhaitez télécharger les données météorologiques de Boston, Miami et Los Angeles, et si vous pouvez le faire à partir de votre méthode sans avoir à personnaliser le code pour chaque emplacement distinct, vous accédez alors à la méthode non statique :

MyClass boston = new MyClassConstructor(); 
boston.myMethod("bostonURL");

MyClass miami = new MyClassConstructor(); 
miami.myMethod("miamiURL");

MyClass losAngeles = new MyClassConstructor();
losAngeles.myMethod("losAngelesURL");

Dans l'exemple ci-dessus, Java crée trois objets et emplacements mémoire distincts à partir de la même méthode, auxquels vous pouvez accéder individuellement avec la référence "boston", "miami" ou "losAngeles". Vous ne pouvez accéder à aucun de ces objets de manière statique, car MyClass.myMethod() ; est une référence générique à la méthode, et non aux objets individuels que la référence non statique a créés.

Si vous vous trouvez dans une situation où la façon d'accéder à chaque emplacement, ou la façon dont les données sont renvoyées, est suffisamment différente pour que vous ne puissiez pas écrire une méthode "taille unique" sans passer par de nombreux obstacles, vous pouvez mieux atteindre votre objectif en écrivant trois méthodes statiques distinctes, une pour chaque emplacement.

12voto

murthy naika k Points 421

Généralement

statique : il n'est pas nécessaire de créer un objet, nous pouvons l'appeler directement en utilisant la fonction

ClassName.methodname()

Non statique Nous avons besoin de créer un objet comme

ClassName obj=new ClassName()
obj.methodname();

8voto

Emil Points 5513

Une méthode statique appartient à la classe et une méthode non statique appartient à un objet d'une classe. C'est-à-dire qu'une méthode non statique ne peut être appelée sur un objet de la classe à laquelle elle appartient. Une méthode statique peut cependant être appelée à la fois sur la classe qu'un objet de la classe. A méthode statique ne peut accéder qu'aux membres statiques. Une méthode non statique peut accéder à la fois aux membres statiques et non statiques car au moment où la méthode méthode statique est appelée, la classe peut ne pas être instanciée (si elle est appelée sur la classe elle-même). Dans le autre cas, une méthode non statique ne peut seulement être appelée lorsque la classe a déjà été instanciée. Une méthode statique est partagée par toutes les instances de la la classe. Ce sont là quelques-unes des principales différences. Je voudrais également souligner une différence souvent ignorée dans ce contexte. Chaque fois qu'une méthode est est appelée en C++/Java/C#, un argument implicite implicite (la référence 'this') est passée avec/sans les autres paramètres. Dans le cas d'un appel de méthode statique statique, la référence 'this' n'est pas passée car les méthodes statiques appartiennent à une classe et n'ont donc pas la référence "this". ne sont pas transmises.

Référence : Méthodes statiques et non statiques

6voto

Alex Vaz Points 316

D'un point de vue plus technique, la différence entre une méthode statique et une méthode virtuelle réside dans la manière dont elles sont liées.

Une méthode "statique" traditionnelle comme dans la plupart des langages non OO est liée/câblée "statiquement" à son implémentation au moment de la compilation. Autrement dit, si vous appelez la méthode Y() dans un programme A et que vous liez votre programme A à la bibliothèque X qui implémente Y(), l'adresse de X.Y() est codée en dur sur A et vous ne pouvez pas la changer.

Dans les langages OO comme JAVA, les méthodes "virtuelles" sont résolues "tardivement", au moment de l'exécution, et vous devez fournir une instance d'une classe. Ainsi, dans un programme A, pour appeler la méthode virtuelle Y(), vous devez fournir une instance, B.Y() par exemple. Au moment de l'exécution, chaque fois que A appelle B.Y(), l'implémentation appelée dépendra de l'instance utilisée, donc B.Y() , C.Y() etc... pourraient tous potentiellement fournir différentes implémentations de Y() au moment de l'exécution.

Pourquoi en auriez-vous besoin ? Parce que de cette façon, vous pouvez découpler votre code des dépendances. Par exemple, disons que le programme A fait "draw()". Avec un langage statique, c'est tout, mais avec l'OO, vous ferez B.draw() et le dessin réel dépendra du type d'objet B, qui, au moment de l'exécution, peut devenir un carré, un cercle, etc. De cette façon, votre code peut dessiner plusieurs choses sans avoir besoin de changer, même si de nouveaux types de B sont fournis APRÈS que le code ait été écrit. Nifty -

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X