2012-06-19 6 views
2

Comme je suis nouveau à java, j'aimerais savoir, 1. Combien de constructeurs par défaut sont définis lorsque je crée une classe vide? 2. Ai-je besoin de définir un constructeur de copie ou est-il défini automatiquement en C++?Constructeur java par défaut

+2

Une question par question s'il vous plaît. –

Répondre

7

Il existe un seul constructeur par défaut, qui n'est défini que lorsque vous ne déclarez aucun constructeur pour une classe. Sinon, les constructeurs déclarés seront les seuls constructeurs. Si vous ne spécifiez pas un constructeur, le compilateur insère code équivalent à

public ClassName() { 
    super(); 
} 

En outre, si vous ne déclarez des constructeurs pour une classe, et vous ne définit pas explicitement l'appel constructeur de la super classe, le compilateur insérera un appel de correspondance de paramètre à la super classe.

public ClassName extends SuperClassName { 

    public ClassName(String item, List stuff) { 
    // no explicit super class constructor called 
    ... 
    } 

} 

se transforme dans le compilateur à quelque chose comme

public ClassName extends SuperClassName { 

    public ClassName(String item, List stuff) { 
    // explicit super class constructor call to SuperClassName(item, stuff); 
    super(item, stuff); 
    ... 
    } 

} 

Pour définir un constructeur de copie, il n'y a pas de syntaxe particulière, vous définissez essentiellement un constructeur qui prend une autre instance de votre classe comme argument.

public ClassName(ClassName other) { 
    field = other.field; 
    field2 = other.field2; 
    field3 = new ArrayList(other.field3); 
    ... 
} 

Il n'y a pas une telle chose comme un constructeur de copie par défaut, en fait il n'y a pas une telle chose comme un constructeur de copie, il y a juste des constructeurs. Si vous décidez de créer un ou plusieurs qui semblent copier un objet, soyez-le.

La raison pour laquelle Java a besoin de moins de types d'éléments est liée à la non-surcharge des opérateurs de base. Si vous ne mettez pas plus de significations sur = alors vous n'avez pas besoin d'autant de types de constructeurs pour supporter différentes méthodes d'allocation d'objets. L'une des raisons pour lesquelles = peut être utilisé si simplement est due à Java seulement passer des références, qui sont un peu comme des pointeurs; mais, ils sont fortement typés, vous ne pouvez pas faire de maths de pointeur, ni accéder aux offsets. En tant que tels, ils ne sont bons que pour l'affectation et le passage par référence, ce qui évite la plupart des problèmes de pointeur.

1

Si vous ne créez aucun constructeur, il existe un seul constructeur par défaut que le compilateur ajoute implicitement. C'est le constructeur non paramétré.

class SomeClass{ 

public SomeClass() // all this is implicitly added if you don't specify anything. 
{ 
super(); 
} 

} 

De l'documentation:

Le compilateur fournit automatiquement sans argument, constructeur par défaut pour toutes les classes sans constructeur. Ce constructeur par défaut appellera le constructeur sans argument de la superclasse. Dans cette situation, le compilateur se plaindra si la superclasse n'a pas de constructeur sans argument, donc vous devez vérifier que c'est le cas. Si votre classe n'a pas de superclasse explicite , alors elle a une superclasse implicite d'Object, qui a un constructeur sans argument .

Et en Java, il n'existe pas de constructeur de copie. Si vous en définissez une explicitement, alors c'est un problème différent, mais le compilateur ne définira jamais automatiquement une telle chose en Java.

7

1. Combien de constructeurs sont définis par défaut quand je fais une classe vide?

Une classe telle que

class MyClass { 
} 

a un par défaut constructeur (vide) qui se comporte comme

... 
    public MyClass() { 
    } 
... 

2. Est-ce que je dois définir copie constructeur ou il est auto défini comme en C++?

Il n'y a aucune notion d'une copie-constructeur intégré à Java, et il y a une raison fondamentale:

En Java une variable ne peut jamais contenir un objet (il ne peut contenir une référence à un objet). Ainsi, lorsque vous faites foo(obj), l'objet auquel obj fait référence n'a pas besoin d'être copié.

Pour faire une copie d'un objet que vous créez généralement un constructeur tel que

... 
    public MyClass(MyClass objToCopy) { 
     this.field1 = objToCopy.field1; 
     ... 
     this.fieldN = objToCopy.fieldN; 
    } 
... 

ou vous comptez sur le mécanisme clone().

questions connexes:

+1

+1 pour mieux expliqué – 11684

+1

Le constructeur par défaut contient en fait un 'super();', n'est-ce pas? – brimborium

+1

Je dirais la 2ème partie "Si vous voulez un constructeur de copie, vous devrez l'écrire vous-même". – user949300

2

Au-dessus de toutes les réponses sont parfaitement bien .. Il suffit d'ajouter une chose pour plus clairement .. constructeur par défaut est un compilateur S'ajoute quand vous ne définissez aucun constructeur ... comme ci-dessus ans:

public ClassName() { super(); }

Mais si vous écrivez vous-même constructeur dans la classe ... comme si vous écrivez même constructeur de votre auto dans la classe .. que techniquement ce constructeur ne sera pas appelé constructeur par défaut ...

J'espère que vous avez obtenu le point ..

1

Si aucun constructeur n'est spécifié, un constructeur vide définit automatiquement. Dès que vous spécifiez un ou plusieurs constructeurs, seuls ces constructeurs sont définis.

Il n'existe aucun constructeur de copie mais chaque classe de Java s'étend de Object en tant que méthode clone().

Questions connexes