Différence entre les constructeurs et les méthodes
Soufflet est un exemple que j'ai trouvé sur Tutoriels Points, un exemple d'un constructeur. J'ai obtenu la plupart d'entre eux, mais je ne vois pas pourquoi vous avez besoin d'un constructeur et une méthode.
public Puppy(String name){
System.out.println("Passed Name is :" + name );
}
Ma question est, ce qui vous empêche de le faire à la place?
public static void Puppy(String name){
System.out.println("Passed Name is: "+name);
}
N'a pas ces deux la même chose, une fois appelé?
Voici le programme complet de référence:
public class Puppy {
int puppyAge;
public Puppy(String name) {
System.out.println("Passed Name is :" + name);
}
public void setAge(int age) {
puppyAge = age;
}
public int getAge() {
System.out.println("Puppy's age is :" + puppyAge);
//what does this return do? since the puppyAge is already printed above.
return puppyAge;
}
public static void main(String []args){
Puppy myPuppy = new Puppy("tommy");
myPuppy.setAge(2);
myPuppy.getAge();
System.out.println("Variable Value :" + myPuppy.puppyAge);
}
}
La méthode qui croyez-vous est de dupliquer le travail du constructeur? Seulement si le constructeur et une autre méthode est d'effectuer la même tâche peut l'un d'eux est inutile. Dans ce cas, cependant, le constructeur n'est pas de faire toutes les choses qu'elle doit faire - en particulier, un constructeur doit définir les valeurs de toutes les variables membres de la classe (et ce n'est pas de réglage puppyAge, de sorte que l'instance est dans un état indéfini immédiatement après la construction) et il n'est pas en utilisant le nom du chiot pour définir une variable (alors pourquoi est-il fourni avec le nom du chiot à tous?).
OriginalL'auteur Steven Zhao | 2014-11-09
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas le concept de base d'une instance, ce qui est fondamental en programmation orientée objet. Si vous voulez une métaphore, nous allons parler de voitures.
Je suis sûr que vous savez ce qu'est une voiture; vous savez qu'il vous permet de vous déplacer d'un endroit à un autre, qu'il a 4 roues et ainsi de suite. C'est un concept, et de la voiture que vous avez dans votre garage est un instance de ce concept (<=> classe).
D'un constructeur objectif est de créer une instance, de ne pas imprimer le texte. Sans un constructeur, vous ne serez jamais en mesure de convoquer une non-méthode statique de la classe. Vous ne serez pas en mesure de conduire le concept d'une voiture, vous aurez besoin de construire une voiture en premier.
Juste revoir ces notions, vous obtiendrez nulle part sans elle.
OriginalL'auteur
Je suppose que votre question est pourquoi le constructeur est créé à l'aide de...
...au lieu de...
..., non?
Si elle l'est, tout d'abord, vous devez maintenant qu'un constructeur est une méthode spéciale détenu par une classe qui est appelée à chaque fois que vous créez une nouvelle instance de cette classe. Donc, si, par exemple, vous avez cette classe...
..., alors à chaque fois que vous créez une nouvelle instance de cette classe comme...
..., le constructeur sera appelé et que la méthode sera exécutée. (Dans cet exemple, il devrait afficher "Hello World" sur l'écran.)
Cela dit, vous pouvez voir que le constructeur est une méthode, mais c'est une méthode spéciale appelée lorsque la classe est instanciée. Donc, pour répondre à votre question, la raison pour laquelle le constructeur est de cette manière plutôt que d'une méthode régulière de l'en-tête est pour indiquer au compilateur que c'est un constructeur et pas d'une méthode régulière. Si vous écrivez
public void Clazz ()
au lieu depublic Clazz ()
, alors le compilateur ne reconnaîtra pas votre constructeur, et pense que c'est juste une méthode régulière.Remarque que les constructeurs ne reviennent jamais rien, donc il ne serait pas nécessaire d'utiliser la vide mot-clé. Aussi, il n'y a pas de sens d'en faire un constructeur statique, puisque le constructeur est appelé lorsqu'un objet est instancié.
constructors never return anything, so it would not be necessary to use the void keyword
C'est une drôle de manière de penser. J'ai toujours pensé le contraire: ils retournent un objet de leur propre type. Danspublic Clazz ()
je considèreClazz
le type de retour, pas de la "méthode" de nom.Ce que vous avez dit n'avoir de sens. Mais en java docs il est écrit que les constructeurs ne pas avoir un type de retour. Mais maintenant, vous l'avez dit, je suppose que la pensée dans les deux façons sont corrects
Je pense que les docs disent que vous n'utilisez pas le
return
mot-clé, non pas qu'il n'y a pas de type de retour. Nous savons qu'il renvoie quelque chose, sinon, vous ne pouviez pas de la chaîne de constructeurs avec des appels de méthode comme ceci:new String("Hello World").substring(3)
.Dans ma vision, ce qui rend la
new String("Hello World")
retourne une Chaîne de caractères, c'est lenew
mot-clé, et pas le constructeur lui-même. Notez que si nous appelons la méthode constructeur individuellement à l'intérieur de la classe commethis()
, c'est sûr qu'il ne retourne rien. Sur le java docs, il ditConstructor declarations look like method declarations—except that they use the name of the class and have no return type.
Ce qui est écrit ici docs.oracle.com/javase/tutorial/java/javaOO/constructors.htmlAh bon point sur
this()
, et votre point de vue est en fait pris en charge par les docs sur lenew
opérateur. Merci pour ça, c'est une différence subtile, mais vous êtes complètement à droite ici.OriginalL'auteur
Les constructeurs SONT des méthodes, ils sont des types spéciaux de méthodes, cependant. Les constructeurs sont des méthodes qui n'ont pas de type de retour et doivent être nommés d'après leur classe englobante. Alors, pourquoi avons-nous besoin des constructeurs? eh bien, c'est la façon dont nous pouvons créer des instances de classes. Lorsque vous souhaitez créer une instance d'une certaine classe, vous le faire en appelant son constructeur. Le constructeur se réserve la mémoire pour l'objet et renvoie une référence à l'objet nouvellement créé.
OriginalL'auteur
Indiqué dans le Java Spec pour les Constructeurs:
Constructeurs ne retourne rien, donc ils n'ont pas de type de retour.
Vous ne pouvez pas remplacer un constructeur.
Ils ne peuvent accéder aux variables d'instance directement, au lieu de cela, ils doivent utiliser
this
etsuper
à déléguer à des classes de variables.super(...)
outhis(...)
ne pouvez pas accéder les membres de l'instance ou des membres de la classe.OriginalL'auteur
Il y a une très grande différence entre les constructeurs et les méthodes. Lorsque vous instanciez un objet, comme c'est fait dans le programme
avec l'utilisation de nouveau mot-clé de la JVM appelle le constructeur de l'objet. Si les constructeurs font des objets qui n'existent pas, mais les méthodes sont associés à des objets qui existent. Vous pouvez en lire plus à ce lien
http://www.javaworld.com/article/2076204/core-java/understanding-constructors.html
OriginalL'auteur
plusieurs bonnes réponses sur les constructeurs déjà.
Un point mineur; vous ne pouvez pas avoir une méthode statique avec le même nom que la classe. Ce nom est réservés pour les constructeurs.
OriginalL'auteur
Un constructeur est censé être pour la configuration de l'objet où une méthode est tout simplement un peu d'action avec l'objet. Java est orienté objet, donc l'ensemble de la langue tourne autour de l'objet. Les constructeurs ne peuvent pas retourner quoi que ce soit et doit être utilisé à nouveau pour retourner une instance de l'objet créé, où que les méthodes peuvent retourner quelque chose ou rien du tout.
OriginalL'auteur
Pour cet exemple, vous n'avez pas besoin d'un constructeur. C'est un assez mauvais exemple. Une méthode pourrait fonctionner tout aussi bien.
(Toutes les classes Java avoir un constructeur par défaut si vous n'ajoutez pas un, de sorte que vous pouvez toujours appeler
new Puppy()
pour obtenir un exemple.)OriginalL'auteur
Lorsque vous créez une nouvelle instance d'un objet (
Puppy doggy = new Puppy("Bobby");
) le Constructeur est appelé immédiatement. Elle le construit de nouveaux objets. Il construit avec le nom "Bobby". (Le Chiot est né avec le nom "Bobby"). Disons que notre chiot n'est pas satisfait de son nom et que vous souhaitez modifier "Snoopy". Ensuite, vous devez appeler la méthode:doggy.setName("Snoopy")
;OriginalL'auteur
Un
Constructor
c'est juste que, il "construit" l'objet que vous créez, il est techniquement un type spécifique deMethod
. UnMethod
est utilisé pour modifier l'objet, surtout pour faire un seul morceau de la logique. Voir:single responsibility principle
.Classes/méthodes doivent être simples et poignée exacte des éléments d'information, par exemple, un
Shape
objet, si vous voulez c'est d'attributs longueur, largeur, hauteur, volume, surface, ect... votre constructeur aurait du être:(notez le nom de cette méthode doit être le même que le nom de la classe, qui signifie une "Constructor")
c'est ce qui est connu comme une
code smell
, en particulier: trop de paramètres. Il est difficile à lire, pas très organisé, et une mauvaise manière d'écrire du code. Donc, au lieu de cela, des méthodes sont utilisées pour définir ces variables:Alors votre constructeur ne seraient:
Ce n'est qu'un simple exemple. Dans de nombreux cas, vous souhaitez passer un paramètre (ou un peu plus) dans le constructeur, selon le cas.
OriginalL'auteur
Un constructeur est une type de la méthode. Plus précisément, il est appelé lorsque vous instanciez un objet de cette classe. Donc dans votre exemple, si vous écrivez:
Vous faire un objet appelé
pup
et l'instanciation de l'objet, ce qui vous permet de l'utiliser. Par instanciation, vous appelez le constructeur spécifié, dans ce cas:public Puppy(String name)
qui définit imprime à"Rover"
, cependant ce n'est pas vraiment une bonne utilisation d'un constructeur. Ce serait plus logique serait d'avoirString puppyName;
comme une variable de champ, et ontthis.puppyName = name
pour définirp.puppyName
égal à ce qui est passé dans le constructeur.OriginalL'auteur
constructeur est
public Class(){
définir la variable qui doivent être utilisés dans l'ensemble de la classe
la méthode est d'aller en vertu de constructeur
public void methodName(){}
u peut changer vide de type de variable que tu veux que la méthode renvoie le type spécifique.
OriginalL'auteur
Je préférerais lire un livre sur les concepts de la programmation orientée objet et dans ce cas, java, que de lire toutes les (bonnes) réponses ici. Vous aurez probablement obtenir beaucoup de réponses, puisque cette question est assez populaire, mais les réponses ne vont pas dans tous les détails nécessaires.
Mais une chose que je tiens à mentionner en bref:
D'une méthode de retour avec une sorte de réponse.
Donc, quelle est cette méthode? Elle retourne la valeur enregistrée dans la variable dont le nom
puppyAge
,qui est un entier.
Donc, si vous appelez la méthode
myPuppy.getAge()
, tout dans cette méthode (en effet l'impression, aussi),seront traitées et ensuite il retourne. Dans votre cas, vous n'enregistrez pas la valeur de retour n'importe où.
Mais "normal", chose que vous voulez faire serait d'accéder à l'âge du chiot par la méthode
et effectivement FAIRE quelque chose avec elle, à l'instar de calculer l'âge moyen de l'ensemble de vos puppys et d'autres choses.
Bien sûr, vous pouvez accéder à la variable ici à partir de l'extérieur de la classe, parce que vous n'avez pas réglé le modificateur de visibilité, comme du public, private, protected.
Fait pas de modificateur public a également un sens, mais ce n'est pas pertinente pour l'instant.
Donc, ce que vous voulez faire est de placer par exemple pour le privé:
et d'y accéder via une méthode comme
getAge()
et en faire quelque chose comme:Enfin, si vous voulez juste l'impression de l'âge sur la console, votre méthode ne doit faire exactement ce que une chose et doivent être nommés de la même manière, comme:
void
indique que cette méthode fait quelque chose, mais ne retourne rien.OriginalL'auteur
Votre premier exemple est un constructeur public qui est appelé lorsque vous créez un Chiot. Généralement, le constructeur enregistrer le nom au lieu de l'afficher et de le jeter, donc vous pouvez vous y référer plus tard, par exemple:
Je pense à un constructeur comme une méthode qui "renvoie" un Chiot objet, c'est pourquoi il n'a pas de type de retour. Les méthodes et les variables qui sont déclarées statiques, à la différence de la chiot de nom, ne leur "appartiennent" à n'importe quel objet en particulier, mais sont partagés entre tous les membres de la classe.
Alors que vous pouvez utiliser un Chiot objet à appeler des méthodes statiques (qui pourrait être particulièrement utile si le Chiot ont été polymorphe Canine), l'inverse n'est pas vrai!
Il est invalide (et ne fait pas de sens) pour faire référence à des non-membres de données statiques dans le contexte d'une fonction statique! Une fonction statique est similaire à une variable statique: il y a une seule copie de la fonction partagée entre tous les objets. Cela signifie que vous pouvez appeler le Chiot.setLatinName() (au lieu de Spot.setLatinName()). Vous n'avez pas besoin d'utiliser un Chiot objet de l'appel d'une fonction statique: une fonction statique est la garantie de ne pas dépendre d'un non-membre statique des variables (car il n'a pas tout). L'Appel De Chiot.l'écorce() n'a aucun sens parce que la classe "Chiot" n'a pas un puppyName; chaque Chiot a son propre puppyName.
J'espère que cette aide. La programmation orientée objet est très puissant et il est important de comprendre les bases bien! Bonne chance.
OriginalL'auteur