instanceof

Status
Nicht offen für weitere Antworten.

kostonstyle

Aktives Mitglied
hallo
warum der Variable param ein Instanz von die Klasse Comparable? Weil in der Klasse Textpassage die Schnittstelle Comparable implementiert wurde?
Code:
/*
 * Palindromtest.java - Mehrere Schnittstellen implementieren
 *
 */
package pkg;

import java.util.Scanner;
import java.io.Console;

interface Umkehrbar<T>   {
   // erzeugt eine umgekehrte Kopie des Objekts und liefert diese zur�ck
   T umkehren();
}


class Textpassage implements Umkehrbar<Textpassage>, Comparable<Textpassage> {
   public String text;
 
   public Textpassage(String s)  {
      text = s;
   }
 
   public Textpassage umkehren()  {
 
      char[] tmp = new char[text.length()];
 
      // String umkehren
      for (int i = 0; i < text.length(); ++i)  {
         tmp[i] = text.charAt(text.length()-i-1);
      }
 
      // umgekehrte Textpassage zur�ckliefern
      return new Textpassage(new String(tmp));
   }

   public int compareTo(Textpassage obj)  {
     return text.compareTo(obj.text);
   }
}


class Palindrom {

   static boolean palindrom(Umkehrbar<?> param) {
      Comparable<Object> obj1 = null, obj2 = null;

      if (param instanceof Comparable) {
         obj1 = (Comparable) param;
         obj2 = (Comparable) param.umkehren();
      } else { 
         System.console().printf(" palindrom()-Argument konnte nicht "
                          + "in Comparable-Typ umgewandelt werden.\n");
         System.exit(0);
      }

      if( obj1.compareTo(obj2) == 0) 
         return true;
      else 
         return false;
   }
}

class PalindromTest {

   public static void main(String[] args) {
      /*Console cons = System.console();
      cons.printf("\n");
     
      // Zu pr�fenden Text einlesen     
      cons.printf(" Geben Sie einen einzeiligen Text ein: ");
      Scanner sc = new Scanner(cons.reader());
      String text = sc.nextLine();

      cons.printf("\n");*/
      String text = "hallo";

      Textpassage t = new Textpassage(new String(text));

      if (Palindrom.palindrom(t) == true)
         System.out.println(" %s ist ein Palindrom! \n" + t.text);
      else 
         System.out.println(" %s ist kein Palindrom! \n" + t.text);

      System.out.println("\n");
   }
}
danke kostonstyle
 

hdi

Top Contributor
Ein Objekt vom Typ X ist immer instanceof:

1) Object
2) X
3) Superklassen von X
4) von X implementierten Interfaces
5) indirekt implementierten Interfaces (von Superklassen implementiert)

Es gibt 2 kleine Spezialfälle:

1) null instanceof [irgendetwas] ist immer FALSE
2) Arrays sind nur instanceof Object
 

Illuvatar

Top Contributor
2) Arrays sind nur instanceof Object
Leider falsch - hast du dein Buch mal wieder missverstanden? :)
Java:
public class Test {
  public static void main(String[] args) {
    int[][] i = new int[][]{
      {3,4,5},
      {6,7,8}
    };
    System.out.println(i instanceof int[][]);
    System.out.println(i instanceof Object[]);
    System.out.println(i instanceof Object);
  }
}
Ausgabe: true true true
 

hdi

Top Contributor
Ich schmeiss das Buch weg, ehrlich -.- Das macht ja keinen Spass so, ich brauch gar nicht mehr weiterlesen weil es ist alles viel zu ungenau und unvollständig. Das Buch bringt einen dazu, zu denken, man kann es, obwohl man es nicht kann. Was schlimmeres gibt's ja wohl nicht. Sie werfen mal irgendwo ne Info rein, und du gehst davon aus dass es zu dem Thema nicht mehr zu sagen gibt. Aber mit was soll ich sonst auf das Exam lernen? Ist die JLS genauer? Das ist ja eig. kein Buch. Aber wenn die das dort alles genauer und vollständig aufführen, dann wechsel ich jetzt direkt zur JLS...
 

Illuvatar

