{"id":584,"date":"2025-01-21T23:26:45","date_gmt":"2025-01-21T22:26:45","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=584"},"modified":"2025-02-28T23:28:04","modified_gmt":"2025-02-28T22:28:04","slug":"das-instanceof-keyword-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=584","title":{"rendered":"Das instanceof-Keyword in Java"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p>Das <code>instanceof<\/code>-Keyword ist ein wesentliches Werkzeug in Java zur \u00dcberpr\u00fcfung von Objekttypen zur Laufzeit. Es erm\u00f6glicht, festzustellen, ob ein bestimmtes Objekt eine Instanz einer bestimmten Klasse oder eines Interfaces ist. Trotz seiner Einfachheit gibt es einige Fallstricke im Umgang damit. Zudem gab es in neueren Java-Versionen Verbesserungen, die den Umgang mit Typpr\u00fcfungen erleichtern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funktion von <code>instanceof<\/code><\/h2>\n\n\n\n<p>Die Grundfunktion von <code>instanceof<\/code> besteht darin, zu \u00fcberpr\u00fcfen, ob ein Objekt von einem bestimmten Typ ist oder eine gegebene Klasse oder ein Interface in seiner Vererbungshierarchie hat. Die allgemeine Syntax lautet:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (obj <span class=\"hljs-keyword\">instanceof<\/span> Klasse) {\n    <span class=\"hljs-comment\">\/\/ Verarbeitung, falls Bedingung zutrifft<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Tier<\/span> <\/span>{}\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Hund<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Tier<\/span> <\/span>{}\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        Tier tier = <span class=\"hljs-keyword\">new<\/span> Hund();\n        \n        <span class=\"hljs-keyword\">if<\/span> (tier <span class=\"hljs-keyword\">instanceof<\/span> Hund) {\n            System.out.println(<span class=\"hljs-string\">\"Das Objekt ist ein Hund.\"<\/span>);\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel ist <code>tier<\/code> eine Instanz von <code>Hund<\/code>, also gibt die Bedingung <code>true<\/code> zur\u00fcck.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00f6gliche Fehler und Fallstricke<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. <code>null<\/code> als Operand<\/h3>\n\n\n\n<p>Ein h\u00e4ufiger Fehler ist die Annahme, dass <code>instanceof<\/code> bei <code>null<\/code> eine Ausnahme werfen k\u00f6nnte. Tats\u00e4chlich gibt der Ausdruck <code>obj instanceof Klasse<\/code> <code>false<\/code> zur\u00fcck, wenn <code>obj<\/code> <code>null<\/code> ist.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Object<\/span> obj = <span class=\"hljs-literal\">null<\/span>;\nSystem.out.println(obj <span class=\"hljs-keyword\">instanceof<\/span> <span class=\"hljs-built_in\">String<\/span>); <span class=\"hljs-comment\">\/\/ Gibt false zur\u00fcck<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2. Redundante Typpr\u00fcfungen<\/h3>\n\n\n\n<p>In vielen F\u00e4llen ist eine explizite <code>instanceof<\/code>-Pr\u00fcfung \u00fcberfl\u00fcssig, da Java durch Polymorphie den korrekten Methodenaufruf ausw\u00e4hlt. Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Tier<\/span> <\/span>{\n    <span class=\"hljs-keyword\">void<\/span> lautGeben() { System.out.println(<span class=\"hljs-string\">\"Unbekanntes Ger\u00e4usch\"<\/span>); }\n}\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Hund<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Tier<\/span> <\/span>{\n    <span class=\"hljs-keyword\">void<\/span> lautGeben() { System.out.println(<span class=\"hljs-string\">\"Wuff!\"<\/span>); }\n}\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        Tier tier = <span class=\"hljs-keyword\">new<\/span> Hund();\n        tier.lautGeben(); <span class=\"hljs-comment\">\/\/ Gibt \"Wuff!\" aus<\/span>\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier wird die Methode <code>lautGeben()<\/code> der Klasse <code>Hund<\/code> aufgerufen, ohne dass eine explizite <code>instanceof<\/code>-Pr\u00fcfung erforderlich ist.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Alternative zu <code>instanceof<\/code> und Casting<\/h3>\n\n\n\n<p>Oft wird <code>instanceof<\/code> in Kombination mit Casting verwendet:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (obj <span class=\"hljs-keyword\">instanceof<\/span> Hund) {\n    Hund hund = (Hund) obj;\n    hund.bellen();\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Seit Java 16 gibt es die <strong>Pattern Matching for instanceof<\/strong>-Funktion, die das Casting in die Bedingung integriert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (obj <span class=\"hljs-keyword\">instanceof<\/span> Hund hund) {\n    hund.bellen(); <span class=\"hljs-comment\">\/\/ Kein explizites Casting erforderlich<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dies reduziert die Fehleranf\u00e4lligkeit und verbessert die Lesbarkeit.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>instanceof<\/code> vs. <code>Class.isAssignableFrom()<\/code><\/h2>\n\n\n\n<p>Eine Alternative zu <code>instanceof<\/code> ist <code>Class.isAssignableFrom(Class&lt;?&gt;)<\/code>. Diese Methode wird h\u00e4ufig f\u00fcr generischen Code oder Reflection verwendet.<\/p>\n\n\n\n<p>Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (Hund.class.isAssignableFrom(Tier.class)) {\n    System.out.println(<span class=\"hljs-string\">\"Ein Tier kann ein Hund sein.\"<\/span>);\n} <span class=\"hljs-keyword\">else<\/span> {\n    System.out.println(<span class=\"hljs-string\">\"Ein Tier ist kein Hund.\"<\/span>);\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Unterschiede:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>instanceof<\/code> pr\u00fcft, ob ein <strong>konkretes Objekt<\/strong> eine Instanz eines bestimmten Typs ist.<\/li>\n\n\n\n<li><code>Class.isAssignableFrom()<\/code> pr\u00fcft, ob eine <strong>Klasse von einer anderen Klasse abgeleitet<\/strong> ist.<\/li>\n<\/ul>\n\n\n\n<p>Das bedeutet, dass <code>isAssignableFrom()<\/code> ohne ein Objekt auskommt und stattdessen mit Klassentypen arbeitet.<\/p>\n\n\n\n<p>Vorsicht: die Reihenfolge der Typen bzw. Klassen bei <code>instanceof<\/code> und <code>isAssignableFrom()<\/code> ist genau gegenteilig!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Neuerungen in Java<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Pattern Matching f\u00fcr <code>instanceof<\/code> (Java 16)<\/h3>\n\n\n\n<p>Wie bereits erw\u00e4hnt, erlaubt Java 16 eine kompaktere Schreibweise f\u00fcr <code>instanceof<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (obj <span class=\"hljs-keyword\">instanceof<\/span> <span class=\"hljs-built_in\">String<\/span> s) {\n    System.out.println(s.toUpperCase());\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Das reduziert das manuelle Casting und macht den Code sicherer und lesbarer.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sealed Classes (Java 17)<\/h3>\n\n\n\n<p>Java 17 f\u00fchrte <strong>Sealed Classes<\/strong> ein, die die <code>instanceof<\/code>-Pr\u00fcfungen optimieren k\u00f6nnen. Sealed Classes erlauben eine begrenzte Vererbung, wodurch der Compiler <code>instanceof<\/code>-Checks besser validieren kann.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sealed <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Tier<\/span> <span class=\"hljs-title\">permits<\/span> <span class=\"hljs-title\">Hund<\/span>, <span class=\"hljs-title\">Katze<\/span> <\/span>{}\n<span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Hund<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Tier<\/span> <\/span>{}\n<span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Katze<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Tier<\/span> <\/span>{}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dadurch kann der Compiler sicherstellen, dass alle m\u00f6glichen Typen bei <code>instanceof<\/code>-Pr\u00fcfungen ber\u00fccksichtigt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Das <code>instanceof<\/code>-Keyword ist ein n\u00fctzliches Werkzeug zur Typpr\u00fcfung in Java. Mit den Verbesserungen in neueren Java-Versionen, insbesondere Pattern Matching, ist es effizienter und sicherer geworden. Dennoch sollte <code>instanceof<\/code> sparsam eingesetzt werden, um Polymorphie und eine saubere Architektur zu erhalten. <code>Class.isAssignableFrom()<\/code> bietet eine Alternative f\u00fcr reflektierende Typ\u00fcberpr\u00fcfungen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung Das instanceof-Keyword ist ein wesentliches Werkzeug in Java zur \u00dcberpr\u00fcfung von Objekttypen zur Laufzeit. Es erm\u00f6glicht, festzustellen, ob ein bestimmtes Objekt eine Instanz einer bestimmten Klasse oder eines Interfaces ist. Trotz seiner Einfachheit gibt es einige Fallstricke im Umgang damit. Zudem gab es in neueren Java-Versionen Verbesserungen, die den Umgang mit Typpr\u00fcfungen erleichtern. Funktion [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-584","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=584"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/584\/revisions"}],"predecessor-version":[{"id":585,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/584\/revisions\/585"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}