Ensemble, Obtenir et les Constructeurs en Java
Malgré Java tutoriels, Wikipedia recherches, stackoverflow la pêche à la traîne, et des heures de lecture de code des échantillons, les constructeurs confondent encore la merde hors de moi. J'ai trois questions que j'ai essayé de répondre pour M'aider à comprendre constructeurs un peu mieux.
Tout d'abord, j'ai été sous l'impression que les constructeurs doivent être nommés de la même façon que leurs classes. Considérer:
public class Money {
public Money(long l) {
this.value = l;
}
public Money(String s) {
this.value = toLong(s);
}
public long getLong() {
return this.value;
}
public String getString() {
return toString(this.value);
}
}
Je vois ce que quatre constructeurs...correct? Donc, il apparaît que les constructeurs pas le même nom que la classe qui les contient admissibles. Quelqu'un peut-il confirmer?
Deuxième, j'ai l'impression d'avoir un bloc à l'encontre de la compréhension de l'ensemble et des méthodes get. Considérer:
public class GetSetSample {
public int getFoo() {
return int Foo;
}
public void setFoo(int fooValue) {
int Foo = fooValue;
}
}
Pourquoi ne peux pas je viens de le faire:
public class getFoo(int fooValue){
foo=fooValue;
}
et l'utilisation foo = getFoo(12)
à partir d'une autre classe/méthode?
La troisième question est un peu plus ésotérique, mais qui va m'aider à concevoir de l'image plus grande...ce qui est mon style d'apprentissage, et propice à ma capacité de retracer le flux de programme lors du débogage. Le get
et set
méthodes suggèrent un "à" et "de" relation à moi. par exemple, le Passage d'une valeur "à" d'un constructeur, la réception, le résultat "de" la méthode get. Il me semble que le "à" et "de" se changera en fonction de votre point de vue. Je pense que tout setMethod
est la définition des paramètres d'un objet, même si la variable vient D'une autre classe ou d'une méthode, et la GetMethod
est get
ting l'objet (par exemple, this.foo
) avec la manière appropriée set
paramètre. Peu importe où le get
ou set
est utilisé dans une méthode principale ou une classe autonome avec un seul constructeur, " set " est toujours associé à l'envoi d'un paramètre et get
est toujours associés à la réception d'un objet avec ce paramètre. Est-ce une bonne compréhension? ou ai-je raté une partie vitale?
- Bon ... par Où commencer ? 😉
- Je souhaite que je savais... 🙂
- La langue, si vous en venir?
- J'ai une cobol fond et je suis de retour pour le développement après environ dix ans d'absence. Donc, à peu près le pire endroit à être pour le saut dans la programmation orientée-objet. 😀
- Personnellement, je pense que Java est probablement le meilleur endroit pour le faire. Pas de gestion de la mémoire comme le C++, mais le système de type est assez solides pour vous forcer à écrire quelque chose de cohérent. Je déteste apprendre OO, ou même de l'enseigner, sur une langue de canard-typage.
Vous devez vous connecter pour publier un commentaire.
Question 1:
Non, cette classe a deux constructeurs et les deux méthodes. (
getLong
etgetString
sont les méthodes.)Question 2:
Eh bien, c'est d'essayer de déclarer un classe avec des paramètres, et aussi que vous êtes réglage une valeur dans un obtenir méthode, ce qui serait extrêmement bizarre. Il n'est pas clair ce que vous essayez d'atteindre ici, mais que le code est bien valide.
Question 3:
Eh bien, c'est pas vraiment un relation de l'OMI. Une relation suggère quelque chose de plus long terme que l'autre de ces méthodes. Un setter généralement des modifications de l'état d'un objet, d'une certaine façon, et d'une lecture en général les retours de certains aspects de l'état d'un objet. Ce n'est pas vraiment clair ce que le reste de votre explication signifiait, parce que vous jouez un peu rapide et lâche avec la terminologie. Par exemple: "
get
est toujours associés à la réception d'un objet avec le paramètre" n'a pas vraiment de sens pour moi. Les objets n'ont pas de paramètres, les méthodes/constructeurs - et getters peut récupérer les valeurs primitives ou des références...Je soupçonne que vous pourriez bénéficier de la lecture de la "Classes" partie du tutoriel Java, qui parle des constructeurs et des méthodes.
Concernant la première question, il n'y a que 2 constructeurs. La différence est sur la façon dont ils vont être appelés (appelée à l'aide d'une chaîne de l'utilisation de la construction ayant une chaîne de paramètre et a appelé à l'aide d'un long va utiliser l'autre). Donc, pour répondre, oui, le constructeur a le même nom que la classe.
Les deux constructeurs :
Concernant la deuxième réponse, getters sna poseurs ne sont pas destinés à être des classes. Ils sont censés être à l'intérieur de la classe elle-même.
Considérer cet exemple qui utilise des accesseurs et des mutateurs pour obtenir sna valeur définie pour la classe d'imprimante :
Une bonne lecture de ce lien pourrait certainement vous aider !
Java orienté-objet des principes
Vous ai montré des 2 constructeurs, qui ne doivent avoir le même nom que la classe.
Vous ai aussi montré deux méthodes "getter", qui renvoie la valeur de la variable de classe dans la forme demandée par l'utilisateur. Vous pouvez aussi créer un "setter" méthodes, qui sont utilisés pour transférer les valeurs dans les variables de classe.
Vous utilisez un constructeur pour créer un objet d'une classe particulière, et, éventuellement, à fixer tout ou partie de son état interne (qui est, ses variables membres).
Vous utilisez les setters et getters pour isoler les variables de classe du monde extérieur, de sorte que vous n'avez pas besoin de permettre à d'autres de code pour y accéder directement. Pourquoi? Parce que, avant un setter met à jour une variable, il peut vérifier que la nouvelle valeur est valide, et que l'opération ne viole pas les ou les règles (la "logique d'entreprise") qui sont nécessaires pour que la classe fonctionne correctement.
Ainsi, vous pouvez ajouter un setter et mise à jour le constructeur à utiliser:
Noter qu'un setter n'a généralement pas besoin de retourner une valeur (qui est, il peut être de type
void
), mais il est souvent utile de revenir de l'objet lui-même. Qui vous permet d'écrire du code comme ceci:Cela crée un objet de type
Money
, jeux divers attributs, et la stocke dans la variableearnings
. Clairement, ce n'est pas très utile pour une classe simple comme ça, mais il peut être très utile pour les plus complexes des classes:Je voudrais essayer de répondre à vos implicite à des questions conceptuelles -- vous en avez déjà beaucoup d'exemples de ceci et de cela, je vais donc essayer d'expliquer. Je n'ai aucun doute que vous avez entendu plus de cela, peut-être que tout cela, avant, mais je suis pas sûr, et pas sûr de qui parties.
De programmation orientée objet, les centres pour la plupart autour des objets; un objet est une fusion de code et de données. Vous définissez les objets par l'écriture d'une classe, et que vous créez un ou plusieurs exemplaires de l'objet défini par la classe avec le constructeur de la classe (appelé l'instanciation de la classe).
Un parallèle dans d'autres langues: vous pouvez avoir une structure de données d'éléments et un ensemble de sous-programmes qui fonctionnent sur cette structure de données. Pensez à une classe comme un moyen de recueillir les éléments de la structure des données et les sous-routines qui fonctionnent sur elle en une seule unité.
Après avoir invoqué un constructeur, vous avez une copie des données définies dans la classe et un moyen de se référer à cette copie. En se référant à cette instance lorsque vous appelez une méthode de classe, vous sur cette copie des données avec les méthodes définies dans la classe.
Si vous étiez pour ce faire, dans un non-langage OO, vous pourriez avoir une routine qui a créé une copie de la structure de données dans la mémoire et ensuite seulement utiliser les méthodes prescrites pour cette structure de données. Vous pourriez avoir un pointeur sur la copie en mémoire et passer le pointeur en paramètre à chaque sous-routine qui fonctionne sur elle, et en fait c'est la façon dont certains pré-OO systèmes ont été programmés.
Un constructeur est similaire à un appel de méthode qui retourne une valeur; elle implique (ou peut impliquer) l'exécution d'instructions, et il renvoie toujours à un objet de cette classe. Il existe également des différences entre un constructeur et une méthode; jusqu'à ce que le constructeur se termine, par exemple, l'objet n'est pas entièrement créé et ne devrait pas avoir certaines méthodes invoqué sur elle.
Donc j'espère que l'aide; si il y a des choses conceptuelles vous avez encore des questions, peut-être quelque chose ici va vous aider à former une question spécifique afin que nous puissions expliquer les choses plus loin.
Beaucoup de gens ont trouvé que s'ils ont passé des années à l'apprentissage des langues comme le COBOL et FORTRAN alors la modification de la programmation orientée-objet consiste à désapprendre les langues anciennes. Je trouve cela quand j'ai abordé le C++ il y a 20 ans. À partir de votre description, vous êtes clairement en difficulté avec les concepts et je compatis.
Je ne pense pas qu'il y est une recette simple. Pratique par des exemples simples et ne vous découragez pas. N'ayez pas peur de poser des questions sur SOI - si les questions sont clairement posées, vous obtiendrez une réponse utile.
Obtenir une bonne IDE (Eclipse, Netbeans, etc.) qui vous permet de "regarder à l'intérieur" des objets avec le débogueur. Espérons-le, à un certain stade, les choses vont clic!
Question 1 - Base De Classes Java:
Il y a à peu près seulement de 3 choses que vous allez trouver dans une classe Java
Chaque classe va avoir un nom de classe qui partage le nom du fichier il est situé dans. Afin d'élargir l'Argent un peu:
La seule distinction entre un constructeur et une méthode, c'est qu'un constructeur n'a pas précisé la valeur de retour, ce qui est déclaré comme un type de droite devant le nom d'une méthode potentielle. Les constructeurs n'ont à être le même nom que la classe, elles sont contenues dans, mais pourquoi est implicite dans la façon dont ils sont écrits.
Une autre façon de voir les choses est que si vous supprimez tous les non-type de Java mots-clés (publique, privée, etc., mais pas les choses comme float et int) à partir de l'avant de la méthode que vous êtes en train de regarder (Une liste de où vous pouvez trouver ici), il n'y a rien à gauche en face de la méthode?
Avec l'Argent que nous avons en ce moment, il devrait ressembler à ceci:
Le constructeur est celui qui n'a pas de type pour la valeur de retour, car elle est implicite dans la déclaration.
Question 2/3 - méthodes Get/Set:
Je vais dire quelque chose de potentiellement controversée, mais ne vous inquiétez pas à propos de ces encore. Get/Set sont essentiellement des modèles de développement Orienté Objet, et généralement de bonnes Java de style, mais ils ne sont pas nécessaires (la Dernière que j'ai vérifié, Android développement se décourage leur utilisation, lorsque possible, pour des raisons d'optimisation). En outre, pas tous les champs dans les objets seront accessibles ou mutable donc écrit n'est pas obligatoire.
Si vous déclarez tous vos champs comme public (Comme le champ "valeur" est implicite à être en ce moment), vous simple peut faire ceci:
A côté de cela, la notion de get() et set() sont des méthodes. Il n'y a rien de spécial à leur sujet à tous. La principale raison pour laquelle ils existent c'est parce que pour la générale de la programmation Orientée Objet, vous ne devriez pas avoir à modifier directement le fonctionnement interne d'un objet (C'est le principe d'Encapsulation). Tout ce dont vous avez besoin pour affecter l'état ou d'obtenir quelque chose hors de lui devrait être traitée par une méthode.
Dans un lapidaire one-liner: Si vous avez besoin de connaître les champs d'un objet pour l'utiliser, vous l'avez conçu de manière incorrecte.
Grande Image
Donc, ce que get() et set() sont vraiment une paire de couramment les méthodes qui se trouvent à affecter un champ dans un objet dans un moyen extrêmement simple (get() est un simple accès à un champ, set() est l'affectation à ce domaine). C'est juste que d'autres méthodes que vous écrivez va arriver à faire plus de choses compliquées que cela.