Lorsque vous commencerez à apprendre la programmation Java, vous aurez une compréhension assez précoce des ** classes et instances **. Personnellement, je pense que les obstacles sont un peu élevés pour les débutants. Souvent dans des ouvrages de référence et des articles en ligne
Une classe est un document de conception et une instance est une entité créée à partir du document de conception.
Je vois souvent des choses comme ça, mais j'ai le sentiment que seules les personnes ayant de l'expérience ou du sens en programmation peuvent comprendre cela. Au début de l'apprentissage de Java, je ne pouvais pas comprendre avec une telle explication conceptuelle.
Cet article s'adresse aux personnes qui ne sont pas très familières avec les ** classes et instances **, tout comme je l'étais lorsque j'ai commencé à apprendre Java (cet article utilise Java 8). Veuillez noter que les chiffres ne sont que des images et ne peuvent pas être exprimés avec précision.
Vous pouvez créer une instance en créant une nouvelle depuis la classe. Java crée essentiellement une instance et exécute le processus. Ce qui suit est courant, mais j'écris un programme qui crée une instance à partir d'une classe humaine.
class Human {
String name;
int age;
Human(String name, int age) {
this.name = name;
this.age = age;
}
void greet() {
System.out.printf("Ravi de vous rencontrer,%s.\n", this.name);
}
}
public static void main(String[] args) {
Human humanA = new Human("Kaneda", 16);
Human humanB = new Human("île", 15);
}
Créez une instance avec un nom et un âge de la classe Human qui représente un humain, au-dessus de la création de deux instances. J'ai essayé de comprendre cela.
Créez une instance à partir de la classe et développez-la en mémoire. Ensuite, affectez la valeur de référence (adresse en mémoire) de cette instance à la variable. Exécutons maintenant la méthode de salutation des deux instances générées ci-dessus.
public static void main(String[] args) {
Human humanA = new Human("Kaneda", 16);
Human humanB = new Human("île", 15);
humanA.greet(); //Ravi de vous rencontrer, je m'appelle Kaneda.
humanB.greet(); //Ravi de vous rencontrer, c'est une île.
}
Comme le nom est différent pour chaque instance, le résultat de sortie sera également différent.
La création et l'exploitation de chaque entité à partir d'une classe est le comportement de base d'un programme en Java.
statique signifie littéralement statique. Cela devient un peu déroutant quand il sort, mais assurez-vous de le comprendre, car programmer sans le comprendre peut conduire à des bogues ridicules. Les variables et les méthodes avec le modificateur static sont également appelées respectivement variables de classe et méthodes de classe. Ajoutons chacun à la classe humaine précédente.
class Human {
static final String classification = "mammifère"; // <-Variable de classe
String name;
int age;
Human(String name, int age) {
this.name = name;
this.age = age;
}
static final boolean isMammal() { // <-Méthode de classe
return true;
}
void greet() {
System.out.printf("Ravi de vous rencontrer,%s.\n", this.name);
}
}
Ajout de la classification, qui signifie la classification en tant que variable statique, et isMammal, qui confirme les mammifères en tant que méthode statique, aux classes humaines. Le modificateur final est un modificateur qui le rend non réinscriptible. S'il s'agit d'une variable, elle ne peut pas être modifiée et s'il s'agit d'une méthode, elle ne peut pas être remplacée. Maintenant, accédons au membre ajouté.
public static void main(String[] args) {
Human humanA = new Human("Kaneda", 16);
Human humanB = new Human("île", 15);
System.out.println(humanA.classification); //mammifère
System.out.println(humanB.isMammal()); // true
}
Les membres avec le modificateur static sont la propriété de la classe. Vous accédez donc à la classe via une instance. J'en ai également fait un diagramme.
En passant, si vous écrivez le code ci-dessus dans eclipse, vous obtiendrez un message d'avertissement disant "... nécessite un accès statique". En effet, Java a une règle implicite selon laquelle les membres de la classe doivent accéder directement à la classe. En effet, il est difficile de déterminer s'il s'agit de la propriété de la classe ou de la propriété de l'instance via l'instance. Dans ce cas, il est correct d'accéder directement à la classe comme suit.
System.out.println(Human.classification); //mammifère
System.out.println(Human.isMammal()); // true
Autrement dit, le modificateur static doit être donné aux membres indépendants de l'instance. D'un point de vue orienté objet, la classification «mammifère» des humains est une définition qui ne diffère pas entre les instances, quelle que soit l'instance qu'elles produisent. J'ai ajouté final car il est supposé que la définition (que les êtres humains sont «mammifères») ne changera pas à l'avenir.
J'ai dit que si vous n'utilisez pas correctement statique, cela entraînera des bogues, mais j'écrirai en fait l'utilisation incorrecte de statique. Ajoutons une méthode statique growOld qui fait vieillir la classe humaine ci-dessus. Pensez à ce que cela signifie pour les humains de vieillir.
class Human {
static final String classification = "mammifère";
String name;
int age;
Human(String name, int age) {
this.name = name;
this.age = age;
}
static void growOld(){
age++; // <-Erreur de compilation
}
/*Omission*/
}
J'obtiens une erreur de compilation disant "Impossible de référencer statiquement l'âge du champ non statique" dans la méthode growOld ajoutée.
C'est un champ non statique, c'est-à-dire un champ d'instance, donc il n'est pas accessible à partir des méthodes de classe. Lorsque cela se produit, vous remarquerez que c'est une erreur de définir statiquement l'ancienne méthode growOld, mais que vous ne pourrez peut-être pas supprimer la statique de la méthode en raison de classes ou de frameworks parents. Dans un tel cas, pensons que la conception pour accéder au champ est étrange en premier lieu. Très rarement, il y a des idiots qui rendent les variables (âge âge dans ce cas) statiques, mais ** ne rendent pas les variables statiques **. Il n'est pas possible pour tous les humains de vieillir en même temps en même temps. Lors de la définition des membres statiques, repensez au niveau de la conception.
En plus des variables et des méthodes, il existe des classes internes qui sont des membres qui peuvent être statiques. Je ne couvrirai pas les classes internes dans cet article, mais sachez qu'elles ont une signification légèrement différente de celle des variables et des méthodes.
Java vous permet d'hériter d'autres classes et d'accéder aux membres de la classe héritée. La classe héritée est également appelée classe parente ou superclasse de la classe héritée. Ensuite, je voudrais créer une instance à partir d'une classe qui hérite d'une autre classe. Ce qui suit définit nouvellement une classe japonaise et une classe américaine qui héritent de la classe humaine ci-dessus et exécute la méthode de salutation à partir de chaque instance.
class Japanese extends Human {
Japanese(String name, int age) {
super(name, age);
}
@Override
void greet() {
super.greet();
System.out.println("Je suis Japonais.");
}
}
class American extends Human {
American(String name, int age) {
super(name, age);
}
@Override
void greet() {
super.greet();
System.out.println("Je suis américaine.");
}
}
public static void main(String[] args) {
Japanese japanese = new Japanese("Kumi", 15);
American american = new American("Emilie", 15);
japanese.greet();
//Ravi de vous rencontrer, c'est Kumi.
//Je suis Japonais.
american.greet();
//Ravi de vous rencontrer, je m'appelle Emily.
//Je suis américaine.
}
La classe enfant hérite des membres de la classe parent tels qu'ils sont. En d'autres termes, l'instance enfant peut utiliser les membres de la classe parente tels quels. Par conséquent, il est possible d'accéder à la méthode d'accueil du parent dans la méthode d'accueil de l'enfant.
À propos, les Japonais et les Américains héritent des humains, de sorte que les instances peuvent se comporter comme des humains. Ce qui suit est une liste d'êtres humains, et ils sont accueillis dans l'ordre.
List<Human> humans = new ArrayList<>();
humans.add(new Japanese("Kumi", 15));
humans.add(new Japanese("Ken", 15));
humans.add(new American("Emilie", 15));
humans.add(new American("Gamelle", 15));
humans.forEach(h -> h.greet());
//Ravi de vous rencontrer, c'est Kumi.
//Je suis Japonais.
//Ravi de vous rencontrer, je m'appelle Ken.
//Je suis Japonais.
//Ravi de vous rencontrer, je m'appelle Emily.
//Je suis américaine.
//Ravi de vous rencontrer, je m'appelle Billy.
//Je suis américaine.
Ce à quoi je voudrais faire attention ici, c'est le contenu de la salutation. Je salue en tant qu'être humain, mais les Japonais et les Américains saluent chaque classe d'enfants. Le remplacement de la méthode de la classe parente par la méthode de la classe enfant de cette manière est appelé override.
D'ailleurs, dans les cas suivants, "Yamato Tamashii" est un membre japonais et n'est pas accessible avec des variables humanoïdes. Même s'il s'agit d'une instance japonaise, les membres japonais ne peuvent pas l'utiliser à moins qu'ils ne se comportent en japonais.
class Japanese extends Human {
String japaneseSoul = "Âme Yamato"; // <-Âme japonaise
Japanese(String name, int age) {
super(name, age);
}
@Override
void greet() {
super.greet();
System.out.println("Je suis Japonais.");
}
}
Japanese japanese = new Japanese("Kumi", 15);
Human human = new Japanese("Ken", 15);
System.out.println(japanese.japaneseSoul); //Âme Yamato
System.out.println(human.japaneseSoul); // <-Erreur de compilation
(Je suis désolé, je ne peux pas penser à un bon exemple de ce que les Japonais ont.)
Java est souvent utilisé comme langage d'introduction à la programmation et est le langage utilisé par de nombreux systèmes. Cependant, si vous ne comprenez pas la relation entre les classes et les instances, vous ne serez pas en mesure d'effectuer une programmation Java correcte, ni de comprendre l'orientation des objets. J'espère que cela mènera à la compréhension de ceux qui sont en difficulté.
Recommended Posts