Top Contributor
Genau ist es sicher, aber lesen würde ich das nicht unbedingt wollen...
Vielleicht hat ja jemand einen Tip für dich, der das SCJP schonmal gemacht hat.
 

ModellbahnerTT

Bekanntes Mitglied
Ich schmeiss das Buch weg, ehrlich -.- Das macht ja keinen Spass so, ich brauch gar nicht mehr weiterlesen weil es ist alles viel zu ungenau und unvollständig. Das Buch bringt einen dazu, zu denken, man kann es, obwohl man es nicht kann. Was schlimmeres gibt's ja wohl nicht. Sie werfen mal irgendwo ne Info rein, und du gehst davon aus dass es zu dem Thema nicht mehr zu sagen gibt. Aber mit was soll ich sonst auf das Exam lernen? Ist die JLS genauer? Das ist ja eig. kein Buch. Aber wenn die das dort alles genauer und vollständig aufführen, dann wechsel ich jetzt direkt zur JLS...
Vielleicht ist das Buch auch einfach nur eher für Leute geeignet, die schon ein bisschen Erfahrung in Java haben. So ganz von Null den SCJP machen zu können ist ja auch nicht der Sinn der Sache?
 

hdi

Top Contributor
So ganz von Null den SCJP machen zu können ist ja auch nicht der Sinn der Sache?
Ne, aber so ganz von null ist das auch nicht ;) Die SCJP prüft ja nicht, ob du programmieren kannst. Sie prüft theoretische Dinge die niemals so auftreten werden. Coden kann ich in Java ja inzwischen recht gut würd ich sagen. Aber das bringt einem in max. 10% der Fragen des SCJP was. Der Rest ist eben Spezifikation, und sowas lernst du auch nicht nach 10 Jahren praxisbezogenes Programmieren. Ist ja nicht so dass ich Dinge wie Vererbung lernen muss ;) Aber zB sowas wie "wann sind Wrapper-Objekte == true", das kannste mir nicht erzählen dass du das einfach so rausfindest im Laufe deiner Programmier-Karriere. Das musst du gelesen haben, sonst weisst du es einfach nicht.
 
M

maki

Gast
Vielleicht ist das Buch auch einfach nur Müll, soll es ja geben, speziell bei dieser Art von Büchern.
Um welches Buch handelt es sich den genau hdi?
 

hdi

Top Contributor
maki es handelt sich um dieses Buch:

SCJP Sun Certified Programmer for Java 6 Study Guide (Exam 310-055): Exam 310-065: Katherine Sierra, Bert Bates: Amazon.de: Englische Bücher

die 3 Rezensionen scheinen ja gut zu sein, aber wie gesagt wenn du es einfach nur liest denkst du dir dauernd "aha aha ok ok cool check ich" aber in Wahrheit fehlt die Hälfte einfach. Das kannste natürlich nicht wissen. Man muss auch unterscheiden: Bereitet einen das Buch auf die SCJP vor, oder lehrt es dich alles über Java. Ersteres mag ja zutreffen, aber eig. ist es ja nicht mein Ziel die SCJP zu schaffen (als Mittel zum Zweck), sondern Java zu verinnerlichen.
 
Zuletzt bearbeitet:
M

maki

Gast
Meinst du die Box auf Seite 297?

Remember that arrays are objects, even if the array is an array of
primitives. Watch for questions that look something like this:
int [] nums = new int[3];
if (nums instanceof Object) { } // result is true
An array is always an instance of Object. Any array.
 

hdi

Top Contributor
Genau, und mehr wird zu instanceof mit Arrays nicht gesagt. Kein Wort. Ich finde es nicht vollständig dass sie nicht darauf aufmerksam machen, dass instanceof int[] eine gültige Syntax ist. Das ist ja nicht selbstverständlich, immerhin ist das ein spezielles Sprachkonstrukt. Und lauter so Dinge.. Sie sagen halt nicht wirklich was falsches, aber sie sagen nur einen Teil, und man denkt that's it. Und dann versteht man das halt alles falsch... Das nervt mich grad so an dem Buch, dass sie scheinbar beliebig Infos reinklatschen ohne das thema dann vollständig zu bearbeiten.

Hast du auch die nächste Seite da? Dann schau dir mal die grosse Tabelle an, wo sie auflisten von was ein Objekt alles instanceof ist.

