Klassen Klasse BreakIterator

xerxes24

Mitglied
Hallo Zusammen,

Möchte wissen, wieso ich diese Klasse in folgendem Code-Beispiel normal benutzen kann (und auch sonst), ohne die Klasse zu erweitern und die Methoden zu implementieren, obwohl die Klasse und gewisse Methoden (next() und first()) doch als abstract markiert sind? Habe gelernt, dass man Abstrakte-Klassen erweitern "muss". Auch in der Klassendeklaration BreakIterator.class existiert gar kein Methodenkopf (Bsp. public abstract int next(); )! Wie kann der Code dann funktionieren? Mach ich irgend einen Denkfehler?

Code:
import java.text.BreakIterator;
import java.util.*;

public class WhereHaveYouBeen {
public static void main( String[] args ) {

Set<String> allCities = new HashSet<>();
allCities.add( "Sonsbeck" );
allCities.add( "Düsseldorf" );
allCities.add( "Manila" );
allCities.add( "Seol" );
allCities.add( "Siquijor" );

Set<String> visitedCities = new TreeSet<>();

String sentence = "Von Sonsbeck fahre ich nach Düsseldorf und fliege nach Manila.";
BreakIterator iter = BreakIterator.getWordInstance();
iter.setText( sentence );

for ( int first = iter.first(), last = iter.next();
last != BreakIterator.DONE;
first = last, last = iter.next() ) {
String word = sentence.substring( first, last );
if ( allCities.contains( word ) )
visitedCities.add( word );
}

System.out.println( "Anzahl besuchter Städte: " + visitedCities.size() );
System.out.println( "Anzahl nicht besuchter Städte: " +
(allCities.size() - visitedCities.size()) );
System.out.println( "Besuchte Städte: " + String.join( ", ", visitedCities ) );
Set<String> unvisitedCities = new TreeSet<>( allCities );
unvisitedCities.removeAll( visitedCities );
System.out.println( "Unbesuchte Städte: " + String.join( ", ", unvisitedCities ) );
}
}

Danke für die Hilfe.
Gruss
xerxes24
 

httpdigest

Top Contributor
Die statische Methode BreakIterator.getWordInstance() liefert dir irgendeine Instanz einer konkreten Implementierung von BreakIterator. Du erzeugst ja selber keine Instanz von BreakIterator mit new. Und natürlich kannst du auf einem statischen Typ einer abstrakten Klasse oder einem Interface eine Methode aufrufen. Der dynamische Typ des Objektes dahinter ist ja immer eine konkrete Klasse.
 

xerxes24

Mitglied
Ja das ist mir schon klar, das die Methode getWordInstance() statisch ist. Dort sehe ich auch kein Problem aber die Methode next() zum Beispiel ist "public abstract int next();" (Semikolon als Abschluss und nicht ein Methodenrumpf { mit Implementierung }).
Zitat:
In Java ist es möglich, abstrakte Methoden zu definieren. Im Gegensatz zu den konkreten Methoden enthalten sie nur die Deklaration der Methode, nicht aber ihre Implementierung. Syntaktisch unterscheiden sich abstrakte Methoden dadurch, daß anstelle der geschweiften Klammern mit den auszuführenden Anweisungen lediglich ein Semikolon steht. Zusätzlich wird die Methode mit dem Attribut abstract versehen. Abstrakte Methoden können nicht aufgerufen werden, sie definieren nur eine Schnittstelle. Erst durch Überlagerung in einer abgeleiteten Klasse und Implementierung des fehlenden Methodenrumpfes wird eine abstrakte Klasse konkret und kann aufgerufen werden.

Wenn ich eine abstrakte Klasse erstelle, kann ich diese auch nicht benutzen! Wenn man die Deklaration der Klasse BreakIterator in java/base -- java.text.BreakIterator anschaut sieht man keine Implementation der oben genannten Methode und die Klasse wird auch nirgends erweitert!

Danke und Gruss
 

httpdigest

Top Contributor
Ich wiederhole mich nochmal: Natürlich kannst du auf einem statischen Typ einer abstrakten Klasse oder einem Interface eine Methode aufrufen. Der dynamische Typ des Objektes dahinter ist ja immer eine konkrete Klasse.
Das nennt sich Polymorphie und ist das aller grundsätzlichste an der objektorientierten Programmierung.
Es wird dann anhand des dynamischen Typs des Objektes entschieden, welche konkrete Implementierung der aufgerufenen Methode tatsächlich ausgeführt wird. Das nennt sich wiederum Dynamic Dispatch oder "spätes Binden".
Beispiel:
Java:
public abstract class AbstractClass {
  public abstract String giveString();
  public static AbstractClass giveImplementation() {
    return new ConcreteClass();
  }
}
public class ConcreteClass extends AbstractClass {
  public String giveString() {
    return "Hello, World!";
  }
}
public class Test {
  public static void main(String[] args) {
    AbstractClass instance = AbstractClass.giveImplementation();
    System.out.println(instance.giveString());
  }
}
AbstractClass entspricht hier der java.text.BreakIterator und ConcreteClass entspricht einer konkreten Implementierung, die von dem JDK intern zurück geliefert wird. Test entspricht dann deiner Klasse.
Selbstverständlich wird BreakIterator.getWordInstance() intern irgendwo eine Instanz einer konkrete Klasse zurückliefern. Hast du dich da schonmal komplett durch den ganzen JDK Code durchgewühlt. Du kannst bei BreakIterator.createBreakInstance() anfangen. Dann wirst du irgendwann die Stelle finden, an der eine konkrete Klasse instanziiert wird.

Wenn ich eine abstrakte Klasse erstelle, kann ich diese auch nicht benutzen!
Selbstverständlich kannst du diese benutzen. Sie kann immer der statische Typ einer Variablen bzw. eines Ausdrucks sein. Zur Laufzeit wird durch diesen Ausdruck aber ein Objekt generiert, welches eine Instanz einer konkreten Implementierungsklasse ist. Und somit kannst du auf dem statischen Typ der abstrakten Klasse selbstverständlich immer eine abstrakte Methode aufrufen, weil diese auf dem dynamischen Typ des Objektes, auf dem die Methode letztlich aufgerufen wird, immer vorhanden sein wird. Nämlich implementiert in der konkreten Klasse des Objektes.

EDIT: Du kannst dir auch ganz einfach die Klasse des Objektes, welches von BreakIterator.getWordInstance() zurückgeliefert wird, ausgeben lassen:
Java:
public static void main(String[] args) {
  System.out.println(BreakIterator.getWordInstance().getClass());
}
Gibt bei mir: "class sun.text.RuleBasedBreakIterator" aus
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Abstrakte Methoden können nicht aufgerufen werden, sie definieren nur eine Schnittstelle.
Der Teil ist etwas missverständlich formuliert.
Abstrakte Methoden kann man natürlich aufrufen, ausgeführt werden sie aber immer auf einem konkreten Objekt, für welches alle abstrakten Methoden implementiert sein müssen.
 

xerxes24

Mitglied
An httpdigest:
Habe es auch so probiert:
Java:
BreakIterator iter = BreakIterator.getWordInstance();
System.out.println( iter.getClass() );

und "class sun.text.RuleBasedBreakIterator" erhalten. Und in RuleBasedBreakIterator werden die abstrakten Methoden implementiert. Das habe ich die ganze Zeit gesucht!!

Etwas doof finde ich, dass auf der Seite von Oracle unter BreakIterator https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/BreakIterator.html nirgendwo etwas von RuleBasedBreakIterator erwähnt ist! Normalerweise steht immer so etwas wie:
public class RuleBasedBreakIterator extends BreakIterator
also welche Klasse BreakIterator erweitert. Aber nichts. Hat das was damit zu tun, dass diese Klasse im Paket sun.text ist? Aber sun.text ist ja auch in java.base?! Das hat mich etwas verwirrt!

Habe jetzt alles soweit begriffen. Vielen Dank für die Erklärungen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
E KeyCode in anderer Klasse speichern Allgemeine Java-Themen 2
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
M XML DOM Klasse die Iterable Implementiert Allgemeine Java-Themen 1
P Name der Parent Klasse abfragen Allgemeine Java-Themen 8
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7
L Classpath Klasse einbinden Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben