Le langage Java est compilé, ce qui veut dire que le code est transformé en un code intérmediaire (dans le cas du java un .class) qui est ensuite interpreté en code machine.
Le Java est un langage objet.
Convention
Le java utilise le Camel Case pour nommer les variables et fonctions.
Les fonctions et lignes longues doivent être découpés :
Le java est un langage typé, ce qui veut dire que chaque variable doit indiquer son type.
java
1
2
3
4
5
intmonNombre=0;StringmonTexte="texte";// Le type String doit avoir une majuscule, comme expliqué aprèsbooleanmonBool=true;charmonCharactere='c';floatmonNombreAVirgule=0.0;
Les types ne peuvent pas être redéfini sans casting explicite par le developpeur
publicclassVoiture{/* On utilise private pour rendre les "getters" et "setters" utiles, sinon on peut accéder au élement comme tel : voiture.age
Ce n'est pas recommandé car les getters / setters peuvent avoir une certaine logique (pas de nombre en dessous de 1, le modèle doit avoir un certain nombre de charactères...)
,*/privateStringmodele;privateintage;privateStringmarque;// Un constructeur permet d'initialiser l'objet avec tout ou un certain nombre d'élémentspublicVoiture(Stringmodele,intage,Stringmarque){// le 'this.element' référence la classe// On pourrait donc mettre :// this.modele = toto;// Si dans le constructeur on met 'toto' au lieu de modelethis.modele=modele;this.age=age;this.marque=marque;}// Ici, le constructeur ne prend que 2 paramètres, l'age est initialisé automatiquementpublicVoiture(Stringmodele,Stringmarque){this.modele=modele;this.age=1;this.marque=marque;}// Renvoi l'élément de la classepublicStringgetModele(){returnmodele;}publicintgetAge(){returnage;}publicStringgetMarque(){returnmarque;}publicvoidsetModele(Stringmodele){this.modele=modele;}publicvoidsetAge(intage){this.age=age;}publicvoidsetMarque(Stringmarque){this.marque=marque;}// Une fonction très pratique en java est le 'equals' qui vérifie si un objet est égale à une autre instance du même objet (avec des paramètres différents)/* L'utilisation de '@override' permet de redéfinir une fonction déja définit.
Ne pas l'utiliser est possible mais l'utiliser est une bonne pratique :
- Le compilateur vas check si la fonction existe dans la classe de base, si non, erreur de compilation */// Tout les objets descende du primitif 'Object' qui possède des fonctions 'equals' et 'toString'@Overridepublicbooleanequals(ObjectautreVoiture){if(this==autreVoiture){returntrue;}if(autreVoiture==null){returnfalse;}// getClass renvoi la classeif(getClass()!=autreVoiture.getClass()){returnfalse;}// On fait du upcast de Object (le type le plus primitif) vers notre type VoitureVoitureautre=(Voiture)autreVoiture;if(modele==null){if(autre.modele!=null)returnfalse;}elseif(!modele.equals(autre.modele)){returnfalse;}if(this.age!=autre.age)returnfalse;if(marque==null){if(autre.marque!=null)returnfalse;}elseif(!marque.equals(autre.marque)){returnfalse;}returntrue;}// Le equals() ce dessus est correct, mais en pratique on utilise plutôt ce genre de code/*
// On import la classe Objects qui permet de caster
// Les imports sont TOUJOURS en haut du code (comme en python ou autre)
import java.util.Objects;
@Override
public boolean equals(Object objet) {
if (this == objet) return true;
if (!(objet instanceof Voiture)) return false;
Voiture autre = (Voiture) objet;
return age == autre.age &&
Objects.equals(modele, autre.modele) &&
Objects.equals(marque, autre.marque);
}*/@OverridepublicStringtoString(){return"La voiture "+getMarque()+" à un "+getAge()+" ans et est de modèle "+getModele();}// Le main est la classe qui est executé, comme le main en pythonpublicstaticvoidmain(String[]args){Voiturev1=newVoiture("Classe A","Mercedes");Voiturev2=newVoiture("Capture","Renault");System.out.println(v1.toString());System.out.println(v2.toString());System.out.println(v1.equals(v2));}}
Le POO permet de donner à des objets des fonctions spécifiques
java
1
2
3
4
5
6
7
// Dans le même fichierpublicvoidvieillir(){age++;}publicbooleanestAncienne(){returnage>10;}
// le extends est UNIQUE// Un objet ne peut avoir q'un seul objet pèrepublicclassVoitureElectriqueextendsVoiture{privateintautonomie;publicintgetAutonomie(){returnautonomie;}publicvoidsetAutonomie(intautonomie){this.autonomie=autonomie;}// L'utilisation du 'super' appel la fonction de la classe de base, ici, voiturepublicVoitureElectrique(Stringmodele,intage,Stringmarque,intautonomie){super(modele,age,marque);// idem que faire appel au constructeur de 'voiture'this.autonomie=autonomie;}publicVoitureElectrique(Stringmodele,Stringmarque,intautonomie){super(modele,1,marque);this.autonomie=autonomie;}@Overridepublicbooleanequals(Objectobjet){if(!super.equals(objet)){returnfalse;}if(!(objetinstanceofVoitureElectrique)){returnfalse;}VoitureElectriqueautre=(VoitureElectrique)objet;returnautonomie==autre.autonomie;}@Overridepublicvoidvieillir(){super.vieillir();autonomie-=10;// perte de capacité batterieif(autonomie<0){autonomie=0;}}publicvoidrouler(intkilometres){intconsommation=kilometres/5;// ex: 5 km = 1 km d'autonomieautonomie-=consommation;if(autonomie<0){autonomie=0;}}publicvoidrecharger(intkm){autonomie+=km;}publicbooleanbatterieFaible(){returnautonomie<50;}}
Le java étant un langage typé, la redéfinition des types est plus compliqué qu’en python ou JS
Certain type ont des fonctions spécifique, comme parseInt(String) pour le type int
Attention
La documentation pour cette fonction est tel :
Quote
Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign ‘-’ (’\u002D’) to indicate a negative value or an ASCII plus sign ‘+’ (’\u002B’) to indicate a positive value. The resulting integer value is returned, exactly as if the argument and the radix 10 were given as arguments to the parseInt(java.lang.String, int) method.
Cela veut dire que seul des nombres (le premier caractère peut être un + ou un - pour indiquer une valeur négative ou positive) peuvent être dans le string, sinon une exception est levé.
java
1
2
3
4
5
6
7
8
classExemple{publicstaticvoidmain(String[]args){Strings="-20";// On utilise Integer car c'est la classe primitive des intinti=Integer.parseInt(s);System.out.println(i);}}