Bei Foo[] steht nur da: Object. Kein Wort von Foo[], und das finde ich halt dann SEHR irritierend, denn die Tabelle listet alle wahren instanceof-Typen davon auf. Und es steht eben NUR Object da.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Anscheinend muss man sich da auf die Closed world assumption - Wikipedia, the free encyclopedia stützen.... Es wirkt zwar "unvollständig", aber aus der Aussage "An array is always an instance of Object." kann man einfach nicht die Aussage "Arrays sind nur instanceof Object" ableiten... Vielleicht hängt das auch damit zusammen, dass ... naja, ich vermute(!) mal ganz unfundiert, oder nur aufgrund der <zynisch>praxisnähe</zynisch> der Fragen, die ich bisher so im Zusammenhang mit SCJP gelesen habe, dass es den meisten, die diese Prüfung ablegen, weniger darum geht, ewas über Java zu lernen, als vielmehr darum, einen Wisch zu haben, den sie potentiellen Arbeitgebern während der Gehaltsverhandlung unter die Nase halten können...:rolleyes:
 

hdi

Top Contributor
Also mir geht es eben nicht darum, einen Wisch zu haben. Ich will's können. Und:

Es wirkt zwar "unvollständig", aber aus der Aussage "An array is always an instance of Object." kann man einfach nicht die Aussage "Arrays sind nur instanceof Object" ableiten

Das ist korrekt, aber ich habe ja vorhin die Tabelle darunter angesprochen. Dort werden Objekte gezeigt, und in einer Spalte "instanceof" steht dort von was sie instance sind.

Bei zB sowas wie Cat steht dann da: Object, Cat, Animal

usw, d.h. es wird immer gesagt, von was alles dieses Objekt instanceof == true ist.

Und bei einem Array int[] steht eben NUR da: Object. Ich hätte dort schon noch die Syntax int[] gut gefunden. Und wenn jemand so eine Tabelle macht, und das dort nicht hinschreibt, ist es zwar rein wörtlich genommen nicht falsch, aber es ist so unvollständig dass es finde ich dann doch falsch ist. Immerhin soll dieses Buch ja dazu sein, damit man draus lernt.

Das ist wie wenn ich n Tutorial über Vererbung schreibe und nirgendwo das "super" erwähne. Dann wäre zwar nix falsch an dem, was ich sage, aber ich sag halt nicht alles. Und das finde ich nicht okay für ein Buch mit diesem Zweck. Und sowas ist mir jetzt schon sehr oft zum Verhängnis geworden. Wenn du jemandem etwas erklärst, dann musst du doch davon ausgehen, dass für ihn alles "closed world assumed" ist. Er weiss ja nicht, was fehlt, eben weil er es nicht wissen kann. Dann muss man das halt vollständig erklären.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hmja, hab' gerade mal per Google-Books reingeschaut (jetzt ist mir auch dein Avatarbild klar :) ). Dort ist nicht erwähnt, dass diese Tabelle "vollstädig" ist.. wenn man es weiß, wirkt es verdächtig, dass bei den zweiten Operanden keine Arrays dabeistehen... aber es stimmt schon: Es könnte der falsche Eindruck vermittelt werden.

BTW: Richtig spannend werden solche Typ-Fragen ja (unabhängig von der dort sehr eingeschänkten Anwendbarkeit des instanceof-Opperators) eigentlich erst bei sowas wie AngelikaLanger.com - Java Generics FAQs - Under The Hood Of The Compiler - Angelika Langer Training/Consulting (und ich glaube, dass man mit Fragen DAZU die meisten, die glauben, die Sprache zu kennen, eines besseren belehren kann).

