JavaRush /Blog Java /Random-FR /Introduction aux cours : écrire vos propres classes, cons...

Introduction aux cours : écrire vos propres classes, constructeurs

Publié dans le groupe Random-FR
Bonjour! Aujourd'hui, nous allons parler des cours en Java. Les classes peuvent être considérées comme le cœur de la programmation Java. Lorsque vous deviendrez programmeur, votre tâche principale sera d’écrire vos propres classes avec différentes fonctionnalités. Introduction aux cours : écrire vos propres classes, constructeurs - 1Voyons ce qu'est cette chose et comment elle fonctionne :) Comme vous le savez déjà, Java est un langage de programmation orienté objet. Tous les programmes sont constitués d’objets connectés d’une manière ou d’une autre. Une classe est essentiellement un modèle pour un objet. Il détermine à quoi ressemblera un objet et quelles fonctions il aura. Chaque objet est un objet d'une certaine classe . Regardons l'exemple le plus simple :

public class Cat {

    String name;
    int age;

}
Disons que nous écrivons un programme et que dans ce programme nous avons besoin de chats pour quelque chose (par exemple, nous avons une clinique vétérinaire avec la possibilité de prendre rendez-vous en ligne). Nous avons créé une classe Catet spécifié deux variables pour celle-ci : une chaîne nameet un nombre age. Ces variables de classe sont appelées champs . Il s’agit essentiellement d’un modèle pour tous les chats que nous créerons à l’avenir. Chaque chat (objet de classe Cat) aura deux variables : le nom et l'âge.

public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
C'est comme ça que ça marche ! Nous avons créé un chat, lui avons donné un nom et un âge, et avons tout affiché sur la console. Rien de compliqué :) Les cours décrivent le plus souvent des objets et phénomènes du monde environnant. Un chat, une table, une personne, un éclair, une page de livre, une roue - tout cela sera créé dans votre programme à l'aide de classes séparées. Voyons maintenant les variables que nous avons créées dans la classe Cat. C'est ce qu'on appelle des champs ou des variables d'instance . Le nom, en effet, révèle toute leur essence. Chaque instance (objet) de la classe aura ces variables Cat. Chaque chat que nous créons aura sa propre variable nameet son propre age. C'est logique, en général : avec les vrais chats, tout est pareil :) En plus des variables d'instance, il y en a d'autres - des variables de classe , ou des variables statiques. Ajoutons à notre exemple :

public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
Sortie de la console :

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
Nous avons maintenant une nouvelle variable dans notre classe - count(quantité). Elle est chargée de compter les chats créés. Chaque fois que l'on crée un chat dans la méthode main, on incrémente cette variable de 1. Cette variable est désignée par le mot-clé static . Cela signifie qu'il appartient à la classe et non à un objet spécifique de la classe. Ce qui, bien sûr, est logique : si chaque chat doit avoir son propre nom, alors nous avons besoin d'un compteur de chats pour tous. C'est exactement ce que le mot statique vous permet d'obtenir : countla même variable pour tous les chats. Attention : lorsque nous l'imprimons sur la console, nous n'écrivons pas barsik.countou vasia.count. Elle n'appartient ni à Barsik ni à Vasya - elle appartient à toute la classe Cat. C’est donc simple count. Vous pouvez également écrire Cat.count- ce sera également correct. nameCela ne fonctionnerait pas avec la sortie d'une variable sur la console :

public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

        System.out.println("Total number of cats = " + count);
    }
}
Erreur! nameChaque chat a le sien. C'est là que le compilateur devient confus. "Afficher le nom sur la console ? À qui appartient-il ? :/"

Méthodes

En plus des variables, chaque classe possède des méthodes. Nous en parlerons plus en détail dans une conférence séparée, mais les points généraux sont assez simples. Les méthodes sont la fonctionnalité de votre classe ; ce que les objets de cette classe peuvent faire. Vous connaissez déjà l’une des méthodes : c’est la méthode main(). Mais maincomme vous vous en souvenez, la méthode est statique, c'est-à-dire qu'elle appartient à la classe entière (la logique est la même que pour les variables). Et les méthodes ordinaires non statiques ne peuvent être appelées que sur des objets spécifiques que nous avons créés. Par exemple, si nous voulons écrire une classe pour un chat, nous devons comprendre quelles fonctions le chat devrait avoir dans notre programme. Sur cette base, écrivons quelques méthodes pour cela :

public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();

    }
}
Eh bien, maintenant, notre classe ressemble beaucoup plus à la description d’un vrai chat ! Désormais, nous n’avons plus seulement un chat appelé Barsik avec un nom et un âge. Il peut aussi miauler et sauter ! Quel genre de chat existe-t-il sans une telle "fonctionnalité" :) Nous prenons un objet spécifique - barsik, et appelons ses méthodes sayMeow()et jump(). On regarde la console :

Мяу!
Прыг-скок!
Un vrai chat ! :)

Créer vos propres cours. Abstraction

À l’avenir, vous devrez écrire vos propres cours. À quoi faut-il faire attention lors de leur rédaction ? Si nous parlons de variables, vous devez utiliser quelque chose appelé abstraction . L'abstraction est l'un des quatre principes fondamentaux de la programmation orientée objet. Il s'agit de mettre en évidence les caractéristiques principales et les plus significatives d'un objet , et vice versa, d'éliminer les caractéristiques secondaires et insignifiantes. Par exemple, nous créons un fichier des salariés de l’entreprise. Pour créer des objets employés, nous avons écrit une classe Employee. Quelles caractéristiques sont importantes pour décrire un salarié dans un dossier d’entreprise ? Nom complet, date de naissance, numéro de sécurité sociale, numéro d'identification fiscale. Mais il est peu probable que nous ayons besoin de sa taille, de la couleur de ses yeux et de ses cheveux sur la carte d’employé d’une entreprise. L'entreprise n'a pas besoin de ces informations. Par conséquent, pour la classe Employee, nous définirons les variables String name, int age, int socialInsuranceNumberet int taxNumber, et nous abandonnerons les informations qui ne nous sont pas nécessaires (comme la couleur des yeux) et les ferons abstraction . Mais si l’on crée un fichier de modèles photo pour une agence de mannequins, la situation change radicalement. Pour décrire un mannequin, la taille, la couleur des yeux et la couleur des cheveux sont très importantes pour nous, mais le numéro TIN n'a absolument pas d'importance pour nous. Par conséquent, dans la classe, Modelnous devons créer des variables int height, String hair, String eyes. C'est comme ça que fonctionne l'abstraction, c'est simple ! :)

Constructeurs

Revenons à notre exemple de chat.

public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
Regardez ce code et essayez de deviner ce qui ne va pas avec notre programme. Pendant deux heures dans notre émission il y avait un chat sans nom ni âge ! Bien sûr, c’est complètement faux. Il ne devrait y avoir aucun chat dans la base de données de la clinique vétérinaire sans informations à leur sujet. Maintenant, nous laissons le soin au programmeur. S’il n’oublie pas d’indiquer son nom et son âge, tout ira bien. S'il oublie, il y aura une erreur dans la base de données, chats inconnus. Comment pouvons-nous résoudre ce problème ? Il faut en quelque sorte interdire la création de chats sans nom ni âge. C'est là que les fonctions constructeur nous viennent en aide . Voici un exemple :

public class Cat {

    String name;
    int age;

    //constructor for class Cat
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
Un constructeur est essentiellement un modèle pour les objets de classe. Dans ce cas, nous précisons que pour chaque objet catdeux arguments doivent être spécifiés : une chaîne et un nombre. Si nous essayons maintenant de créer un chat sans nom, nous n’y parviendrons pas.

public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
Maintenant qu'une classe possède un constructeur, le compilateur Java sait à quoi doivent ressembler les objets et n'autorisera pas la création d'objets sans les arguments qui y sont spécifiés. Examinons maintenant le mot-clé thisque vous voyez à l'intérieur du constructeur. Tout est simple avec lui aussi. "this" en anglais signifie "this, this". Autrement dit, ce mot indique un objet spécifique. Code dans le constructeur

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
peut être traduit presque littéralement : " nom de ce chat (que nous créons) = l' argument de nom spécifié dans le constructeur. âge de ce chat (que nous créons) = l' argument d'âge spécifié dans le constructeur. " Après le déclenchement du constructeur, vous pouvez vérifier que notre chat a reçu toutes les valeurs nécessaires :

public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
Sortie de la console :

Барсик
5
Lorsque le constructeur a terminé :

Cat barsik = new Cat("Barsik", 5);
Ce qui suit s'est réellement produit à l'intérieur :

this.name = "Barsik";
this.age = 5;
Et l'objet barsik(c'est this) s'est vu attribuer des valeurs à partir des arguments du constructeur. En fait, si vous ne spécifiez pas de constructeurs dans la classe, le constructeur sera quand même déclenché ! Mais comment est-ce possible ? O_O Le fait est qu'en Java, toutes les classes ont ce qu'on appelle un constructeur par défaut . Il n'a aucun argument, mais il se déclenche à chaque fois qu'un objet d'une classe est créé.

