Nous avons toujours défini des classes pour créer des objets. Les objets sont des entités dotées de fonctionnalités, tandis que les classes sont des classifications de types d'objets. Il s'agit d'un concept de base de l'orientation objet.
En héritage, nous traitons les classes comme des sujets extensibles, ce qui améliore notre compréhension des « classes ».
Il y a encore beaucoup à dire sur la classe elle-même. Nous continuerons à approfondir
données membres statiques
Certaines données sont utilisées pour exprimer l'état de la classe. Par exemple, dans la classe Human, nous pouvons utiliser « population » pour représenter le nombre total d’objets dans la classe Human. "Population" décrit directement l'état d'une classe, pas un objet.
La classe Humaine a une population de 8
Tous les objets de la classe partagent les données « population ». Ces données sont appelées données membres de classe (champ de classe).
Dans la définition de la classe, nous utilisons le mot-clé static pour déclarer les données membres de la classe, telles que :
Copiez le code comme suit :
classeHumain
{
/**
* constructeur
*/
humain public (int h)
{
ceci.hauteur = h;
}
/**
*accesseur
*/
public int getHeight()
{
renvoie this.height;
}
/**
* mutateur
*/
public void growHeight (int h)
{
ceci.hauteur = ceci.hauteur + h;
}
/**
*haleine
*/
souffle du vide public()
{
System.out.println("hu...hu...");
}
hauteur int privée ;
population entière statique privée ;
public static boolean is_mammal = true;
}
Nous définissons deux membres de données de classe : population et is_mammal. Tous les objets Humains partagent des données de population ; l'attribut is_mammal (est un mammifère) de tout objet Humain est vrai.
Les membres des données de classe doivent également définir des autorisations d’accès. Pour les données membres de classe déclarées publiques, elles sont directement accessibles de l'extérieur en utilisant class.field ou object.field (si un objet de cette classe existe). Les deux méthodes d'accès sont raisonnables car les données membres de la classe peuvent être considérées comme des attributs de la classe et comme des attributs partagés par tous les membres. Si un membre de données de classe est défini comme privé, alors le membre de données de classe n'est accessible qu'à partir de la classe.
(Is_mammal est défini sur public ci-dessus juste à des fins de démonstration. C'est assez dangereux. Si quelqu'un utilise Human.is_mammal=false;, tous les humains en souffriront. Encore une fois, le principe de base est de définir les données comme privées autant que possible.)
méthode statique
Nous pouvons également avoir des méthodes de classe, qui sont des méthodes déclarées comme statiques. Les méthodes de classe représentent des actions qu'une classe peut implémenter et les opérations n'impliquent pas d'objet spécifique. Si une méthode est déclarée statique, elle ne peut appeler que des données et des méthodes statiques, mais pas des données et des méthodes non statiques.
En fait, dans une méthode statique, aucun paramètre this ni super ne sera implicitement transmis. Nous n’avons aucun moyen de référencer les données et méthodes appartenant à l’objet (ce qui est exactement ce que nous souhaitons).
D’après ce qui a été dit ci-dessus, nous avons la relation suivante :
Une ligne pointillée rouge indique l'inaccessibilité. En d’autres termes, les données de l’objet ne sont pas accessibles dans les méthodes de classe.
Ensuite, nous ajoutons une méthode statique getPopulation(), qui renvoie une population de données statiques :
Copiez le code comme suit :
classeHumain
{
/**
* constructeur
*/
humain public (int h)
{
ceci.hauteur = h;
}
/**
*accesseur
*/
public int getHeight()
{
renvoie this.height;
}
/**
* mutateur
*/
public void growHeight (int h)
{
ceci.hauteur = ceci.hauteur + h;
}
/**
*haleine
*/
souffle du vide public()
{
System.out.println("hu...hu...");
}
hauteur int privée ;
/*
* méthode statique, accès à la population
*/
public statique int getPopulation()
{
retourner Human.population;
}
population entière statique privée ;
booléen statique privé is_mammal = true ;
}
Lors de l’appel d’une méthode de classe, nous pouvons l’appeler via class.method() ou object.method(). Par exemple, utilisez le test de classe Test suivant :
Copiez le code comme suit :
Test de classe publique
{
public static void main (String[] arguments)
{
System.out.println(Human.getPopulation());
Humain aPerson = nouvel Humain (160);
System.out.println(aPerson.getPopulation());
}
}
Nous avons appelé la méthode de classe getPopulation() en dehors de la définition de classe de deux manières.
Les méthodes d'objet modifient les données de classe
Nous voyons que les méthodes objets peuvent accéder aux données de classe. C'est un concept très utile. L'état d'une classe peut changer avec les objets. Par exemple, la « population » devrait augmenter de 1 à mesure qu’un objet est créé. On peut modifier les données "population" de la classe dans les méthodes de l'objet. Nous accédons aux données membres de la classe dans le constructeur ci-dessous. La méthode de construction est ici une méthode non statique, c'est-à-dire une méthode objet :
Copiez le code comme suit :
classeHumain
{
/**
* constructeur
*/
humain public (int h)
{
ceci.hauteur = h;
Population.humaine = Population.humaine + 1 ;
}
/**
*accesseur
*/
public int getHeight()
{
renvoie this.height;
}
/**
* mutateur
*/
public void growHeight (int h)
{
ceci.hauteur = ceci.hauteur + h;
}
/**
*haleine
*/
souffle du vide public()
{
System.out.println("hu...hu...");
}
hauteur int privée ;
/*
* méthode statique, accès à la population
*/
public statique int getPopulation()
{
retourner Human.population;
}
population entière statique privée ;
booléen statique privé is_mammal = true ;
}
Chaque fois que nous créons un objet, nous modifions les données de classe via la méthode de construction de l'objet et augmentons les données de classe de population de 1. De cette façon, la population peut refléter le nombre total d'objets appartenant à cette classe en temps réel (vous pouvez créer plusieurs objets dans Test puis imprimer Human.population).
En plus de l'exemple de constructeur donné ci-dessus, nous pouvons également accéder aux données de classe dans des méthodes objet ordinaires.
final
La signification fondamentale du mot-clé final est la suivante : cette donnée/méthode/classe ne peut pas être modifiée.
1. Données de type de base finales : valeur constante, qui ne peut être attribuée qu'une seule fois et ne peut plus être modifiée.
2.Méthode finale : cette méthode ne peut pas être remplacée. Les méthodes privées sont par défaut les méthodes finales.
3.Classe finale : cette classe ne peut pas être héritée.
Les objets de types ordinaires peuvent également avoir le mot-clé final, ce qui signifie que la référence de l'objet (référence) ne peut plus être modifiée. Autrement dit, la référence ne peut pointer que vers un seul objet. Cependant, le contenu de l'objet peut changer (comme pour les pointeurs statiques en C). Nous aborderons les références d'objets plus tard.
Si un type de données de base est à la fois final et statique, il ne stocke qu'une seule copie de la valeur fixe. C'est idéal pour stocker des constantes telles que pi.
Résumer
champ statique, méthode statique
classe.static_method()
final