BTBTW: Du scheinst diese SCJP-Pfüfung ziemlich wichtig zu nehmen. Ohne dich demotivieren zu wollen: Ich hatte (wie oben schon angedeutet) häufiger den Eindruck, als wären die Fragen dort teilweise ziemlich praxisfern. Oder anders formuliert: Bestimmte Sprachkonstrukte sollte man nicht verwenden - und die indirekte Begründung dafür, dass man sie nicht verwenden sollte, ist: Weil in der SCJP-Prüfung eine Frage dazu gestellt wird, die "schwer" ist (oder direkt: Weil nicht sofort klar ist, was das Konstrukt macht). Wer in einer realen Anwendung sowas schreibt wie
int x = array[index++][index++];
sollte erst gefeuert und dann am besten noch geteert und gefedert werden. Und der Gedanke, dass das (durch Auswendiglernen von Prüfungsfragen angeeignete) Wissen um die genaue Semantik eines solchen Konstrukts dazu führen könnte, dass die Leute es auch nur als legitim in Erwägung ziehen, sowas zu verwenden, ist irgendwie beunruhigend. Man sollte seine Sprache kennen. Deswegen ist ein Lernen von bestimmten Fakten (ggf. auch unterhaltsam aufbereitet, wie die Odds&Ends und Puzzlers aus dem Java-Quiz) vielleicht ganz hilfreich. Aber ich finde (ganz subjektiv) dass ein guter Programmierer sich NICHT dadurch auszeichnet, dass er weiß was das oben beschriebene Konstrukt genau MACHT, sondern eher dadurch, dass er so etwas nicht verwendet...
 

hdi

Top Contributor
Jo, das ist schon richtig. Trotzdem kann es ja nicht schaden auch so einen Mist wirklich zu verstehen. Und wenn das auch noch Bedingung dafür ist, den SCJP Test zu schaffen, dann gleich doppelt. Ich weiss ja selber dass dieses Zertifikat eher nichts darüber aussagt, wie gut man im Endeffekt programmieren kann. Aber beim Arbeitgeben kommt's gut, und deshalb mach ich es halt auch, obwohl es mir eben primär darum geht alles zu können, einfach nur für mich.
 

kostonstyle

Aktives Mitglied
hier wird die Methode compareTo überschrieben, warum kann man es nochmals in der Methode aufrufen.
Code:
   public int compareTo(Textpassage obj)  {
     return text.compareTo(obj.text);
   }
nimmt der Compiler hier den Type Textpassage<?> an, warum eigentlich?
Code:
static boolean palindrom(Umkehrbar<?> param)
einfach ausgedruckt, ich komme eifach nicht draus bei diesem Beispiel.
 

Marco13

Top Contributor
Das text.compareTo, das dort aufgerufen wird, ist das compareTo der Klasse String. Die bietet schon CompareTo an. Um das compareTo auch für Textpassage anzubieten, wird der aufruf einfach an den String weitergereicht.

Bei dem
static boolean palindrom(Umkehrbar<?> param)
muss nur iregenwas Umkehrbares übergeben werden. Was genau, ist nicht wichtig. Das könnte ein
Textpassage implements Umkehrbar<TextPassage>
sein, oder
Zahlenfolge implements Umkehrbar<Zahlenfolge>
oder sonstwas - es ist egal, was es ist, solange es nur "Umkehrbar" ist (d.h. solange es die Methode "umkehren" anbietet - das ist (fast) alles, was für diese Methode gebraucht wird. (Ich fände es übrigens schöner, wenn der vergleich nicht mit compareTo gemacht werden würde, sondern mit equals - das würde weniger Anforderungen an das übergebene Objekt stellen...)
 

kostonstyle

Aktives Mitglied
vielen dank
das beispiel habe ich aus dem Buch. Bin eben am Java lernen.
aber warum wird param zu instanz von Textpassage, weil ich mitgegeben habe?
param hat auch zugriff auf string text, warum?
 

Marco13

Top Contributor
Bin nicht sicher, ob ich die Frage richtig verstanden habe.

Das Objekt, das an "palindrom" übergeben wird, IST ein Objekt vom Typ "Textpassage". Das ist so, und kann sich auch nie ändern.

In der Methode ist das übergebene Objekt erstmal nicht als "Textpassage" bekannt, sondern nur als irgendein Objekt, das "Umkehrbar<?>" ist. Deswegen kann man auf diesem Objekt die "umkehren"-Methode aufrufen.

Danach wird das übergebene Objekt auf "Comparable" gecastet. Das ist IMHO nicht besonders schön. Man versucht damit, zu "erzwingen" damit, dass man auf dem Objekt auch "compareTo" aufrufen kann (aber dieses Erzwingen kann auch scheitern - deswegen die Exception, die da gefangen wird). Die compareTo-Methode, die dann auf dem Objekt aufgerufen wird, ist genau die compareTo-Methode von Textpassage (schließlich ist und bleibt das übergebene Objekt ja ein Objekt vom Typ Textpassage - auch wenn man an dieser Stelle nicht mehr weiß, dass es vom Typ Textpassage ist)
 

Marco13

Top Contributor
Jein ;) "param" ist in diesem Fall eine Referenz auf ein Objekt vom Typ "Umkehrbar<?>". Mehr weiß man an dieser Stelle nicht.