public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
À première vue, cela n’est pas perceptible. Eh bien, nous avons créé un objet et l'avons créé, où est le travail du designer ? Pour voir cela, écrivons Catde nos propres mains un constructeur vide pour la classe, et à l'intérieur, nous afficherons une phrase sur la console. S'il est affiché, alors le constructeur a fonctionné.

public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Sortie de la console :

Создали кота!
Voici la confirmation. Le constructeur par défaut est toujours présent de manière invisible dans vos classes. Mais vous devez en connaître une autre caractéristique. Le constructeur par défaut disparaît de la classe lorsque vous créez un constructeur avec des arguments. La preuve en est en effet déjà vue plus haut. Ici dans ce code :

public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
Nous ne pouvions pas créer un chat sans nom et sans âge car nous avons défini un constructeur pour Cat: string + number. Le constructeur par défaut a disparu de la classe immédiatement après. Par conséquent, n'oubliez pas : si vous avez besoin de plusieurs constructeurs dans votre classe, y compris un vide, vous devez le créer séparément . Par exemple, notre clinique vétérinaire souhaite faire de bonnes actions et aider les chats sans abri, dont nous ne connaissons pas le nom et l'âge. Notre code devrait alors ressembler à ceci :

public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {
        
        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
Maintenant que nous avons explicitement spécifié un constructeur par défaut, nous pouvons créer les deux types de chats. Dans le constructeur, vous pouvez attribuer des valeurs explicitement, et pas seulement les extraire des arguments. Par exemple, nous pouvons enregistrer tous les chats des rues dans une base de données sous le nom « Numéro de chat des rues… » :

public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
Nous avons une variable countqui est un compteur de chats des rues. Chaque fois que nous exécutons le constructeur par défaut, nous l'incrémentons de 1 et attribuons ce numéro comme nom du chat. Pour un constructeur, l’ordre des arguments est très important. Échangeons les arguments name et age dans notre constructeur.

public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 10); //error!
    }
}
Erreur! Le constructeur décrit clairement : lors de la création d'un objet, Catil faut lui transmettre un nombre et une chaîne, dans cet ordre . C'est pourquoi notre code ne fonctionne pas. N'oubliez pas cela et gardez cela à l'esprit lorsque vous créez vos propres classes :

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
Ce sont deux créateurs complètement différents ! Résolvez maintenant quelques problèmes pour consolider le matériel :)
  • Musée des Antiquités.
Votre tâche est de concevoir la classe Artifact. Les objets conservés dans le musée sont de trois types. Le premier est dont on ne sait rien hormis le numéro de série attribué par le musée (par exemple : 212121). La seconde concerne le numéro de série et la culture par laquelle il a été créé (par exemple : 212121, « Aztèques »). Le troisième type concerne le numéro de série connu, la culture par laquelle il a été créé et l'âge exact de sa création (par exemple : 212121, « Aztèques », 12). Créez une classe Artifactqui décrit les antiquités stockées dans le musée et écrivez le nombre requis de constructeurs pour celle-ci. Dans la méthode main(), créez un artefact de chaque type.

public class Artifact {

    public static void main(String[] args) {
    }
}
  • Site Web de la réunion
Vous créez une base de données d’utilisateurs pour un site de rencontre. Mais le problème est que vous avez oublié dans quel ordre il faut les préciser et que vous n’avez pas les spécifications techniques sous la main. Concevez une classe Userqui aura des champs - nom ( String), âge ( short) et taille ( int). Créez le nombre requis de constructeurs pour que le nom, l'âge et la taille puissent être spécifiés dans n'importe quel ordre.

public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {
        
    }
}
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION