Bonsoir,
J'ai une question j'ai du mal à comprendre la différence entre.
Classe objet;
Et
Classe objet = new class();
Instance action , déclaration ?
Merci
Version imprimable
Bonsoir,
J'ai une question j'ai du mal à comprendre la différence entre.
Classe objet;
Et
Classe objet = new class();
Instance action , déclaration ?
Merci
Déclaration puis instanciation :
Code:
1
2 MaClasse objet; objet = new MaClasse();
L'équivalent en une seule ligne :
Code:MaClasse objet = new MaClasse();
oui mais pourquoi parfois on fait
Classe objet; (sans le new) ?
Salut,
Parce qu'on instancie l'objet et on affecte la variable plus tard.
Par exemple :
Il y a aussi ce cas :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public class Exemple { private File file; // déclaration public Exemple(File file) { this.file = file; // initialisation } public Exemple(String path) { this.file = new File(path); // initialisation } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 public enum Type { UPPER, LOWER, CAPUPPER, WORDUPPER; } public static String changeCasse(Type casse, String string) { Objects.requiredNonNull(casse); Objects.requiredNonNull(string); if ( string.isEmpty) return string; String newString; // declaration switch( casse ) { case UPPER: newString = string.toUpperCase(); // affectation break; case LOWER: newString = string.toLowerCase(); // affectation break; case CAPUPPER: newString = toUpperCap(string); // affectation break; case WORDUPPER: StringBuilder sb=new StringBuilder(string.length); for(String word = string.split(" ")) { if ( sb.length>0) sb.append(" "); sb.append( toUpperCap(word) ); } newString = sb.toString(); // affectation break; default: throw new IllegalStateException("Valeur non gérée : "+casse); } return newString; } private static String toUpperCap(String string) { return string.charAt(0.toUpperCase()+string.subString(1); }
dans ton premier exemple on créer pas de nouvel objet c'est ça, on prend cela qu'on passe en paramétres?
Merci
Oui, c'est pour ça que j'ai écrit "affectation" : qu'on affecte une référence d'un objet existant, ou celle d'un nouvel objet, ça ne change rien au niveau de la déclaration et de l'affectation.
Si tu veux, on peut ajouter un contructeur :
Code:
1
2
3
4
5
6
7
8
9
10 public class Exemple { private File file; // déclaration public Exemple() { this.file = new File(System.getProperty("user.home")); // initialisation } /* ... */ }
En fait, l'écriture
Revient à écrireCode:Classe objet;
Tu déclares une variable mais tu ne lui affectes aucune valeur.Code:Classe objet = null;
A savoir qu'il y a quand même une différence au niveau de la compilation, parce que dans un cas, le compilateur est en mesure de te dire que ta variable n'est pas initialisée :
Ici, ça compile mais ça plantera à l'exécution :
Ici, tu auras une erreur à la compilation en te disant que ta variable n'est pas initialiséeCode:
1
2 Object o = null; o.equals(null);
Mais ceci ne marche que dans le cas où tu déclares ta variable et son utilisation dans un même bloc. Dans le cas des propriétés, tu peux les déclarer sans initialisation et essayer des les utiliser après même si rien ne permet de les modifier :Code:
1
2 Object o ; o.equals(null); // ERREUR
Ce code est parfaitement légal même s'il a 100% de chances de planter lors de l'exécution de la méthode doStuff
EDIT : suppression du bout de code avec une erreur grossière de ma partCode:
1
2
3
4
5
6
7
8
9 public class TestClass { private Object o; public void doStuff(){ o.hashCode(); } }
Merci bien à vous j'ai bien compris :)
Oui, enfin quand objet est une variable de classe. Mais pas quand il s'agit d'une variable locale à un bloc : dans ce cas, elle n'aura de valeur que lorsqu'il y aura explicitement affectation.
D'ailleurs, le code suivant ne compile pas :
parce que le new FileInputStream(fichier) peut planter avant toute affectation de is, la ligne try {if (is != null) is.close();} catch (Exception e){// erreur à la fermeture du flux} ne compile pas avec l'erreur "The local variable is may not have been initialized".
@joel.drigo : oui, je le dis plus haut et je fais le contraire plus bas... Manque de café moi...
D'ailleurs, ça ne compile pas surtout parce que l'accolade fermante est perdue dans le commentaire :p