2015-07-22 3 views
1

Lors de la création d'une instance d'une autre classe, j'ai remarqué que le positionnement de l'endroit où vous créez l'instance peut provoquer beaucoup d'erreurs, ou travailler. Permettez-moi d'utiliser cet exempleJava Instance position

public class Main() { 
    Main(){ 

    } 

    Camera camera = new Camera(); 

    public static void main(String[] args) { 
     Box box = new Box(); 
    } 
} 

Quelle est la différence entre ces deux instances différentes? J'ai une petite idée que cela a à voir avec le référencement statique, mais je ne suis pas sûr. De plus, dans quelles conditions créer une instance à l'intérieur ou à l'extérieur de la main statique? Merci pour votre temps.

+4

Vous pourriez être intéressé par certains [tutoriels] (https://docs.oracle.com/javase/tutorial/). En particulier, le [tutoriel sur les bases du langage] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html) devrait pouvoir vous aider (regardez les [Variables] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html) section). – Jeffrey

Répondre

2

Dans le code que vous avez présenté, Main est une classe, avec un constructeur Main(), un champ camera de type Camera (avec la visibilité du paquet local), et une méthode statique main(String[]). Notez que la méthode statique main(String[]) n'est pas la même que la classe Main ou son constructeur Main().

La box instance de type Box est créé à l'intérieur de la méthode statique main, et ne soit pas visible à l'extérieur, tandis que la camera instance de type Camera est visible à toutes les classes dans le même paquet que la classe actuelle.

De plus, puisque camera n'est pas un champ statique, il doit être associé à une instance de type Main. Par exemple, vous pouvez le faire:

Main m = new Main(); 
Camera thisCamera = m.camera; 

Mais pas:

Camera myCamera = Main.camera; 
+0

Qu'est-ce qui fait de la caméra un champ? – Ryan

+0

Un champ en Java est simplement une variable à l'intérieur d'une classe. Comme suggéré par Jeffrey dans le commentaire, les tutoriels devraient rendre ces concepts clairs. En voici une qui est une lecture rapide et facile: http://tutorials.jenkov.com/java/index.html –

1

Quand vous faites cela:

Camera camera = new Camera(); 

Vous êtes en déclarant un attribut protégé (champ) de la classe Principale. Vous créez également une instance pour cet attribut.

Notez que cet attribut n'est pas statique. De cette façon, toujours que vous créez un objet de classe Main, une caméra sera créée.

Pour un autre côté, si vous déclarez:

static Camera camera = new Camera(); 

le compilateur Java garantit que seule instance de cet attribut existera (peu importe le nombre d'objets de la classe principale vous créez).

box est une variable créée à l'intérieur de la méthode principale static void. Cette variable n'est pas visible (c'est-à-dire qu'elle n'est pas accessible) en dehors de cette méthode, car cette variable a été créée à l'intérieur de la méthode (il s'agit d'une règle de portée standard de plusieurs langues). Notez qu'à l'intérieur d'une méthode statique, il est possible de référencer seulement deux types de variables: une variable locale (comme une boîte) ou une variable statique de classe (comme l'exemple ci-dessus).

+0

J'aime cette réponse parce que tout débutant en regardant cet exemple va se demander pourquoi ils ne peuvent pas utiliser 'camera' dans la méthode 'main'. Une instance de 'Main' n'a même pas encore été créée, donc il n'y a pas encore de' camera'. – CandiedOrange

2

Juste plus élaboration de @Chthonic poste de projet:

Comme par l'exemple que vous avez donné, il est clair que vous n'êtes pas allé à travers la documentation java

variables membres dans une classe ces sont appelés champs.

Variables dans une méthode ou un bloc de code: elles sont appelées variables locales.

Pour élaborer cette plus permet de prendre un autre exemple

/*Camera object is class variable*/ 
Camera camera = new Camera(); 

Comme la portée de c'est au niveau de la classe cela devient un membre de la classe ou sur le terrain. Ne considérez pas que seulement int ou String peuvent devenir des champs. Une variable d'objet de classe peut également être un champ ou un membre de classe.

/*Here the BOX object is inside a method*/ 
public static void main(String[] args){ 
    Box box = new Box(); 
} 

Un objet est déclaré et instancié dans une méthode principale. La portée de cet objet est limitée à la portée de la méthode. Ce sera à l'intérieur des accolades de la méthode principale seulement.

Par exemple. Maintenant, supposons que la modification de votre exempl:

public static void main(String[] args){ 
    Box box = new Box(); 
    if(null != camera){ 
     // You can access camera inside main as it is a class member 
     // the scope is a full class. 
    } 
} // mian method ends. 

if(null == box){ // compiler will shout!!! 
    // accessing box object outside main method 
    // not allowed cause the box objects scope is over inside main method only. 
} 
1

Une instance de Main n'a même pas été encore créé donc il n'y a pas encore camera. Voici comment vous pouvez corriger cela:

public class Main() { 
    Main(){ 

    } 

    Camera camera = new Camera(); 

    public static void main(String[] args) { 
     Box box = new Box(); 
     box.standOn(); 
     Main main = new Main(); // <- now the camera exists. 
     System.out.println("Say cheese."); 
     main.camera.click(); 
    } 
} 

Vous pouvez lire les didacticiels auxquels vous êtes dirigé. Cependant, la manière simple de penser à ce qui se passe ici est la suivante: les parties statiques d'un objet sont les parties qui fonctionneront avant qu'une instance (un objet) de celui-ci ait été créée (habituellement avec new). Bien sûr, static signifie également que chaque instance partage cette même mémoire, ce qui peut être utile et cool. Mais avoir des parties de votre travail avant que vous existiez est assez cool aussi. Après tout, static void main(String[] args) est la façon dont nous commençons tout le spectacle.

Maintenant, vous devriez avoir remarqué à quel point il est difficile d'avoir Main la classe, main la variable d'instance, et main() la méthode. C'est pourquoi nous ne nommons pas nos classes Main.

+0

Je comprends que j'ai créé une instance de main, je demandais simplement la différence entre les deux instances. Je ne savais pas si vous avez défini une instance dans une méthode statique, il était également statique – Ryan