Revue Java
Je vais utiliser Java pour la première fois depuis longtemps, j'ai donc résumé ce que j'ai examiné dans un mémorandum. Il serait utile que vous puissiez signaler des erreurs ...
Présentation de Java
- Développé par Sun Microsystems au début des années 90
--Sun Microsystems a été acquis par Oracle en 2010
- La copie de capture est "Ecrire une fois, exécuter n'importe où"
- ** Compiler ** convertit le fichier de code source
.java
en bytecode .class
, ** JVM ** interprète et exécute le bytecode
- Initialement, la version était 1. *, mais maintenant elle est représentée par un entier tel que 6, 7 et 8.
- 1.0 -> 1.1 -> 2.0 -> 1.3 -> 1.4 -> 5.0 -> 6 -> 7(GAE) -> 8(AWS Lambda)
Orientation objet
- Remplacez le mouvement réel des choses par le programme tel qu'il est
- Réduit l'impact sur le code existant lors de l'ajout de fonctionnalités
- Le code Java se compose de classes et les classes sont constituées d'états (variables d'instance) et de fonctions (méthodes).
- Créer une instance à partir d'une classe
- Les méthodes sont communes aux instances, les variables d'instance sont uniques
- Passer des données à la méthode (argument) par valeur
- Les méthodes peuvent être surchargées (différents arguments avec le même nom de méthode)
- Les variables d'instance ont des valeurs par défaut (pas des variables locales)
- Empêcher la manipulation non autorisée des variables d'instance
- Déclarez la variable d'instance avec
private
, et exécutez l'instance à partir de la méthode getter et de la méthode setter déclarées avec public
.
--Héritage
- Hériter lorsque la classe a une relation IS-A
- Cat is an Animal.
class Cat extends Animal {}
- Il y a une relation Has-A comme quelque chose de similaire
- L'héritage étant à sens unique, les méthodes de superclasse peuvent être utilisées à partir de sous-classes, mais pas l'inverse.
- Override permet de remplacer les méthodes de superclasse
- mérite
--DRY: l'héritage peut être dédupliqué à l'aide d'une méthode commune dans une superclasse de plusieurs sous-classes.
- Polymorphisme: l'affectation de sous-classe est possible en spécifiant une superclasse comme type lors de la déclaration d'arguments et de variables de méthode.
- Même si vous ajoutez une nouvelle sous-classe, elle sera disponible sans modifier le code correspondant.
- Remarques sur l'utilisation de l'héritage - Rendre les sous-classes plus spécifiques que les superclasses
- Les superclasses qui n'ont pas besoin d'être instanciées doivent être abstraites avec ʻabstract`
- Si vous voulez forcer une sous-classe à implémenter la logique, utilisez ʻabstract` pour en faire une méthode abstraite.
- Dans ce cas, il doit s'agir d'une classe abstraite
- Ne pas utiliser dans le but de réutiliser des méthodes, à utiliser lorsqu'une relation IS-A est établie
--La superclasse est appelée en premier, le constructeur de la sous-classe est appelé plus tard et l'ordre ne peut pas être modifié.
- Java interdit l'héritage multiple qui hérite de plus d'une classe
- Si plusieurs superclasses héritées ont le même nom de méthode, la question de savoir laquelle prioriser
- Cependant, plusieurs implémentations de l'interface sont possibles
- ʻObject` est une superclasse de toutes les classes
--Has equals, hashCode, getClass, toString comme méthodes
- Classes abstraites complètes, toutes les méthodes deviennent des méthodes abstraites
- Utilisé pour ajouter des fonctions communes à plusieurs classes dans la relation d'héritage (relation IS-A)
- Les classes ArrayList et HashSet n'ont pas de relation d'héritage, mais les deux implémentent une interface Iterable qui permet un accès répété aux éléments.
- Spécifier une interface comme argument de méthode ou type de retour permet l'affectation d'une instance de la classe à implémenter.
variable
- Les variables peuvent être divisées en types primitifs (int, double, booléen) et types de référence
- Les variables de type de référence stockent les références aux objets dans la zone de tas
- Un tableau contenant des types primitifs (int [], etc.) est également une variable de type référence.
- Soyez prudent lorsque vous comparez, "==" pour le type primitif, "égal" pour le type de référence ("==" si vous voulez savoir s'il s'agit de la même référence d'objet))
- Les variables peuvent être castées (conversion de type)
--Cast de int en double est possible
--Double à int spécifier la gestion des fractions à l'aide de la bibliothèque Math
- Le type primitif a un objet wrapper correspondant
- Objet entier pour le type int
--Parce que vous pouvez spécifier un objet dans les génériques, ʻArrayList
entraînera une erreur de compilation et ʻArrayList <Integer>
entraînera la déclaration de type correcte.
- Convertir automatiquement l'objet wrapper <-> type primitif
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1); //Insérer des données de type int
int i = list.get(o); //Recevoir en tant que variable de type int
- A l'invariance de la chaîne
- Chaque fois que vous concaténez des chaînes dans une boucle, un nouvel objet est créé dans le pool de chaînes
--Il a été souligné que la surcharge de la création d'objets et le problème que le pool String n'est pas garbage collection.
--Concaténation avec StringBuffer / StringBuilder # append est recommandée
Niveau d'accès
- Il y a public, privé, par défaut, protégé
- Les applications publiques et privées
- Public: disponible à partir de n'importe quel code
- Privé: uniquement disponible dans votre classe
- Par défaut: uniquement disponible à partir de votre propre classe de package
- Protégé: Disponible à partir de sous-classes d'autres packages en plus de la classe de votre propre package
Collecte des ordures
- La zone de mémoire utilisée par Java est divisée en pile et tas.
- Les méthodes et les variables locales (variables déclarées dans les méthodes) sont stockées sur la pile
--Ajouté à la pile lorsqu'une méthode appelle une nouvelle méthode
--Supprimé de la pile lorsque la méthode retourne
- Les objets sont stockés dans le tas
- Les objets sont soumis au garbage collection lorsque toutes les références ont disparu
statique
- Les méthodes statiques ne nécessitent pas d'instance (par exemple, les méthodes de classe Math)
- Si vous créez une classe avec un constructeur de
private
, vous ne pourrez pas créer d'instance.
- Dans les méthodes statiques, les variables d'instance et les méthodes normales ne peuvent pas être utilisées, mais des variables statiques peuvent être utilisées.
- Les variables statiques sont des variables qui ont la même valeur dans toutes les instances de la classe
- Les constantes peuvent être définies avec
static final
exception
- Soulevez une exception pour informer l'utilisateur de la méthode que la méthode n'a pas pu être exécutée avec succès dans certaines conditions
- Toutes les exceptions sont des objets de classe qui héritent du type Exception
- RuntimeException est causé par une faille dans la logique du programme plutôt que par une situation inattendue.
--NumberFormatException in Integer # parseInt est dû au fait que la chaîne d'argument n'est pas un nombre, qui doit être éliminé dans la logique avant d'appeler
- Un bloc try / catch n'est pas requis pour les exceptions qui héritent de RuntimeException (exceptions non vérifiées)
- Polymorphisme: Si vous spécifiez Exception pour catch, vous recevrez toutes les exceptions.
try {} catch(Exception e) {}
- Non recommandé, mais efficace car il est pratique dans le code de test, etc.
- L'ordre des instructions catch est important et la sous-classe doit être écrite ci-dessus
try {
} catch(Cat e) {
} catch(Animal e) {
- Si vous ne gérez pas les exceptions, vous pouvez l'éviter en spécifiant des levées lors de la déclaration de la méthode.
IO
- La méthode d'écriture de FileWriter accède au disque chaque fois qu'il est exécuté, ce qui entraîne de mauvaises performances.
- Lors de l'écriture avec BufferedWriter, une certaine quantité de mémoire est stockée et lorsque la capacité est pleine, l'écriture est effectuée, de sorte que l'accès au disque diminue.
--Utilisez flush () pour forcer une écriture
- Utilisez BufferedReader pour lire
fil
- Divisez le temps CPU pour que plusieurs processus semblent parallèles en même temps
- Pour démarrer un thread, créez un objet d'une classe qui implémente l'interface de Runnable.
- Il existe trois états de thread: exécutable, bloc (Sleep, IO) et running.
- Chaque état est géré et déterminé par le programmateur de threads
- Des problèmes surviennent lorsque plusieurs threads accèdent au même objet
- Le verrouillage sur l'accès aux objets peut être effectué en attachant synchronisé à la méthode et en limitant à un le nombre de threads pouvant accéder en même temps.
- Faites attention aux verrous morts lors de l'utilisation
Structure de données
- SET: Utilisé lorsqu'il est important qu'il n'y ait pas d'éléments en double
- HashSet, TreeSet
--Doublon en utilisant hashCode () et equals (), donc remplacez si nécessaire
- Liste: utilisée lorsque la disposition des éléments est importante
- Vous pouvez trier avec Collections.sort
- Notez la différence entre les deux suivants
--Lors de l'affectation d'une collection dont les éléments sont des instances de superclasse
public void barkAll(ArrayList<Animal> user) {}
--Lors de l'affectation d'une collection dont les éléments sont des instances de sous-classe (à l'aide de caractères génériques)
public void barkAll(ArrayList<? extends Animal> user) {}
Package et JAR
- Rendre les classes du même nom disponibles en séparant les classes en packages
- Le nom du package est généralement l'inverse du domaine
- Les fichiers de classe peuvent être combinés dans JAR
- Vous pouvez créer un fichier JAR exécutable en spécifiant Main-Class dans Manifest.txt.