Classes et instances Java comprises dans la figure

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.

exemple

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.

WS000001.JPG

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.

WS000002.JPG

La création et l'exploitation de chaque entité à partir d'une classe est le comportement de base d'un programme en Java.

modificateur statique

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.

WS000003.JPG

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.

Si vous faites une erreur en l'utilisant ...

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.

WS000001.JPG

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.

Héritage

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. WS000000.JPG

passer outre

À 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.

WS000000.JPG

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.)

finalement

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

Classes et instances Java comprises dans la figure
java (classe et instance)
Différences entre les classes et les instances dans Ruby
[java8] Pour comprendre l'API Stream
Comment utiliser les classes en Java?
Classes et instances Java pour les débutants
[Pour les débutants] Explication des classes, des instances et des statiques en Java
[Java] Divers résumés joints aux chefs de classe et aux membres
Programmation Java (classes et instances, méthodes principales)
Comment obtenir la date avec Java
De Java à C et de C à Java dans Android Studio
Spécifiez l'ordre dans lequel les fichiers de configuration et les classes sont chargés dans Java
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Comprendre la différence entre int et Integer et BigInteger en java et float et double
Comment créer votre propre annotation en Java et obtenir la valeur
[Java] Comprendre la différence entre List et Set
Concernant les modificateurs transitoires et la sérialisation en Java
À propos de l'idée des classes anonymes en Java
Différences dans l'écriture des classes Java, C # et Javascript
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap
[Ruby] Classes et instances
À propos des classes et des instances
Classes et instances Ruby
[Java] Comment omettre le constructeur privé dans Lombok
Écrivez ABNF en Java et transmettez l'adresse e-mail
Source utilisée pour obtenir l'URL de la source de redirection en Java
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
[Java] Comment obtenir la clé et la valeur stockées dans Map par traitement itératif
À propos des classes et des instances (évolution)
Prise en compte des classes et des instances
À propos de la classe abstraite Java
Thread Java pour comprendre vaguement
À propos des classes et des instances Ruby
Création de classes et d'instances Ruby
Méthodes et classes abstraites Java
Entrée dans la console Java
Comment obtenir le nom d'une classe / méthode exécutée en Java
Je n'ai pas vraiment compris le comportement de Java Scanner et .nextLine ()
JSON en Java et Jackson Partie 1 Renvoyer JSON à partir du serveur
Comprendre le flux approximatif de la demande à la réponse dans SpringWebMVC
Comment séparer les mots dans les noms dans les classes, les méthodes et les variables
[Java] Changez la langue et les paramètres régionaux en anglais avec les options JVM
J'ai essayé de résumer les bases de kotlin et java
Différence entre Java et JavaScript (comment trouver la moyenne)
Reportez-vous à C ++ dans le module Android Studio (Java / kotlin)
Commande pour vérifier le nombre et l'état des threads Java
[Android, Java] Méthode pratique pour calculer la différence en jours
Comprendre le modèle Singleton en comparant le code Java et JavaScript
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Créer une méthode pour renvoyer le taux de taxe en Java
Comment appeler et utiliser l'API en Java (Spring Boot)
Corrigez le code de caractère en Java et lisez à partir de l'URL
Raisons d'utiliser séparément Servlet et JSP dans le développement Java
Créez votre propre serveur simple avec Java et comprenez HTTP
Contribué à Gradle et a été nommé dans la note de publication
Pensez aux différences entre les fonctions et les méthodes (en Java)
Comment développer et enregistrer une application Sota en Java