classe
- Les bases de l'application Java
- Combinaison de cours pour composer une application
Qualificatif
- Mots clés qui déterminent la nature des classes et des membres
- Modificateur de classe
- ** public **: accessible depuis toutes les classes
- ** final **: ne pas autoriser l'héritage
- ** abstract **: Classe abstraite
- ** strictfp **: la virgule flottante est calculée de manière indépendante de l'environnement
public
- ** Qualifiant d'accès **: la classe actuelle est accessible par toutes les classes
- Si non spécifié, accès uniquement à partir du même package (package privé)
strictfp
- Les nombres à virgule flottante sous l'opérateur strictfp sont ** toujours traités par la norme IEEE754 **
- ** Le même résultat peut être obtenu quel que soit l'environnement! ** **
- cf: classe BigDecimal si vous voulez éliminer l'erreur de virgule flottante elle-même
Structure de classe
- Classe
- Membres statiques
- Champ de classe
- bloc d'initialisation statique
- Méthode de classe
- Membre de l'instance
- Champ
- Bloc d'initialisation
- Constructeur
- Méthode
champ
- Variables membres: informations qui doivent être gérées par la classe
- Convention de dénomination des variables
- Accès avec
.
Person.java
//Nom du type de chaîne,définition du champ age de type int
public class Person {
public String name;
public int age;
}
Main.java
public class Main {
public String firstName;
public String lastName;
public static void main(String[] args) {
//Instancier avec un nouvel opérateur
var p1 = new Person();
p1.name = "Yamada Taro";
p1.age = 30;
var p2 = new Person();
p2.name = "Ichiro Suzuki";
p2.age = 25;
System.out.printf("%s(%d ans)\n", p1.name, p1.age); //Taro Yamada (30 ans)
System.out.printf("%s(%d ans)\n", p2.name, p2.age); //Ichiro Suzuki (25 ans)
}
}
Modificateur de champ
- Accès généralement limité en utilisant privatete
- Vous n'avez pas à vous soucier de la façon de conserver les données lorsque vous utilisez la classe
- ** public **: accessible depuis toutes les classes
- ** protected **: Classe actuelle et classe dérivée, seul le même package est accessible
- ** private **: accessible uniquement à partir de la classe actuelle, valeur par défaut
- ** statique **: champ de déclaration de classe
- ** final **: réaffectation interdite
- ** transitoire **: exclu de la sérialisation
- ** volatile **: suppression du cache de valeurs
Champ par défaut
- A une valeur par défaut en fonction du type de données du champ
- Si vous utilisez la valeur par défaut telle quelle, vous n'avez pas à l'initialiser, mais elle manque de lisibilité.
- cf: Les variables de déclaration de méthode (variables locales) n'ont pas de valeur par défaut
- boolean:false
- byte, short, int, long:0
- float, double:0.0
- char:\u0000
- ** Type de référence **: null
Méthode
- ** Représente le comportement, le traitement et le comportement de classe **
- ** Manipuler les valeurs de données de classe (champs) **
- méthode principale: point d'entrée de l'application, exécuté automatiquement au démarrage
- D'autres méthodes générales sont appelées et exécutées à partir d'autres méthodes avec l'opérateur
.
.
Person.java
//afficher la définition de la méthode
public class Person {
public String name;
public int age;
public String show() {
return String.format("%s(%ré).", this.name, this.age);
//return String.format("%s(%ré).", name, age);
}
}
MethodBasic.java
//p.Accéder à la méthode show avec show
public class MethodBasic {
public static void main(String[] args) {
var p = new Person();
p.name = "Yamada Taro";
p.age = 30;
System.out.println(p.show());
}
}
Argument de méthode
- ** Argument réel **: passé par l'appelant
- ** Argument formel **: variable de destinataire
- Uniquement accessible depuis la méthode (variable locale)
//Argument réel
getBmi(60,1.7)
//Argument formel
public double GetBmi {double weight, double height){
return weight / (height * height )
}
- S'il y a beaucoup d'arguments, ** regroupez les arguments liés dans une classe **
- Ordre des arguments
- Parmi les plus importants
- Cohérence dans l'ordre
- Les arguments liés sont proches
Valeur de retour de la méthode
- Renvoyer le résultat du traitement avec retour
- Les instructions après le retour ne sont pas exécutées
- Facultatif s'il n'y a pas de valeur de retour, ** Spécifiez viod comme type de définition de méthode **
- La méthode void peut également renvoyer explicitement le processus à l'appelant avec
return;
Person.java
public class Person {
public String name;
public int age;
public void show() {
System.out.printf("%s(%ré).\n", this.name, this.age);
}
}
MethodVoid.java
public class MethodVoid {
public static void main(String[] args) {
var p = new Person();
p.name = "Yamada Taro";
p.age = 30;
p.show();
}
}
Modificateur de méthode
- Vous n'avez pas à vous soucier de la façon de conserver les données lorsque vous utilisez une classe avec un modificateur.
- ** public **: accessible depuis toutes les classes
- ** protected **: Classe actuelle et classe dérivée, seul le même package est accessible
- ** private **: accessible uniquement à partir de la classe actuelle, valeur par défaut
- ** statique **: méthode de classe Declare
- ** abstract **: déclarer une méthode abstraite
- ** final **: remplacement interdit
- ** synchronisé **: accessible uniquement à partir d'un thread
- ** strictfp **: Calcule la virgule flottante pour qu'elle soit indépendante de l'environnement
- ** native **: méthode écrite dans un langage autre que Java (C / C ++)
*
public final native void notify();
- Il existe également des inconvénients tels que l'existence de frais généraux et une gestion des sources plus compliquée que Java seul.
this
- ** Pointez sur l'objet actuel **
- Variables pouvant être utilisées implicitement sous la méthode
- Reportez-vous au champ nom / âge appartenant à l'objet actuel
System.out.printf ("% s (% d ans). \ N ", this.name, this.age);
- Référence de la méthode
this.myMethod (…)
- S'il faut écrire ceci
- Pour les champs ** Utilisez ceci pour distinguer les variables locales de même nom lorsqu'elles sont couvertes **
- Il semble qu'il vaut mieux l'ajouter à tous les champs ** pour ne pas avoir à juger s'il existe des variables locales une par une **
- Utilisez ceci lorsque la méthode ** veut spécifier qu'elle appartient à l'objet courant **
Surcharge de méthode
- Surcharge: ** Définissez plusieurs méthodes avec le même nom mais des types / séquences d'arguments différents **
- Impossible si le type de retour / nom d'argument est différent
- Fondamentalement, les champs portant le même nom ne doivent pas exister dans la même classe
- Cependant, la méthode est identifiée par ** signature (nom, type d'argument, séquence) **, elle n'est donc autorisée que si les éléments suivants sont différents:
- Nombre d'arguments
- Type de données d'argument
- Signature
- La signature de ʻint indexOf (String str, int index) ʻest
- Surcharge
public static int abs( int a )
public static float abs( float a )
- Utilisé lors de l'appel de la surcharge d'origine en préparant uniquement la valeur spécifiée de l'argument avec une surcharge
- Remarque: une surcharge avec le même nombre d'arguments mais des types différents n'est pas bonne
- La surcharge est sélectionnée au moment de la compilation, pas au moment de l'exécution
- Lors de l'exécution du code ci-dessous, seul le
public void show (CharSequence cs) {
du type de boucle for CharSequence
est exécuté.
//Attendez-vous à une surcharge optimale selon le type
//Mais le résultat est
//CharSequence: Le printemps est Akebono
//CharSequence: l'été est la nuit
//CharSequence: Crépuscule en automne
public class OverloadAnti {
public void show(String value) {
System.out.println("String: " + value);
}
public void show(StringBuilder builder) {
System.out.println("StringBuilder:" + builder);
}
public void show (StringBuffer buf) {
System.out.println("StringBuffer:" + buf);
}
public void show(CharSequence cs) {
System.out.println("CharSequence:" + cs);
}
}
public class OverloadAntiClient {
public static void main(String[] args) {
var c = new OverloadAnti();
var list = new CharSequence[] {
"Le printemps est Akebono",
new StringBuilder("L'été est la nuit"),
new StringBuffer("L'automne est le crépuscule"),
};
for (var cs : list) {
c.show(cs);
}
}
}
portée
- ** Périmètre des variables dans le code **
- Déterminer où la variable peut être référencée
- Dépend de l'endroit où la variable est déclarée
- ** Champ d'application **
- Déclaré directement sous la classe {…}
- Accessible pour toute la classe
- ** Périmètre de la variable locale **
- Déclaré dans le bloc de définition de méthode
- Uniquement accessible dans la méthode
- ** Portée du bloc **
- Un type de variable locale
- Déclaration sous méthode (bloc de contrôle tel que if / while / for)
- Uniquement accessible dans le bloc
Conflit entre le champ et la variable locale
- Lorsqu'une variable du même nom est déclarée à l'intérieur ou à l'extérieur de la méthode
- ** Les variables avec des portées différentes (variables de champ, variables locales) ont le même nom mais sont différentes! !! ** **
- Utilisez ** ceci ** si vous souhaitez accéder aux variables de champ masquées
Scop.java
//les données sont couvertes
public class Scope {
//Données en tant que variable de champ
public String data = "champ";
public String show() {
//Les données en tant que variable locale
//Cette déclaration masque temporairement les variables de champ qui devraient être valides pour toute la classe
var data = "local";
return data;
//Si vous souhaitez accéder aux variables de champ masquées
// return this.data;
}
}
ScopeBasic.java
public class ScopeBasic {
public static void main(String[] args) {
var s = new Scope();
//Variables locales de la méthode show
System.out.println(s.show()); //local
//Les variables locales n'affectent pas les variables de champ
System.out.println(s.data); //champ
}
}
- ** Remarque: la portée de la variable va de la position déclarée à la fin du bloc **
- La variable est valide à partir de la position déclarée
//Exemple NG: str1 est valide à partir de la position déclarée
public class ScopeStrict {
String str2 = str1; //Str2 ne peut pas être déclaré avant str1
String str1 = “neko desu“;
}
- ** Exceptions aux références de méthodes / constructeurs **
- Indépendamment de la position de la déclaration ** Peut être référencé à partir de toute la classe **
- Ne peut pas être référencé à partir d'une autre méthode / constructeur (bloc d'initialisation, etc.)
public class ScopeStrict {
public void show() {
System.out.println(str); //neko desu
}
String str = “neko desu”;
}
StrictClient.java
public class StrictClient {
public static void main(String[] args) {
var s = new ScopeStrict();
s.show();
}
}
Bloquer la portée
- Variables déclarées avec la syntaxe de contrôle (comme if / while / for / try)
- Puisqu'il s'agit d'un type de variable locale, ** une variable d'étendue de bloc avec le même nom que la variable locale supérieure ne peut pas être déclarée **
- Il est possible de déclarer une variable locale avec le même nom après avoir détruit une variable de bloc
- La déclaration de variable d'étendue de bloc est également possible avec des blocs parallèles
public class ScopeBlock {
public static void main(String[] args) {
/*
//Déclarez une variable d'étendue de bloc avec le même nom que la variable locale
var data = "Portée locale";
{
var data = "Bloquer la portée"; //Erreur
}
*/
{
var data = "Bloquer la portée";
}
//À ce stade, la variable d'étendue de bloc a été détruite
var data = "Portée locale"; //OK
System.out.println(data);
}
}
//Portée de bloc parallèle
public class ScopeBlock {
public static void main(String[] args) {
{
var data = "Bloquer la portée";
System.out.println(data);
}
{
var data = "Bloquer la portée 2";
System.out.println(data);
}
}
}