Das Objekt ist in diesem Fall tatsächlich ein Objekt vom Typ Textpassage (was ja den Typ "Umkehrbar<?>" mit einschließt), aber das sieht man dem "param" nicht mehr an. Man hat mit "param" praktisch eine "eingeschränkte Ansicht" auf das Textpassage-Objekt. Dh. man weiß nicht mehr genau, von welchem Typ das Objekt ist, sondern NUR, dass es ein Objekt vom Typ "Umkehrbar<?>" ist.

Der Vorteil ist, dass man diese Methode (abgesehen von diesem unschönen Comparable-Zeug) praktisch mit JEDEM Objekt aufrufen kann, dessen Klasse das Interface "Umkehrbar" implementiert. Innerhalb der Methode muss man nur wissen, dass das übergebene Objekt "Umkehrbar" ist. Ob es eine Textpassage oder eine Zahlenfolge oder sonstwas ist, spielt dort keine Rolle.

Man KÖNNTE die Methode natürlich auch schreiben als
static boolean palindrom(Textpassage param)
aber damit würde diese Flexibilität verlorengehen: Man könnte dann dort NURnoch Textpassage-Objekte übergeben, und keine anderen (umkehrbaren) Objekte mehr.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
NeoLexx Abfrage mit instanceof führt zu unerwarteten Wert Java Basics - Anfänger-Themen 9
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
S Gibt es eine Funktion, die gewissermaßen eine Reihe von instanceOf() vereinheitlicht? Java Basics - Anfänger-Themen 19
J instanceof Operator Java Basics - Anfänger-Themen 3
G instanceof in Generic Java Basics - Anfänger-Themen 7
A instanceof-if-else-Anweisungen eleganter lösen Java Basics - Anfänger-Themen 5
B instanceof Java Basics - Anfänger-Themen 9
L Best Practise - 'instanceof' oder nicht. Java Basics - Anfänger-Themen 7
Luk10 instanceof Class<T> Java Basics - Anfänger-Themen 6
I if (listenObjekt instanceof meinObjekt.class) Java Basics - Anfänger-Themen 5
A ArrayList-iteration mit Prüfung auf instanceof durch switch case? Java Basics - Anfänger-Themen 13
K Polymorphie und instanceOf Operator Java Basics - Anfänger-Themen 6
M Compiler-Fehler instanceof compiler-error Java Basics - Anfänger-Themen 2
A Alternative instanceof Java Basics - Anfänger-Themen 3
0 Vererbung - instanceof Java Basics - Anfänger-Themen 20
J this instanceof Class<Object> Java Basics - Anfänger-Themen 1
D HasMap mit JComponents mit instanceof Java Basics - Anfänger-Themen 3
K Equals,Instanceof und "==" Java Basics - Anfänger-Themen 7
A Datentypen instanceof VS Class - Vergleich Java Basics - Anfänger-Themen 4
S Bessere Lösung zu häufigem instanceof Java Basics - Anfänger-Themen 25
A Besser als instanceof Java Basics - Anfänger-Themen 6
E instanceof vs class==class Java Basics - Anfänger-Themen 5
B instanceof Prüfung für generische Typen Java Basics - Anfänger-Themen 5
S instanceof Comparable...geht nicht? Java Basics - Anfänger-Themen 20
A Vereinfachung instanceof Java Basics - Anfänger-Themen 12
G Mit "instanceof" sich selbst Fragen? Java Basics - Anfänger-Themen 4
S Instanceof umkehren Java Basics - Anfänger-Themen 2
E Negative Abfrage auf instanceof Java Basics - Anfänger-Themen 3
D if (event.target instanceof TextField) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben