On Github avernois / training-java_intro
Software Craftsman
Software Anarchist
blog : https://blog.crafting-labs.fr
twitter : @avernois
Vous attendez quoi de cette formation ?
class Hello { public static void main(String[] args) { System.out.println("Hello World!"); } }
Compilation avec javac
javac Hello.javaLa compilation produit du bytecode Hello.class.
Le bytecode est indépendant de la plateforme.
java Helloou en spécifiant le classpath
java -classpath <dir> Hello
int variable = 1;Il n'y a (presque) pas d'inférence de type !
8 types de base
Ces éléments ne sont pas des objets. On les affecte directement, sans new ou appel à un constructeur.
Il est déconseillé d'utiliser new. Il est préférable de faire appel à .valueOf( ) ou parse().
int i = 1000; int hexa = 0x1a; // hexa = 26 int binary = 0b1111; // binary = 15 double d1 = 123.4d; double d1bis = 123.4; // 'd' est pas défaut, et généralement omis. double d2 = 1.234e2; float f = 123.4f;
long creditCardNumber = 1234_5678_9012_3456L; float pi = 3.14_15F;On ne peut mettre un underscore uniquement entre 2 nombres.
int[] intArray = new int[10]; // crée un tableau d'int de taille 10. Integer[] integerArray = new Integer[10]; intArray[0] = 1; String[] months = {"january", "february", "march"};
public enum Month { JANUARY, FEBRUARY, MARCH, APRIL // je ne les mets pas tous, vous avez saisi l'idée. }On peut y ajouter un constructeur
public enum Month { JANUARY("Jan"), FEBRUARY("Feb"), MARCH("Mar"), APRIL // idem private String shortName; private Month(String shortName) { this.shortName = shortName; } public getShortName() { return shortName; } }Usage :
Month january = Month.JANUARY;
if (boolean) { // do things when boolean is true }
if (boolean) { // do things when boolean is true } else { // do things when boolean is false }
if (boolean) { // do things when boolean is true } else if (anotherBoolean) { // do things when boolean is false and anotherBoolean is true } else { // }
public String monthNumberToText(Integer monthNumber) { String monthText; switch(monthNumber) { case 1: monthText = "January"; break; case 2: monthText = "February"; break; // handle all cases default: throw new InvalidMonthNumberException(monthNumber); } }Fonctionne avec un Enum, un nombre (Integer, Byte, Short, Character) ou une String
(i < 2) ? System.out.println("i est inférieur à 2") : System.out.println("i est supérieur ou égal à 2");
public String stringOrEmptyString(String input) return (input == null) ? "" : input;
while (boolean) { // do things }
do { // do things } while (boolean)
for (int i = 0; i < 10; i++) { System.out.println(i); }
List<string> chaines = ... ; for (String chaine: chaines) { System.out.println(chaine); } </string>
package fr.craftinglabs.training.java;dans le répertoire
fr/craftinglabs/training/java;
package training.java; import training.java.another.MyClass; import java import training.java.another2.*; // importe toutes les classes publiques du packageSouvent, l'IDE s'occupe de ça pour vous :)
public class Point { int x; // variable d'instance int y; public Class(int x, int y) { this.x = x; // this se réfère à l'instance this.y = y; } public int getX() { return x; // pas de surcharge, inutile de préciser le this. } }
//... static public void main() { Point point = new Point(1, 2); // instanciation System.out.println("X=" + point.getX(); }
public class Point { private int x; private int y; static int maxX = 256; static public getMaxX() { // méthode de classe // dans une méthode statique, this n'existe pas. // Il est impossible d'accéder à this.x ou this.y. return maxX; } }
//... static public void main() { Point.getMaxX(); // pas besoin d'instancier }
public class Point { int x; int y; public Point(int x, int y) { this.x = x; this.y = y; } public Point() { // plusieurs constructeurs this(0, 0); // appel à un autre constructeur } }Si aucun constructeur n'est spécifié, le compilateur en créera un d'office sans paramètre. Les variables d'instances seront iniatilisé avec des valeurs par défaut. C'est souvent une mauvaise idée.
public class Circle { private Point center = new Point(1, 2); private int diameter; class Point { // le modifier public n'est pas possible // définition de la classe, variable, constructeur... // On est dans Cercle, donc on a accès à diameter et center } } class AnotherPoint { // déclarée dans le même fichier // cela reste une classe indépendante, // elle n'a pas accès aux éléments private de Cercle // elle ne peux pas être public }
public class Circle extends Shape { private int radius; private Point center; public Circle(Point center, int radius) { super(); // appelle constructeur de la classe parente this.radius = radius; // les éléments spécifiques this.center = center; } @Override // surcharge une méthode présente dans la classe parente public float surface() { return Math.PI * Math.square(radius); } }
Pas d'héritage multiple.
La classe fille a accès aux méthodes et variables public et protected de la classe mère.
Les constructeurs doivent être surchargés.
Une méthode avec le modifier final ne peut pas être surchargées dans une sous-classe.
abstract public class Shape { abstract public float surface(); // méthode sans implémentation }
Une classe abstraite ne peut pas être instancier.
Elle peut contenir des méthodes abstraites, sans implémentation, qui devront être définié par les sous-classes.
interface Perimeter { float perimeter(); }
public class Square implements Perimeter { public float perimeter () { return sideSize * 4; } }
L'interface sépare le contrat de l'implémentation.
Une classe peut implémenter plusieurs interface.
L'interface peut contenir des constantes (final static) de classes. À utiliser avec prudence.
public void myMethod() { try { doRiskyThings(); } catch (AnException e) { doSomething(); } catch (AnotherOne e) { e.printStackTrace(); } finally { // peu importe ce qui c'est passé, on passera par là. } }
Si une exception n'est pas rattrapée, elle est propagée le long de la chaîne d'appel. Jusqu'à tomber dans un catch ou arrêter le programme.
public void myMethod() throws MyCheckedException { // do something if(somethingWrongHappened) { throw new MyCheckedException(); } }Un appelant de cette méthode a l'obligation de la catcher ou de déclarer à son tour qu'il peut la lever (catch ou throws)
List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); // caster, c'est toujours risqué. list.add(1); // compile sans problème
List<String> list = new ArrayList<>(); list.add("hello"); String s = list.get(0); list.add(1); // ne compile pas ! 1 n'est pas une string
public class Pair<K, V> { private K key; private V value; public Pair(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } }
Pair<Integer, String> pair = new Pair<Integer, String>(1, "1"); Pair<Integer, String> diamondPair = new Pair<>(1, "1"); // depuis java 7.