{"id":8810,"date":"2026-06-16T19:53:06","date_gmt":"2026-06-16T17:53:06","guid":{"rendered":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/"},"modified":"2026-06-16T19:53:06","modified_gmt":"2026-06-16T17:53:06","slug":"decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee","status":"publish","type":"post","link":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/","title":{"rendered":"D\u00e9coder l&rsquo;h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e"},"content":{"rendered":"<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter+Tight:wght@500;600;700;800&#038;family=Inter:wght@400;500;600&#038;family=IBM+Plex+Mono:wght@400;500;600&#038;display=swap\">\n<style>\n.wgk-javaher-wrap{font-family:'Inter',system-ui,sans-serif;color:#1f2233;line-height:1.65;font-size:17px;}\n.wgk-javaher-wrap h1{font-family:'Inter Tight','Inter',sans-serif;font-weight:800;letter-spacing:-0.02em;font-size:clamp(28px,4vw,40px);line-height:1.15;color:#15172a;margin:0 0 18px;}\n.wgk-javaher-wrap h2{font-family:'Inter Tight','Inter',sans-serif;font-weight:700;letter-spacing:-0.015em;font-size:clamp(23px,3.1vw,32px);line-height:1.2;color:#15172a;margin:48px 0 14px;}\n.wgk-javaher-wrap h3{font-family:'Inter Tight','Inter',sans-serif;font-weight:700;font-size:19px;color:#1f2233;margin:26px 0 8px;}\n.wgk-javaher-wrap p{margin:0 0 16px;}\n.wgk-javaher-wrap strong{color:#15172a;font-weight:700;}\n.wgk-javaher-wrap a{color:#4338CA;text-decoration:underline;text-decoration-color:rgba(67,56,202,.4);text-underline-offset:2px;}\n.wgk-javaher-kicker{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:2.5px;text-transform:uppercase;color:#4338CA;margin-bottom:10px;}\n.wgk-javaher-lead{font-size:19px;line-height:1.55;color:#3a3e54;font-weight:500;letter-spacing:-0.005em;margin:0 0 28px;border-left:4px solid #4338CA;padding:4px 0 4px 20px;background:linear-gradient(90deg,rgba(67,56,202,.05),transparent);}\n.wgk-javaher-answer{background:#f4f3ff;border:1px solid #ddd9fb;border-left:5px solid #4338CA;border-radius:10px;padding:22px 26px;margin:28px 0;}\n.wgk-javaher-answer .wgk-javaher-tit{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;letter-spacing:2px;text-transform:uppercase;color:#4338CA;margin-bottom:10px;}\n.wgk-javaher-answer .wgk-javaher-txt{font-size:17px;line-height:1.6;color:#26283d;}\n.wgk-javaher-answer ul{margin:14px 0 0;padding-left:20px;}\n.wgk-javaher-answer li{margin:6px 0;font-size:15.5px;color:#3a3e54;}\n.wgk-javaher-need{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:26px 0;}\n.wgk-javaher-need .wgk-javaher-cell{background:#fff;border:1px solid #e6e4f7;border-top:3px solid #4338CA;border-radius:8px;padding:16px 18px;box-shadow:0 1px 2px rgba(21,23,42,.04),0 12px 26px -18px rgba(67,56,202,.35);transition:.25s ease;}\n.wgk-javaher-need .wgk-javaher-cell:hover{transform:translateY(-3px);box-shadow:0 1px 2px rgba(21,23,42,.06),0 18px 34px -16px rgba(67,56,202,.45);}\n.wgk-javaher-need .wgk-javaher-k{font-family:'IBM Plex Mono',monospace;font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:#7a6ff0;font-weight:600;}\n.wgk-javaher-need .wgk-javaher-v{font-family:'Inter Tight',sans-serif;font-size:16px;font-weight:700;color:#15172a;margin-top:6px;line-height:1.35;}\n.wgk-javaher-steps{counter-reset:wgkstep;display:grid;gap:12px;margin:24px 0;}\n.wgk-javaher-steps .wgk-javaher-step{display:flex;gap:14px;align-items:flex-start;background:#fff;border:1px solid #e6e4f7;border-radius:8px;padding:14px 16px;transition:.25s ease;}\n.wgk-javaher-steps .wgk-javaher-step:hover{transform:translateY(-3px);box-shadow:0 14px 30px -18px rgba(67,56,202,.4);}\n.wgk-javaher-steps .wgk-javaher-num{counter-increment:wgkstep;flex:0 0 30px;width:30px;height:30px;background:#4338CA;color:#fff;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;font-family:'IBM Plex Mono',monospace;font-weight:600;font-size:14px;}\n.wgk-javaher-steps .wgk-javaher-num::before{content:counter(wgkstep);}\n.wgk-javaher-steps .wgk-javaher-stxt{font-size:15.5px;line-height:1.55;color:#3a3e54;}\n.wgk-javaher-steps .wgk-javaher-stxt b{color:#15172a;}\n.wgk-javaher-code{background:#15162a;border-radius:10px;margin:22px 0;overflow:hidden;border:1px solid #2a2c4a;box-shadow:0 18px 40px -22px rgba(21,22,42,.7);}\n.wgk-javaher-code .wgk-javaher-cap{font-family:'IBM Plex Mono',monospace;font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:#9d97e8;padding:11px 18px;border-bottom:1px solid #2a2c4a;display:block;}\n.wgk-javaher-code pre{margin:0;padding:16px 18px;overflow-x:auto;}\n.wgk-javaher-code code{font-family:'IBM Plex Mono','Consolas',monospace;font-size:13.5px;line-height:1.65;color:#e3e1f7;white-space:pre;}\n.wgk-javaher-note{border-left:4px solid #4338CA;background:#f4f3ff;border-radius:0 6px 6px 0;padding:14px 18px;margin:20px 0;}\n.wgk-javaher-note .wgk-javaher-lbl{font-family:'IBM Plex Mono',monospace;font-weight:600;font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:#4338CA;margin-right:8px;}\n.wgk-javaher-note .wgk-javaher-ntxt{font-size:15px;line-height:1.55;color:#3a3e54;}\n.wgk-javaher-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;margin:26px 0;}\n.wgk-javaher-grid .wgk-javaher-card{background:#fff;border:1px solid #e6e4f7;border-top:3px solid #4338CA;border-radius:8px;padding:18px 18px 16px;transition:.25s ease;box-shadow:0 1px 2px rgba(21,23,42,.04);}\n.wgk-javaher-grid .wgk-javaher-card:hover{transform:translateY(-3px);box-shadow:0 16px 32px -18px rgba(67,56,202,.4);}\n.wgk-javaher-grid .wgk-javaher-card h3{margin:0 0 6px;font-size:16px;}\n.wgk-javaher-grid .wgk-javaher-card .wgk-javaher-ctxt{font-size:14px;line-height:1.55;color:#4a4e63;}\n.wgk-javaher-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:24px 0;}\n.wgk-javaher-duo .wgk-javaher-col{border-radius:8px;padding:18px 20px;border:1px solid #e6e4f7;}\n.wgk-javaher-duo .wgk-javaher-yes{background:#f0f3ff;border-top:4px solid #4338CA;}\n.wgk-javaher-duo .wgk-javaher-no{background:#fdf0f1;border-top:4px solid #c0455a;}\n.wgk-javaher-duo h3{margin:0 0 12px;font-size:13px;letter-spacing:1.5px;text-transform:uppercase;}\n.wgk-javaher-duo .wgk-javaher-yes h3{color:#3327a8;}\n.wgk-javaher-duo .wgk-javaher-no h3{color:#9c2f40;}\n.wgk-javaher-duo ul{margin:0;padding:0;list-style:none;}\n.wgk-javaher-duo li{display:flex;gap:9px;align-items:flex-start;padding:6px 0;font-size:14.5px;line-height:1.5;color:#2a2d40;border-bottom:1px solid rgba(0,0,0,.05);}\n.wgk-javaher-duo li:last-child{border-bottom:none;}\n.wgk-javaher-duo .wgk-javaher-mk{font-weight:700;flex:0 0 14px;}\n.wgk-javaher-duo .wgk-javaher-yes .wgk-javaher-mk{color:#4338CA;}\n.wgk-javaher-duo .wgk-javaher-no .wgk-javaher-mk{color:#c0455a;}\n.wgk-javaher-quote{margin:40px auto;padding:26px 24px;text-align:center;border-top:1px solid #4338CA;border-bottom:1px solid #4338CA;max-width:660px;position:relative;}\n.wgk-javaher-quote .wgk-javaher-q{font-family:'Inter Tight',sans-serif;font-size:24px;line-height:1.4;font-style:italic;font-weight:600;color:#15172a;letter-spacing:-0.01em;}\n.wgk-javaher-quote .wgk-javaher-mark{position:absolute;top:-20px;left:50%;transform:translateX(-50%);background:#fff;padding:0 14px;font-size:44px;line-height:1;color:#4338CA;font-family:'Inter Tight',serif;}\n.wgk-javaher-retain{background:#15162a;border-radius:12px;padding:26px 28px;margin:36px 0;}\n.wgk-javaher-retain .wgk-javaher-tit{font-family:'IBM Plex Mono',monospace;font-size:12px;letter-spacing:2px;text-transform:uppercase;color:#9d97e8;margin-bottom:16px;}\n.wgk-javaher-retain ul{margin:0;padding:0;list-style:none;display:grid;gap:10px;}\n.wgk-javaher-retain li{display:flex;gap:12px;align-items:flex-start;color:#e3e1f7;font-size:15px;line-height:1.5;}\n.wgk-javaher-retain .wgk-javaher-dot{flex:0 0 22px;width:22px;height:22px;border-radius:6px;background:#4338CA;color:#fff;display:inline-flex;align-items:center;justify-content:center;font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;}\n.wgk-javaher-faq{margin:36px 0;}\n.wgk-javaher-faq h2{margin-bottom:8px;}\n.wgk-javaher-faq .wgk-javaher-acc{border-top:1px solid #e0ddf3;}\n.wgk-javaher-faq details{border-bottom:1px solid #e0ddf3;}\n.wgk-javaher-faq summary{cursor:pointer;padding:16px 0;font-family:'Inter Tight',sans-serif;font-size:17px;font-weight:700;color:#15172a;list-style:none;display:flex;justify-content:space-between;gap:14px;align-items:center;}\n.wgk-javaher-faq summary::-webkit-details-marker{display:none;}\n.wgk-javaher-faq summary .wgk-javaher-plus{font-size:22px;font-weight:400;color:#4338CA;line-height:1;}\n.wgk-javaher-faq .wgk-javaher-ans{padding:0 0 16px;font-size:15.5px;line-height:1.7;color:#4a4e63;}\n.wgk-javaher-faq .wgk-javaher-ans code{font-family:'IBM Plex Mono',monospace;background:#f0eefb;color:#3327a8;padding:1px 6px;border-radius:4px;font-size:14px;}\n.wgk-javaher-wrap code.wgk-javaher-inl{font-family:'IBM Plex Mono',monospace;background:#f0eefb;color:#3327a8;padding:1px 6px;border-radius:4px;font-size:15px;}\n\/*RENDERFIX2*\/.wgk-javaher-steps .wgk-javaher-num{color:#eef3f9!important}.wgk-javaher-steps .wgk-javaher-num p,.wgk-javaher-steps .wgk-javaher-num li,.wgk-javaher-steps .wgk-javaher-num strong,.wgk-javaher-steps .wgk-javaher-num em,.wgk-javaher-steps .wgk-javaher-num a,.wgk-javaher-steps .wgk-javaher-num span,.wgk-javaher-steps .wgk-javaher-num b,.wgk-javaher-steps .wgk-javaher-num td,.wgk-javaher-steps .wgk-javaher-num th,.wgk-javaher-steps .wgk-javaher-num h2,.wgk-javaher-steps .wgk-javaher-num h3,.wgk-javaher-steps .wgk-javaher-num h4{color:#eef3f9!important}.wgk-javaher-steps .wgk-javaher-num strong,.wgk-javaher-steps .wgk-javaher-num b{color:#ffffff!important}.wgk-javaher-code{color:#eef3f9!important}.wgk-javaher-code p,.wgk-javaher-code li,.wgk-javaher-code strong,.wgk-javaher-code em,.wgk-javaher-code a,.wgk-javaher-code span,.wgk-javaher-code b,.wgk-javaher-code td,.wgk-javaher-code th,.wgk-javaher-code h2,.wgk-javaher-code h3,.wgk-javaher-code h4{color:#eef3f9!important}.wgk-javaher-code strong,.wgk-javaher-code b{color:#ffffff!important}.wgk-javaher-retain{color:#eef3f9!important}.wgk-javaher-retain p,.wgk-javaher-retain li,.wgk-javaher-retain strong,.wgk-javaher-retain em,.wgk-javaher-retain a,.wgk-javaher-retain span,.wgk-javaher-retain b,.wgk-javaher-retain td,.wgk-javaher-retain th,.wgk-javaher-retain h2,.wgk-javaher-retain h3,.wgk-javaher-retain h4{color:#eef3f9!important}.wgk-javaher-retain strong,.wgk-javaher-retain b{color:#ffffff!important}.wgk-javaher-retain .wgk-javaher-dot{color:#eef3f9!important}.wgk-javaher-retain .wgk-javaher-dot p,.wgk-javaher-retain .wgk-javaher-dot li,.wgk-javaher-retain .wgk-javaher-dot strong,.wgk-javaher-retain .wgk-javaher-dot em,.wgk-javaher-retain .wgk-javaher-dot a,.wgk-javaher-retain .wgk-javaher-dot span,.wgk-javaher-retain .wgk-javaher-dot b,.wgk-javaher-retain .wgk-javaher-dot td,.wgk-javaher-retain .wgk-javaher-dot th,.wgk-javaher-retain .wgk-javaher-dot h2,.wgk-javaher-retain .wgk-javaher-dot h3,.wgk-javaher-retain .wgk-javaher-dot h4{color:#eef3f9!important}.wgk-javaher-retain .wgk-javaher-dot strong,.wgk-javaher-retain .wgk-javaher-dot b{color:#ffffff!important}<\/style>\n<div class=\"wgk-javaher-wrap\">\n<h1>D\u00e9coder l&rsquo;h\u00e9ritage en Java : fondements, usages avanc\u00e9s et impacts sur la conception<\/h1>\n<div class=\"wgk-javaher-kicker\">Tutoriel \u00b7 Programmation orient\u00e9e objet<\/div>\n<p class=\"wgk-javaher-lead\">L&rsquo;<strong>h\u00e9ritage en Java<\/strong> est l&rsquo;un des piliers de la POO : il permet \u00e0 une classe d&rsquo;en \u00e9tendre une autre pour r\u00e9utiliser et sp\u00e9cialiser son code. Voici comment le mettre en \u0153uvre concr\u00e8tement avec <code class=\"wgk-javaher-inl\">extends<\/code>, <code class=\"wgk-javaher-inl\">super<\/code> et <code class=\"wgk-javaher-inl\">@Override<\/code>, et quand lui pr\u00e9f\u00e9rer l&rsquo;interface ou la composition.<\/p>\n<div class=\"wgk-javaher-answer\">\n<div class=\"wgk-javaher-tit\">En bref<\/div>\n<div class=\"wgk-javaher-txt\">L&rsquo;<strong>h\u00e9ritage en Java<\/strong> \u00e9tablit une relation \u00ab est un \u00bb entre une <strong>superclasse<\/strong> (classe m\u00e8re) et une <strong>sous-classe<\/strong> (classe fille), via le mot-cl\u00e9 <code class=\"wgk-javaher-inl\">extends<\/code>. La sous-classe r\u00e9cup\u00e8re attributs et m\u00e9thodes de la m\u00e8re, puis les compl\u00e8te ou les red\u00e9finit. Java n&rsquo;autorise que l&rsquo;<strong>h\u00e9ritage simple<\/strong> entre classes \u2014 pour le reste, on utilise interfaces et composition.<\/div>\n<ul>\n<li>Mot-cl\u00e9 central de l&rsquo;<strong>h\u00e9ritage java<\/strong> : <code class=\"wgk-javaher-inl\">extends<\/code>.<\/li>\n<li>Toute classe descend implicitement de <code class=\"wgk-javaher-inl\">Object<\/code>, la racine commune.<\/li>\n<li>L&rsquo;<strong>h\u00e9ritage multiple<\/strong> de classes est interdit ; les interfaces le contournent.<\/li>\n<li>Le <strong>polymorphisme<\/strong> d\u00e9coule directement de l&rsquo;h\u00e9ritage en POO.<\/li>\n<\/ul>\n<\/div>\n<div class=\"wgk-javaher-need\">\n<div class=\"wgk-javaher-cell\">\n<div class=\"wgk-javaher-k\">Mot-cl\u00e9<\/div>\n<div class=\"wgk-javaher-v\">extends (1 seule classe m\u00e8re)<\/div>\n<\/div>\n<div class=\"wgk-javaher-cell\">\n<div class=\"wgk-javaher-k\">Racine<\/div>\n<div class=\"wgk-javaher-v\">java.lang.Object<\/div>\n<\/div>\n<div class=\"wgk-javaher-cell\">\n<div class=\"wgk-javaher-k\">Red\u00e9finition<\/div>\n<div class=\"wgk-javaher-v\">@Override + super<\/div>\n<\/div>\n<div class=\"wgk-javaher-cell\">\n<div class=\"wgk-javaher-k\">Multiple<\/div>\n<div class=\"wgk-javaher-v\">via interfaces (implements)<\/div>\n<\/div>\n<\/div>\n<h2>Comprendre la relation de g\u00e9n\u00e9ralisation-sp\u00e9cialisation dans les classes Java<\/h2>\n<p>L&rsquo;architecture Java s&rsquo;appuie sur l&rsquo;\u00e9laboration de hi\u00e9rarchies de classes o\u00f9 s&rsquo;imbriquent des liens de <strong>g\u00e9n\u00e9ralisation<\/strong> et de <strong>sp\u00e9cialisation<\/strong>. \u00c0 la racine de tout objet Java, on trouve la classe <strong>Object<\/strong>, qui incarne le point de d\u00e9part commun pour chaque entit\u00e9. Sur cette base, nous cr\u00e9ons des <strong>superclasses<\/strong> (ou classes m\u00e8res), dont d\u00e9rivent des <strong>sous-classes<\/strong> (ou classes filles) : la superclasse expose des attributs et m\u00e9thodes g\u00e9n\u00e9riques, tandis que la sous-classe h\u00e9rite, compl\u00e8te ou adapte ces comportements pour r\u00e9pondre \u00e0 des besoins plus pr\u00e9cis. C&rsquo;est tout l&rsquo;enjeu de l&rsquo;<strong>h\u00e9ritage en Java<\/strong>.<\/p>\n<p>Concr\u00e8tement, pour indiquer qu&rsquo;une classe h\u00e9rite d&rsquo;une autre, on utilise le mot-cl\u00e9 <code class=\"wgk-javaher-inl\">extends<\/code> dans la d\u00e9claration de la classe fille :<\/p>\n<div class=\"wgk-javaher-code\">\n  <span class=\"wgk-javaher-cap\">Vehicule.java \u2014 superclasse g\u00e9n\u00e9rique<\/span><\/p>\n<pre><code>public class Vehicule {\n    protected String marque;\n    protected int vitesseMax;\n    public Vehicule(String marque, int vitesseMax) {\n        this.marque = marque;\n        this.vitesseMax = vitesseMax;\n    }\n    public void decrire() {\n        System.out.println(marque + \" (\" + vitesseMax + \" km\/h)\");\n    }\n}<\/code><\/pre>\n<\/div>\n<div class=\"wgk-javaher-code\">\n  <span class=\"wgk-javaher-cap\">Automobile.java \u2014 la sous-classe h\u00e9rite via extends<\/span><\/p>\n<pre><code>public class Automobile extends Vehicule {\n    private int nbPortes;\n    public Automobile(String marque, int vitesseMax, int nbPortes) {\n        super(marque, vitesseMax); \/\/ appel du constructeur parent\n        this.nbPortes = nbPortes;\n    }\n}<\/code><\/pre>\n<\/div>\n<p>Ici, la classe <strong>Vehicule<\/strong> est la superclasse dont h\u00e9ritent des classes concr\u00e8tes telles que <strong>Automobile<\/strong> ou <strong>Avion<\/strong>, chacune raffinant ou \u00e9tendant les propri\u00e9t\u00e9s g\u00e9n\u00e9riques du v\u00e9hicule.<\/p>\n<ul>\n<li>La <strong>g\u00e9n\u00e9ralisation<\/strong> d\u00e9signe le fait d&rsquo;extraire les caract\u00e9ristiques communes dans une superclasse. On observe ce principe dans le cas de la classe <strong>Vehicule<\/strong>, dont h\u00e9ritent des classes concr\u00e8tes telles que <strong>Automobile<\/strong> ou <strong>Avion<\/strong>.<\/li>\n<li>La <strong>sp\u00e9cialisation<\/strong> intervient lorsque la sous-classe pr\u00e9cise, enrichit ou red\u00e9finit une fonctionnalit\u00e9 h\u00e9rit\u00e9e. En 2021, la soci\u00e9t\u00e9 Tesla a mis en \u0153uvre une structure o\u00f9 chaque type de v\u00e9hicule autonome h\u00e9ritait d&rsquo;une classe m\u00e8re d\u00e9finissant le comportement standard, tout en red\u00e9finissant les algorithmes de navigation avanc\u00e9e pour ses mod\u00e8les haut de gamme.<\/li>\n<\/ul>\n<p>La <strong>hi\u00e9rarchie d&rsquo;h\u00e9ritage<\/strong> constitue un outil puissant pour refl\u00e9ter fid\u00e8lement les liens naturels entre concepts m\u00e9tiers, tout en \u00e9vitant la duplication de code et en favorisant la coh\u00e9rence s\u00e9mantique des mod\u00e8les objets.<\/p>\n<h2>Mettre en place un h\u00e9ritage : les \u00e9tapes cl\u00e9s<\/h2>\n<p>Au-del\u00e0 de la th\u00e9orie, \u00e9crire correctement une relation d&rsquo;<strong>h\u00e9ritage en Java<\/strong> suit toujours la m\u00eame s\u00e9quence. Voici les \u00e9tapes \u00e0 respecter pour un code propre et standard.<\/p>\n<div class=\"wgk-javaher-steps\">\n<div class=\"wgk-javaher-step\"><span class=\"wgk-javaher-num\"><\/span><span class=\"wgk-javaher-stxt\"><b>Identifier la relation \u00ab est un \u00bb.<\/b> Avant de coder, v\u00e9rifiez qu&rsquo;une <code class=\"wgk-javaher-inl\">Automobile<\/code> \u00ab est un \u00bb <code class=\"wgk-javaher-inl\">Vehicule<\/code>. Si la relation est \u00ab a un \u00bb (un train \u00ab a \u00bb un calendrier), pr\u00e9f\u00e9rez la composition.<\/span><\/div>\n<div class=\"wgk-javaher-step\"><span class=\"wgk-javaher-num\"><\/span><span class=\"wgk-javaher-stxt\"><b>D\u00e9clarer la sous-classe avec <code class=\"wgk-javaher-inl\">extends<\/code>.<\/b> Une classe ne peut \u00e9tendre qu&rsquo;une seule superclasse : <code class=\"wgk-javaher-inl\">class Automobile extends Vehicule<\/code>.<\/span><\/div>\n<div class=\"wgk-javaher-step\"><span class=\"wgk-javaher-num\"><\/span><span class=\"wgk-javaher-stxt\"><b>Appeler le constructeur parent avec <code class=\"wgk-javaher-inl\">super(...)<\/code>.<\/b> En premi\u00e8re instruction du constructeur enfant, pour initialiser les champs h\u00e9rit\u00e9s.<\/span><\/div>\n<div class=\"wgk-javaher-step\"><span class=\"wgk-javaher-num\"><\/span><span class=\"wgk-javaher-stxt\"><b>Red\u00e9finir les comportements avec <code class=\"wgk-javaher-inl\">@Override<\/code>.<\/b> Annotez chaque m\u00e9thode red\u00e9finie pour que le compilateur valide la signature.<\/span><\/div>\n<div class=\"wgk-javaher-step\"><span class=\"wgk-javaher-num\"><\/span><span class=\"wgk-javaher-stxt\"><b>R\u00e9utiliser le parent au besoin via <code class=\"wgk-javaher-inl\">super.methode()<\/code>.<\/b> Pour enrichir un comportement h\u00e9rit\u00e9 sans le r\u00e9\u00e9crire enti\u00e8rement.<\/span><\/div>\n<\/div>\n<div class=\"wgk-javaher-note\">\n  <span class=\"wgk-javaher-lbl\">Bon \u00e0 savoir<\/span><br \/>\n  <span class=\"wgk-javaher-ntxt\">L&rsquo;appel \u00e0 <code class=\"wgk-javaher-inl\">super(...)<\/code> doit \u00eatre la toute premi\u00e8re instruction du constructeur de la sous-classe ; sinon le compilateur l\u00e8ve une erreur.<\/span>\n<\/div>\n<h2>Imbrication des m\u00e9canismes : h\u00e9ritage simple, limitations et alternatives<\/h2>\n<p>Le mod\u00e8le d&rsquo;h\u00e9ritage Java se distingue par l&rsquo;usage exclusif de l&rsquo;<strong>h\u00e9ritage simple<\/strong>. Une classe Java ne peut h\u00e9riter que d&rsquo;une seule superclasse, ce qui \u00e9limine les ambigu\u00eft\u00e9s et la complexit\u00e9 li\u00e9es \u00e0 l&rsquo;<strong>h\u00e9ritage multiple<\/strong>, souvent source de conflits dans d&rsquo;autres langages (comme C++). Les \u00e9quipes de Google, confront\u00e9es \u00e0 de larges bases de code sur Android, ont tir\u00e9 parti de cette contrainte pour garantir des hi\u00e9rarchies claires et \u00e9viter des effets de bord lors des \u00e9volutions.<\/p>\n<ul>\n<li>L&rsquo;<strong>h\u00e9ritage unique<\/strong> est r\u00e9alis\u00e9 gr\u00e2ce au mot-cl\u00e9 <code class=\"wgk-javaher-inl\">extends<\/code>.<\/li>\n<li>Pour suppl\u00e9er \u00e0 l&rsquo;impossibilit\u00e9 de l&rsquo;<strong>h\u00e9ritage multiple en Java<\/strong>, le langage propose les <strong>interfaces<\/strong>. Celles-ci d\u00e9finissent des contrats (m\u00e9thodes sans impl\u00e9mentation) que les classes concr\u00e8tes r\u00e9alisent \u00e0 leur guise. Le framework Spring autorise ainsi la d\u00e9finition de comportements transversaux via des interfaces telles que <strong>Serializable<\/strong> ou <strong>Comparable<\/strong>, utilis\u00e9es dans des centaines de modules m\u00e9tiers.<\/li>\n<li>La <strong>composition<\/strong> \u00e9merge comme une alternative solide \u00e0 l&rsquo;h\u00e9ritage. Elle repose sur la relation \u00ab a un \u00bb (par opposition au \u00ab est un \u00bb de l&rsquo;h\u00e9ritage). Dans le moteur de r\u00e9servation de la SNCF, un objet <strong>Train<\/strong> \u00ab a \u00bb un <strong>Calendrier<\/strong>, mais n&rsquo;en h\u00e9rite pas, ce qui favorise la flexibilit\u00e9 et limite l&rsquo;enchev\u00eatrement des d\u00e9pendances.<\/li>\n<\/ul>\n<p>Une classe peut h\u00e9riter d&rsquo;une seule m\u00e8re, mais impl\u00e9menter plusieurs interfaces \u2014 c&rsquo;est ainsi que Java accepte plusieurs \u00ab formes \u00bb d&rsquo;h\u00e9ritage de comportement sans h\u00e9ritage multiple de classes :<\/p>\n<div class=\"wgk-javaher-code\">\n  <span class=\"wgk-javaher-cap\">Interface + h\u00e9ritage : une classe, une m\u00e8re, plusieurs contrats<\/span><\/p>\n<pre><code>public interface Roulant {\n    void rouler();\n}\npublic abstract class Vehicule {\n    public abstract void decrire();\n}\npublic class Automobile extends Vehicule implements Roulant {\n    @Override\n    public void decrire() {\n        System.out.println(\"Une automobile\");\n    }\n    @Override\n    public void rouler() {\n        System.out.println(\"L'automobile roule\");\n    }\n}<\/code><\/pre>\n<\/div>\n<div class=\"wgk-javaher-note\">\n  <span class=\"wgk-javaher-lbl\">\u00c0 retenir<\/span><br \/>\n  <span class=\"wgk-javaher-ntxt\">Une <strong>classe abstraite<\/strong> (<code class=\"wgk-javaher-inl\">abstract class<\/code>) peut contenir du code partag\u00e9 et imposer des m\u00e9thodes \u00e0 red\u00e9finir : c&rsquo;est le compl\u00e9ment naturel de l&rsquo;<strong>h\u00e9ritage en Java avec classe abstraite<\/strong>.<\/span>\n<\/div>\n<p>L&rsquo;arbitrage entre h\u00e9ritage, interface et composition s&rsquo;av\u00e8re central. Le choix judicieux entre ces m\u00e9canismes conditionne la maintenabilit\u00e9, l&rsquo;extensibilit\u00e9 et la robustesse d&rsquo;une application Java, surtout lorsque celle-ci est dimensionn\u00e9e pour une \u00e9volution continue sur plusieurs ann\u00e9es.<\/p>\n<h2>R\u00e9utilisation du code et principe ouvert\/ferm\u00e9<\/h2>\n<p>L&rsquo;h\u00e9ritage fournit un levier d&rsquo;<strong>optimisation de la maintenance<\/strong> par la r\u00e9utilisation des fonctionnalit\u00e9s d\u00e9j\u00e0 \u00e9prouv\u00e9es. Cette capacit\u00e9 aligne Java avec le principe <strong>Open\/Closed<\/strong> du r\u00e9f\u00e9rentiel SOLID : une classe doit \u00eatre ouverte \u00e0 l&rsquo;extension mais ferm\u00e9e \u00e0 la modification. Au sein du projet open source Apache POI, la cr\u00e9ation de nouvelles fonctionnalit\u00e9s de gestion de fichiers Excel s&rsquo;est faite par extension de classes existantes, \u00e9vitant de toucher au c\u0153ur du code initial, ce qui a r\u00e9duit le nombre d&rsquo;anomalies r\u00e9gressives de 37% sur deux versions majeures.<\/p>\n<ul>\n<li>L&rsquo;h\u00e9ritage permet de mutualiser des m\u00e9thodes robustes et s\u00fbres, tout en laissant aux sous-classes la libert\u00e9 d&rsquo;apporter des adaptations pr\u00e9cises.<\/li>\n<li>Le code h\u00e9rit\u00e9 demeure centralis\u00e9 dans la superclasse, ce qui limite la propagation des changements lors de corrections de bugs ou d&rsquo;am\u00e9liorations fonctionnelles.<\/li>\n<\/ul>\n<p>Ce m\u00e9canisme de r\u00e9utilisation prend une dimension strat\u00e9gique dans les grandes architectures modulaires, telles que celles d\u00e9ploy\u00e9es dans les suites logicielles SAP, o\u00f9 la stabilit\u00e9 du socle applicatif prime sur sa modification directe, et o\u00f9 l&rsquo;extension via h\u00e9ritage devient la r\u00e8gle pour chaque adaptation m\u00e9tier.<\/p>\n<h2>Red\u00e9finition des comportements : surclassement, @Override et polymorphisme<\/h2>\n<p>Le <strong>surclassement<\/strong>, ou <strong>overriding<\/strong>, autorise la sous-classe \u00e0 substituer sa propre logique \u00e0 une m\u00e9thode h\u00e9rit\u00e9e de la superclasse. Ce m\u00e9canisme est au c\u0153ur de la personnalisation comportementale \u2014 et c&rsquo;est aussi le moteur du <strong>polymorphisme en Java<\/strong>. L&rsquo;\u00e9quipe de Booking.com, pour g\u00e9rer les sp\u00e9cificit\u00e9s de calcul des tarifs selon les r\u00e9gions, a b\u00e2ti une classe <strong>Tarif<\/strong> g\u00e9n\u00e9rique, puis red\u00e9fini la m\u00e9thode <code class=\"wgk-javaher-inl\">calculerPrix()<\/code> dans chaque sous-classe r\u00e9gionale, assurant ainsi la conformit\u00e9 r\u00e9glementaire sans affecter la logique commune.<\/p>\n<div class=\"wgk-javaher-code\">\n  <span class=\"wgk-javaher-cap\">@Override + super : red\u00e9finir sans tout r\u00e9\u00e9crire<\/span><\/p>\n<pre><code>public class Avion extends Vehicule {\n    @Override\n    public void decrire() {\n        super.decrire();          \/\/ r\u00e9utilise le comportement parent\n        System.out.println(\"...et il vole\");\n    }\n}\n\/\/ Polymorphisme : la r\u00e9f\u00e9rence est m\u00e8re, l'objet est fille\nVehicule v = new Avion(\"Airbus\", 900);\nv.decrire(); \/\/ appelle la version red\u00e9finie dans Avion<\/code><\/pre>\n<\/div>\n<p>Le <strong>java h\u00e9ritage polymorphisme<\/strong> repose sur ce principe : une r\u00e9f\u00e9rence de type superclasse peut pointer vers n&rsquo;importe quelle sous-classe, et c&rsquo;est la m\u00e9thode red\u00e9finie de l&rsquo;objet r\u00e9el qui s&rsquo;ex\u00e9cute \u00e0 l&rsquo;ex\u00e9cution.<\/p>\n<ul>\n<li>L&rsquo;annotation <code class=\"wgk-javaher-inl\">@Override<\/code> permet de signaler explicitement le surclassement, renfor\u00e7ant la lisibilit\u00e9 et la s\u00e9curit\u00e9 du code.<\/li>\n<li>Ce processus favorise la sp\u00e9cialisation, chaque sous-classe affinant un comportement h\u00e9rit\u00e9 : dans l&rsquo;outil de simulation d&rsquo;assurances de Generali, les m\u00e9thodes de calcul du risque sont surclass\u00e9es selon les types de contrats, tout en capitalisant sur la structure de la classe m\u00e8re.<\/li>\n<\/ul>\n<div class=\"wgk-javaher-quote\">\n  <span class=\"wgk-javaher-mark\" aria-hidden=\"true\">\u00ab<\/span><\/p>\n<div class=\"wgk-javaher-q\">Le surclassement garantit une \u00e9volution fonctionnelle localis\u00e9e, sans rupture du cadre g\u00e9n\u00e9ral de la hi\u00e9rarchie d&rsquo;objets.<\/div>\n<\/div>\n<h2>Impacts sur la lisibilit\u00e9 et la robustesse des applications Java<\/h2>\n<p>L&rsquo;adoption de l&rsquo;h\u00e9ritage, si elle offre des avantages \u00e9vidents en termes de mutualisation, influence sensiblement la <strong>lisibilit\u00e9<\/strong> et la <strong>robustesse<\/strong> des projets Java, aspects particuli\u00e8rement critiques sur des bases de code d\u00e9passant les 100 000 lignes. Selon une analyse men\u00e9e par l&rsquo;\u00e9quipe du projet Eclipse IDE, une hi\u00e9rarchie d&rsquo;h\u00e9ritage trop profonde ou mal structur\u00e9e accro\u00eet le temps de prise en main par un facteur trois, compar\u00e9 \u00e0 une architecture plus plate et privil\u00e9giant les interfaces.<\/p>\n<div class=\"wgk-javaher-duo\">\n<div class=\"wgk-javaher-col wgk-javaher-yes\">\n<h3>\u00c0 privil\u00e9gier<\/h3>\n<ul>\n<li><span class=\"wgk-javaher-mk\">\u2713<\/span><span>Documenter chaque superclasse modifi\u00e9e<\/span><\/li>\n<li><span class=\"wgk-javaher-mk\">\u2713<\/span><span>Garder des hi\u00e9rarchies plates et lisibles<\/span><\/li>\n<li><span class=\"wgk-javaher-mk\">\u2713<\/span><span>Pr\u00e9f\u00e9rer l&rsquo;interface au-del\u00e0 de 2-3 niveaux<\/span><\/li>\n<li><span class=\"wgk-javaher-mk\">\u2713<\/span><span>Annoter syst\u00e9matiquement avec @Override<\/span><\/li>\n<\/ul><\/div>\n<div class=\"wgk-javaher-col wgk-javaher-no\">\n<h3>\u00c0 \u00e9viter<\/h3>\n<ul>\n<li><span class=\"wgk-javaher-mk\">\u2715<\/span><span>Hi\u00e9rarchies profondes et enchev\u00eatr\u00e9es<\/span><\/li>\n<li><span class=\"wgk-javaher-mk\">\u2715<\/span><span>Surutiliser l&rsquo;h\u00e9ritage l\u00e0 o\u00f9 une composition suffit<\/span><\/li>\n<li><span class=\"wgk-javaher-mk\">\u2715<\/span><span>Modifier une superclasse sans mesurer l&rsquo;impact<\/span><\/li>\n<li><span class=\"wgk-javaher-mk\">\u2715<\/span><span>Casser l&rsquo;encapsulation des champs h\u00e9rit\u00e9s<\/span><\/li>\n<\/ul><\/div>\n<\/div>\n<p>Une surutilisation de l&rsquo;h\u00e9ritage complique la d\u00e9tection des erreurs et la compr\u00e9hension des m\u00e9canismes internes \u2014 d&rsquo;o\u00f9 l&rsquo;importance de l&rsquo;<strong>encapsulation en Java<\/strong>, qui prot\u00e8ge l&rsquo;\u00e9tat interne des classes. La soci\u00e9t\u00e9 SAP a ainsi revu en 2022 la structure de certains modules CRM, passant d&rsquo;une architecture centr\u00e9e sur l&rsquo;h\u00e9ritage \u00e0 une composition renforc\u00e9e, apr\u00e8s avoir identifi\u00e9 que 23% des bugs critiques provenaient de propagations involontaires de changements dans les superclasses.<\/p>\n<h2>H\u00e9ritage et \u00e9volutivit\u00e9 : anticiper les besoins futurs de l&rsquo;application<\/h2>\n<p>La dimension \u00e9volutive d&rsquo;une application repose sur l&rsquo;\u00e9quilibre entre <strong>h\u00e9ritage<\/strong>, <strong>interfaces<\/strong> et <strong>composition<\/strong>. L&rsquo;\u00e9volution du framework Hibernate, pass\u00e9 en 2018 d&rsquo;un h\u00e9ritage syst\u00e9matique \u00e0 une approche centr\u00e9e sur les interfaces et les adaptateurs, a permis d&rsquo;int\u00e9grer rapidement de nouveaux moteurs de bases de donn\u00e9es sans r\u00e9\u00e9criture majeure du socle.<\/p>\n<div class=\"wgk-javaher-grid\">\n<div class=\"wgk-javaher-card\">\n<h3>H\u00e9ritage<\/h3>\n<div class=\"wgk-javaher-ctxt\">Ajoute des fonctionnalit\u00e9s homog\u00e8nes sur de larges familles de classes, en maintenant la coh\u00e9rence m\u00e9tier.<\/div>\n<\/div>\n<div class=\"wgk-javaher-card\">\n<h3>Interfaces<\/h3>\n<div class=\"wgk-javaher-ctxt\">Ouvrent le syst\u00e8me \u00e0 des comportements transversaux, sans figer l&rsquo;ordre hi\u00e9rarchique des classes.<\/div>\n<\/div>\n<div class=\"wgk-javaher-card\">\n<h3>Composition<\/h3>\n<div class=\"wgk-javaher-ctxt\">Autorise l&rsquo;ajout dynamique de fonctionnalit\u00e9s, comme les modules de paiement introduits chez Doctolib en 2023, sans toucher \u00e0 la structure h\u00e9rit\u00e9e des dossiers patients.<\/div>\n<\/div>\n<\/div>\n<p>Privil\u00e9gier la souplesse et la modularit\u00e9 est le garant d&rsquo;une architecture apte \u00e0 int\u00e9grer de nouveaux usages ou partenaires technologiques, sans remise en question globale du mod\u00e8le objet.<\/p>\n<h2>Origines historiques et influences sur le design Java<\/h2>\n<p>L&rsquo;\u00e9mergence du concept d&rsquo;<strong>h\u00e9ritage<\/strong> trouve ses racines dans les premiers travaux avec Simula 67, o\u00f9 l&rsquo;id\u00e9e de r\u00e9pliquer des comportements \u00e0 partir de mod\u00e8les g\u00e9n\u00e9riques a vu le jour. Smalltalk a ensuite amplifi\u00e9 la port\u00e9e de l&rsquo;<strong>h\u00e9ritage en POO<\/strong>, jetant les bases d&rsquo;un paradigme centr\u00e9 sur la transmission et la red\u00e9finition des comportements. Adoptant ces fondements, Java a opt\u00e9 pour une approche pragmatique : h\u00e9ritage simple et interfaces, r\u00e9pondant aux besoins de clart\u00e9 et de robustesse des grands syst\u00e8mes industriels.<\/p>\n<ul>\n<li>Simula 67 a introduit la notion d&rsquo;<strong>objet<\/strong> et de <strong>classe<\/strong>, amor\u00e7ant le mouvement vers le d\u00e9veloppement modulaire.<\/li>\n<li>Smalltalk a g\u00e9n\u00e9ralis\u00e9 l&rsquo;h\u00e9ritage et l&rsquo;a impos\u00e9 comme l&rsquo;un des piliers de la conception objet.<\/li>\n<li>Le langage Java, con\u00e7u pour r\u00e9sister aux \u00e9volutions chaotiques et garantir la r\u00e9trocompatibilit\u00e9, a tir\u00e9 parti de ces exp\u00e9riences pour imposer un h\u00e9ritage simple, tout en ouvrant la porte \u00e0 la diversit\u00e9 comportementale par les interfaces et la composition.<\/li>\n<\/ul>\n<p>L&rsquo;<strong>h\u00e9ritage en Java<\/strong> n&rsquo;est donc pas le fruit du hasard, mais la synth\u00e8se de d\u00e9cennies d&rsquo;exp\u00e9rimentation et d&rsquo;analyse sur la mani\u00e8re de structurer des syst\u00e8mes \u00e9volutifs, fiables et adapt\u00e9s aux exigences de l&rsquo;industrie logicielle contemporaine.<\/p>\n<div class=\"wgk-javaher-retain\">\n<div class=\"wgk-javaher-tit\">\u00c0 retenir<\/div>\n<ul>\n<li><span class=\"wgk-javaher-dot\">1<\/span><span>Le mot-cl\u00e9 <strong>extends<\/strong> \u00e9tablit l&rsquo;h\u00e9ritage ; une classe n&rsquo;a qu&rsquo;une seule superclasse.<\/span><\/li>\n<li><span class=\"wgk-javaher-dot\">2<\/span><span>L&rsquo;<strong>h\u00e9ritage multiple<\/strong> de classes est interdit en Java ; on le contourne via les interfaces.<\/span><\/li>\n<li><span class=\"wgk-javaher-dot\">3<\/span><span><strong>super<\/strong> appelle le constructeur ou une m\u00e9thode du parent ; <strong>@Override<\/strong> s\u00e9curise la red\u00e9finition.<\/span><\/li>\n<li><span class=\"wgk-javaher-dot\">4<\/span><span>Le <strong>polymorphisme<\/strong> permet de manipuler les sous-classes via une r\u00e9f\u00e9rence de type m\u00e8re.<\/span><\/li>\n<li><span class=\"wgk-javaher-dot\">5<\/span><span>Privil\u00e9giez la <strong>composition<\/strong> et des hi\u00e9rarchies plates pour pr\u00e9server lisibilit\u00e9 et robustesse.<\/span><\/li>\n<\/ul>\n<\/div>\n<div class=\"wgk-javaher-faq\">\n<h2>Questions fr\u00e9quentes<\/h2>\n<div class=\"wgk-javaher-acc\">\n<details>\n<summary><span>C&rsquo;est quoi l&rsquo;h\u00e9ritage en Java ?<\/span><span class=\"wgk-javaher-plus\">+<\/span><\/summary>\n<div class=\"wgk-javaher-ans\">L&rsquo;h\u00e9ritage est un m\u00e9canisme de la programmation orient\u00e9e objet par lequel une classe (la sous-classe ou classe fille) r\u00e9utilise les attributs et m\u00e9thodes d&rsquo;une autre classe (la superclasse ou classe m\u00e8re). Il mod\u00e9lise une relation \u00ab est un \u00bb et se d\u00e9clare avec le mot-cl\u00e9 <code>extends<\/code>.<\/div>\n<\/details>\n<details>\n<summary><span>Comment faire l&rsquo;h\u00e9ritage en Java ?<\/span><span class=\"wgk-javaher-plus\">+<\/span><\/summary>\n<div class=\"wgk-javaher-ans\">On d\u00e9clare la classe fille avec <code>class Fille extends Mere<\/code>, puis on appelle le constructeur parent avec <code>super(...)<\/code> en premi\u00e8re instruction du constructeur, et on red\u00e9finit les m\u00e9thodes h\u00e9rit\u00e9es en les annotant avec <code>@Override<\/code>.<\/div>\n<\/details>\n<details>\n<summary><span>Comment indiquer qu&rsquo;une classe h\u00e9rite d&rsquo;une autre ?<\/span><span class=\"wgk-javaher-plus\">+<\/span><\/summary>\n<div class=\"wgk-javaher-ans\">En ajoutant <code>extends NomSuperclasse<\/code> dans la d\u00e9claration de la classe. Par exemple <code>public class Automobile extends Vehicule<\/code> indique qu&rsquo;Automobile h\u00e9rite de Vehicule.<\/div>\n<\/details>\n<details>\n<summary><span>Pourquoi l&rsquo;h\u00e9ritage multiple est-il interdit en Java ?<\/span><span class=\"wgk-javaher-plus\">+<\/span><\/summary>\n<div class=\"wgk-javaher-ans\">Pour \u00e9viter les ambigu\u00eft\u00e9s et conflits (le \u00ab probl\u00e8me du diamant \u00bb) qui surviennent quand une classe h\u00e9rite de deux m\u00e8res d\u00e9finissant la m\u00eame m\u00e9thode. Java limite donc \u00e0 une seule superclasse, et permet \u00e0 la place d&rsquo;impl\u00e9menter plusieurs interfaces avec <code>implements<\/code>.<\/div>\n<\/details>\n<details>\n<summary><span>Quelles formes d&rsquo;h\u00e9ritage sont accept\u00e9es en Java ?<\/span><span class=\"wgk-javaher-plus\">+<\/span><\/summary>\n<div class=\"wgk-javaher-ans\">Java accepte l&rsquo;h\u00e9ritage simple entre classes (une m\u00e8re via <code>extends<\/code>), l&rsquo;h\u00e9ritage multiple d&rsquo;interfaces (plusieurs contrats via <code>implements<\/code>), ainsi que l&rsquo;h\u00e9ritage depuis une classe abstraite. L&rsquo;h\u00e9ritage multiple de classes concr\u00e8tes n&rsquo;est, lui, pas autoris\u00e9.<\/div>\n<\/details>\n<details>\n<summary><span>C&rsquo;est quoi le polymorphisme en Java ?<\/span><span class=\"wgk-javaher-plus\">+<\/span><\/summary>\n<div class=\"wgk-javaher-ans\">Le polymorphisme permet de manipuler un objet d&rsquo;une sous-classe via une r\u00e9f\u00e9rence de sa superclasse : la m\u00e9thode r\u00e9ellement ex\u00e9cut\u00e9e est celle red\u00e9finie dans l&rsquo;objet concret. Il d\u00e9coule directement de l&rsquo;h\u00e9ritage et de la red\u00e9finition (<code>@Override<\/code>) des m\u00e9thodes.<\/div>\n<\/details><\/div>\n<\/div>\n<\/div>\n<hr>\n<div class=\"articles-lies\">\n<h3>\u00c0 lire aussi<\/h3>\n<ul>\n<li><a href=\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/le-secret-des-pros-du-sql-maitrisez-le-delete-cascade-pour-une-gestion-de-donnees-sans-faille\/\">Le secret des pros du SQL: Ma\u00eetrisez le DELETE CASCADE pour une gestion de donn\u00e9es sans faille<\/a><\/li>\n<li><a href=\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/dns-local-demystifie-comment-optimiser-votre-reseau-et-le-rendre-impenetrable\/\">DNS Local D\u00e9mystifi\u00e9 : Comment Optimiser votre R\u00e9seau et le Rendre Imp\u00e9n\u00e9trable<\/a><\/li>\n<li><a href=\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decouvrez-le-secret-cache-de-votre-reseau-le-dns-local-un-pilier-invisible-qui-booste-vos-performances\/\">D\u00e9couvrez le secret cach\u00e9 de votre r\u00e9seau : le DNS local, un pilier invisible qui booste vos performances<\/a><\/li>\n<li><a href=\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/deployer-une-progressive-web-app-sur-ios-opportunites-limitations-et-bonnes-pratiques\/\">D\u00e9ployer une Progressive Web App sur iOS : Opportunit\u00e9s, Limitations et Bonnes Pratiques<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":34,"featured_media":8834,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"manual_indexmenow":false,"indexmenow_id_project":0,"footnotes":""},"categories":[4523],"tags":[4974,4972,4973],"class_list":["post-8810","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-et-gadgets","tag-conception-logicielle","tag-heritage-java","tag-programmation-objet","generate-columns","tablet-grid-50","mobile-grid-100","grid-parent","grid-25"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.3 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>D\u00e9coder l&#039;h\u00e9ritage en Java<\/title>\n<meta name=\"description\" content=\"D\u00e9coder l&#039;h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e. Tech et gadgets d\u00e9crypt\u00e9s sur WorldGeek.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"D\u00e9coder l&#039;h\u00e9ritage en Java\" \/>\n<meta property=\"og:description\" content=\"D\u00e9coder l&#039;h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e. Tech et gadgets d\u00e9crypt\u00e9s sur WorldGeek.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/\" \/>\n<meta property=\"og:site_name\" content=\"worldgeek\" \/>\n<meta property=\"og:image\" content=\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hugo Lambrecht\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/\"},\"author\":{\"name\":\"Hugo Lambrecht\",\"@id\":\"https:\/\/worldgeek.fr\/blog\/#\/schema\/person\/3c864cdc320801e3db34b663e7e3f816\"},\"headline\":\"D\u00e9coder l&rsquo;h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e\",\"datePublished\":\"2026-06-16T17:53:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/\"},\"wordCount\":2606,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png\",\"keywords\":[\"conception logicielle\",\"heritage java\",\"programmation objet\"],\"articleSection\":[\"Tech et Gadgets\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/\",\"url\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/\",\"name\":\"D\u00e9coder l'h\u00e9ritage en Java\",\"isPartOf\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png\",\"datePublished\":\"2026-06-16T17:53:06+00:00\",\"description\":\"D\u00e9coder l'h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e. Tech et gadgets d\u00e9crypt\u00e9s sur WorldGeek.\",\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#primaryimage\",\"url\":\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png\",\"contentUrl\":\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png\",\"width\":1200,\"height\":500},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/worldgeek.fr\/blog\/#website\",\"url\":\"https:\/\/worldgeek.fr\/blog\/\",\"name\":\"WorldGeek\",\"description\":\"Votre aventure geek commence ici.\",\"publisher\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/#organization\"},\"alternateName\":\"Votre aventure geek commence ici.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/worldgeek.fr\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Organization\",\"NewsMediaOrganization\"],\"@id\":\"https:\/\/worldgeek.fr\/blog\/#organization\",\"name\":\"WorldGeek\",\"alternateName\":\"WorldGeek \u2014 Le m\u00e9dia de la culture geek\",\"url\":\"https:\/\/worldgeek.fr\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/worldgeek.fr\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2026\/07\/logo-auto.png\",\"contentUrl\":\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2026\/07\/logo-auto.png\",\"width\":1024,\"height\":1024,\"caption\":\"WorldGeek\"},\"image\":{\"@id\":\"https:\/\/worldgeek.fr\/blog\/#\/schema\/logo\/image\/\"},\"publishingPrinciples\":\"https:\/\/worldgeek.fr\/blog\/charte-editoriale\/\",\"ethicsPolicy\":\"https:\/\/worldgeek.fr\/blog\/charte-editoriale\/\",\"actionableFeedbackPolicy\":\"https:\/\/worldgeek.fr\/blog\/contact\/\",\"foundingDate\":\"2025-01-01\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/worldgeek.fr\/blog\/#\/schema\/person\/3c864cdc320801e3db34b663e7e3f816\",\"name\":\"Hugo Lambrecht\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/worldgeek.fr\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2026\/01\/cropped-cropped-Hugo-L-2-1-96x96.jpg\",\"contentUrl\":\"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2026\/01\/cropped-cropped-Hugo-L-2-1-96x96.jpg\",\"caption\":\"Hugo Lambrecht\"},\"description\":\"Hugo L. est r\u00e9dacteur sp\u00e9cialis\u00e9 en informatique et technologies. Il analyse en profondeur le mat\u00e9riel, les logiciels et les derni\u00e8res innovations, en fournissant des informations fiables et accessibles. Son objectif est d\u2019aider ses lecteurs \u00e0 comprendre les enjeux de la high-tech et \u00e0 mesurer concr\u00e8tement l\u2019impact de ces technologies dans leur vie quotidienne.\",\"sameAs\":[\"https:\/\/hugolambrecht.fr\/\"],\"url\":\"https:\/\/worldgeek.fr\/blog\/auteur\/noname\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"D\u00e9coder l'h\u00e9ritage en Java","description":"D\u00e9coder l'h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e. Tech et gadgets d\u00e9crypt\u00e9s sur WorldGeek.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/","og_locale":"fr_FR","og_type":"article","og_title":"D\u00e9coder l'h\u00e9ritage en Java","og_description":"D\u00e9coder l'h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e. Tech et gadgets d\u00e9crypt\u00e9s sur WorldGeek.","og_url":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/","og_site_name":"worldgeek","og_image":[{"width":1200,"height":500,"url":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png","type":"image\/png"}],"author":"Hugo Lambrecht","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#article","isPartOf":{"@id":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/"},"author":{"name":"Hugo Lambrecht","@id":"https:\/\/worldgeek.fr\/blog\/#\/schema\/person\/3c864cdc320801e3db34b663e7e3f816"},"headline":"D\u00e9coder l&rsquo;h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e","datePublished":"2026-06-16T17:53:06+00:00","mainEntityOfPage":{"@id":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/"},"wordCount":2606,"commentCount":0,"publisher":{"@id":"https:\/\/worldgeek.fr\/blog\/#organization"},"image":{"@id":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#primaryimage"},"thumbnailUrl":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png","keywords":["conception logicielle","heritage java","programmation objet"],"articleSection":["Tech et Gadgets"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/","url":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/","name":"D\u00e9coder l'h\u00e9ritage en Java","isPartOf":{"@id":"https:\/\/worldgeek.fr\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#primaryimage"},"image":{"@id":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#primaryimage"},"thumbnailUrl":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png","datePublished":"2026-06-16T17:53:06+00:00","description":"D\u00e9coder l'h\u00e9ritage en Java : D\u00e9couvrez les strat\u00e9gies secr\u00e8tes pour une conception de code optimis\u00e9e. Tech et gadgets d\u00e9crypt\u00e9s sur WorldGeek.","inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/worldgeek.fr\/blog\/tech-et-gadgets\/decoder-lheritage-en-java-decouvrez-les-strategies-secretes-pour-une-conception-de-code-optimisee\/#primaryimage","url":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png","contentUrl":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2025\/07\/sdxl-486ba557e16ff01294734adbedafa916-scaled.png","width":1200,"height":500},{"@type":"WebSite","@id":"https:\/\/worldgeek.fr\/blog\/#website","url":"https:\/\/worldgeek.fr\/blog\/","name":"WorldGeek","description":"Votre aventure geek commence ici.","publisher":{"@id":"https:\/\/worldgeek.fr\/blog\/#organization"},"alternateName":"Votre aventure geek commence ici.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/worldgeek.fr\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Organization","NewsMediaOrganization"],"@id":"https:\/\/worldgeek.fr\/blog\/#organization","name":"WorldGeek","alternateName":"WorldGeek \u2014 Le m\u00e9dia de la culture geek","url":"https:\/\/worldgeek.fr\/blog\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/worldgeek.fr\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2026\/07\/logo-auto.png","contentUrl":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2026\/07\/logo-auto.png","width":1024,"height":1024,"caption":"WorldGeek"},"image":{"@id":"https:\/\/worldgeek.fr\/blog\/#\/schema\/logo\/image\/"},"publishingPrinciples":"https:\/\/worldgeek.fr\/blog\/charte-editoriale\/","ethicsPolicy":"https:\/\/worldgeek.fr\/blog\/charte-editoriale\/","actionableFeedbackPolicy":"https:\/\/worldgeek.fr\/blog\/contact\/","foundingDate":"2025-01-01"},{"@type":"Person","@id":"https:\/\/worldgeek.fr\/blog\/#\/schema\/person\/3c864cdc320801e3db34b663e7e3f816","name":"Hugo Lambrecht","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/worldgeek.fr\/blog\/#\/schema\/person\/image\/","url":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2026\/01\/cropped-cropped-Hugo-L-2-1-96x96.jpg","contentUrl":"https:\/\/worldgeek.fr\/blog\/wp-content\/uploads\/2026\/01\/cropped-cropped-Hugo-L-2-1-96x96.jpg","caption":"Hugo Lambrecht"},"description":"Hugo L. est r\u00e9dacteur sp\u00e9cialis\u00e9 en informatique et technologies. Il analyse en profondeur le mat\u00e9riel, les logiciels et les derni\u00e8res innovations, en fournissant des informations fiables et accessibles. Son objectif est d\u2019aider ses lecteurs \u00e0 comprendre les enjeux de la high-tech et \u00e0 mesurer concr\u00e8tement l\u2019impact de ces technologies dans leur vie quotidienne.","sameAs":["https:\/\/hugolambrecht.fr\/"],"url":"https:\/\/worldgeek.fr\/blog\/auteur\/noname\/"}]}},"_links":{"self":[{"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/posts\/8810","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/comments?post=8810"}],"version-history":[{"count":2,"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/posts\/8810\/revisions"}],"predecessor-version":[{"id":9594,"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/posts\/8810\/revisions\/9594"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/media\/8834"}],"wp:attachment":[{"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/media?parent=8810"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/categories?post=8810"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/worldgeek.fr\/blog\/wp-json\/wp\/v2\/tags?post=8810"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}