OOP Methoden überladen, wo liegt das Problem?

knowledge

Bekanntes Mitglied
Hi,

beim Kompilieren kommt ne Fehlermeldung wenn ich später nen Aufruf wie



Java:
double result = v(3,4,'z');

mache. Sie lautet: "Reference to v is ambiguous, both method...match"

Kern der Aussage, soweit ich das verstehe. Es "passen" beide Methoden. Die Signaturen sind doch aber unterschiedlich. Warum geht das überladen so nicht? Im ersten fall ist meine Signatur: v(int,int,int). Im zweiten: v(double,double,char). Insbesondere der letzte Parameter, das char, ist ja wohl deutlich vom int zu unterscheiden. Bei dem anderen geh ich mal von aus das die Parameter von int in double konvertiert werden könnten.

Wo liegt also der Fehler?

Java:
 public static int v(int r, int h, int k) {
        return r+h+k;
 }     
    
 public static double v(double r, double h, char typ) {
        return r+h+k;
 }
 

agentone

Bekanntes Mitglied
Ist dir vielleicht schon aufgefallen, dass sich sowohl
Java:
int r=3;
int h=4;
int k='z';
als auch
Java:
double r=3;
double h=4;
char typ='z';
kompilieren lassen?
 

nroz

Mitglied
3->int, 4->int, 'z'->narrowing zu short->widening zu int

oder

3->int->widening zu double, 4->int -> widening zu double, 'z'->short/char

/e angepasst mit Aussage aus dem Folgepost. ;-)
 
Zuletzt bearbeitet:

fastjack

Top Contributor
char -> short ist kein widening, sondern narrowing, da char 16bit, short zwar ebenfalls 16bit aber zweier Komplement. Du must casten und verlierst möglicherweise etwas.
 

knowledge

Bekanntes Mitglied
Sehe ich es richtig das widening: typ in anderen "genauerer" typ umwandeln. wie int zu double. shortening ist umgedreht. also typgenauigkeit bzw. wertebereich eingschränken, z.B. double zu int?

Warum ein char als int dargestellt werden kann ist mir aber noch unklar.

Aber der compiler weiß halt nicht ob er die übergeben parameter "erweitern" soll zu double oder halt als int interpretieren soll, richtig?
 

nroz

Mitglied
Die JVM würde später Probleme haben zu entscheiden, welcher Methodenaufruf geschehen soll, weil in beiden Fällen aus deinem Beispiel, der Datentyp erweitert (widening) werden muss.
Wenn die Datentypen exakt für den Aufruf passen, hat der Compiler auch keine Probleme.

shortening gibt es nicht, dies geht nur durch explizites casten mit möglichem Verlust von Daten.
 
Zuletzt bearbeitet:

fastjack

Top Contributor
Warum ein char als int dargestellt werden kann ist mir aber noch unklar.

Das ist eine Konvention in Java und liegt daran: Char ist 16bit lang, unsigned, also 0 bis 65535. Byte kann den char nicht fassen (weil 8bit signed), short auch nicht (16bit aber signed). Bleibt als kleinster Datentyp nur noch int übrig (32bit, signed). Jeder char ist ein einzelnes 16bit Unicode-Zeichen '\u0000' bis '\uffff', das intern als Zahl dargestellt wird (int).
 
G

Gastredner

Gast
Ersetze die 3 und durch die vier durch 3.0 und 4.0, dann meckert er nicht mehr.
Grundsätzlich gilt: Zahlenliterale ohne Dezimalpunkt werden als Integer gedeutet, solche mit Dezimalpunkt als Doubles.
 

Wortraum

Bekanntes Mitglied
die links werd ich mir anschaun. wenn ein char aber ein int ist, wieso dann eigentlich die unterscheidung char/int?
Ein char ist kein int; char ist 16 Bit, int ist 32 Bit groß. Ein char wird als Unicode-Zeichen interpretiert, ein int als eine Zahl im Zweierkomplement.

Allerdings paßt ein char problemlos in ein int. Wenn Du Deine Methode aufrufst, muß irgendwo konvertiert werden, entweder die beiden ints in double oder das char in int.

Noch eine kleine Anmerkung: Irgendwo weiter oben wurde gesagt, daß ein char ein Unicode-Zeichen enthalte. Das stimmt nicht mehr, sobald beispielsweise 32-Bit-Zeichenadressen wie bei UTF-32 verwendet werden, was dann bei Java hübsche Probleme bereiten kann.
 

knowledge

Bekanntes Mitglied
Hallo,

ich hab es so verstanden. Intern ist ja sowieso jeder Datentyp einfach nur ein Bitmuster. Was ich davor schreibe int, double oder char sagt mir ja quasi nur, wie ich das Bitmuster zu interpretieren habe.

Ich find es nur blöd das ein char (intern ein Bitmuster von einer Länge mit 2 Byte) nun automatisch in ein int umgewandelt werden kann (widening conversion). Denn Sinn und Zweck ist es ja Zeichen darzustellen und nicht diese Zeichen in eine Zahl umzuwandeln.

Ich hab zwar verstanden das halt diese automatische Konvertierung möglich ist, aber der Sinn wieso ist mir noch nicht erschlossen.
 

Landei

Top Contributor
Auf der Festplatte befinden sich Bits, und die müssen halt je nach dem entweder als Zeichen oder als Zahlen "gedeutet" werden, insofern ist es schon sinnvoll, dass man beides ineinander umwandeln kann. Ein InputStreamReader hat z.B. eine read()-Methode, die ein int liefert - egal ab es gerade DLLs oder Shakespeares gesammelte Werke liest, aber diesen int kannst du eben ganz leicht in einen char umwandeln (nicht dass ich einen InputStreamReader für Shakespeares gesammelte Werke empfehlen würde, da gibt es bessere Varianten wie BufferedReader oder ClassicalLiteratureReader).
 

fastjack

Top Contributor
Das char ein 32bit Zeichen halten könnte ist interessant. Bisher habe ich nur gehört, das man im JSR-204 ein char32 einführen wollte, der das kann, das kam aber nicht so, stattdessen konnte der String Teile wie \U20000 halten. Diese Zeichen sollten aber auch in zwei chars gespeichert werden.
So ist mein Stand zu Java 6, bei 7 weis ich nicht.

Java:
        char c0 = '\u4444';
        char c1 = '\u20000'; // geht nicht
        char32 c2 = '\u20000'; // gibs nicht
        String c3 = "\u20000";
        System.out.println("length" + c3.length()); // = 2

Welch Ironie: geht nicht --> gibs nicht :applaus:
 

agentone

Bekanntes Mitglied

Waß issen das fürne Scheissse? :)))

2 hoch 16 = 65.536
2 hoch 32 = 4.294.967.296

Das heißt UTF-16 kann ca. 65 Tausend Zeichen darstellen.
Es gibt lautWie viele Länder gibt es... | aus Forum Geowissenschaften/Erdkunde | wer-weiss-was max. 240 Länder auf dieser Welt.

2^16 / 240 = 273

Das heißt, jedes Land dieser Erde könnte 273 Schriftzeichen für sich benutzen. Davon muss man noch mal 500 Sonderzeichen und ca. 3000 chinesische Schriftzeichen abziehen, sowie 52 lateinische Buchstaben:

(2^16 - 500 - 3000 - 52) / 240 = 258

Also immernoch viel zu viele...

Hat also jemand einen triftigen Grund, sowas zu benutzen??
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Methoden überladen - loss of precision Java Basics - Anfänger-Themen 2
K OOP Methoden überladen - Signatur Java Basics - Anfänger-Themen 22
N Methoden überladen - überschreiben - wo unterschied? Java Basics - Anfänger-Themen 8
emreiu Methoden Rekursive Methoden Runter- & Hochzählen Java Basics - Anfänger-Themen 2
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
J Argumente in Methoden übergeben Java Basics - Anfänger-Themen 1
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
Renjiroo Java Bmi Rechner mit Methoden Java Basics - Anfänger-Themen 4
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
Alen123 Erstes Arbeiten mit Methoden. Java Basics - Anfänger-Themen 5
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
M Erklärung von Ausnahmebehandlung in Methoden Java Basics - Anfänger-Themen 13
S Methoden 2 non-static Methoden, trotzdem Fehler "non static method can not be referenced from a static context" Java Basics - Anfänger-Themen 9
L Rekursive Methoden Java Basics - Anfänger-Themen 14
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
W Methoden aufrufen - auch klassenübergreifend? Java Basics - Anfänger-Themen 9
Kotelettklopfer Methoden nicht aufrufbar Java Basics - Anfänger-Themen 34
R Schulaufgabe, Bruache Hilfe mit non-static Methoden Java Basics - Anfänger-Themen 2
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
S Methoden - Warum int wenn auch void? Java Basics - Anfänger-Themen 3
H Kann man Methoden öfter aufrufen? Java Basics - Anfänger-Themen 2
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
lougoldi Verkettung von Methoden und Konstruktoren Java Basics - Anfänger-Themen 4
Zeppi OOP Methoden mit einander Verknüpfen Java Basics - Anfänger-Themen 6
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
M Bräuchte Hilfe bei diesen Methoden Java Basics - Anfänger-Themen 4
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
Junger_Basileus Celsius -> Fahrenheit / Strukturierung in statischen Methoden Java Basics - Anfänger-Themen 7
J Verschachtelte Methoden Java Basics - Anfänger-Themen 9
H Methoden in anderen Methoden aufrufen Java Basics - Anfänger-Themen 6
Kawastori Hilfe bei Methoden Übung Java Basics - Anfänger-Themen 6
veryck Methoden Rekursive Methoden mit Rückgabeparameter Java Basics - Anfänger-Themen 9
C Methoden können nicht auf Instanzvariable der Klasse zugreifen Java Basics - Anfänger-Themen 3
P Methoden aufrufen - Fehler Java Basics - Anfänger-Themen 20
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
C Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln Java Basics - Anfänger-Themen 115
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Generics Methoden Java Basics - Anfänger-Themen 7
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
S throws bei Methoden Java Basics - Anfänger-Themen 4
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
I Greedy Methode Methoden nutzen Java Basics - Anfänger-Themen 3
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
S Übergabe von Arrays an Methoden Java Basics - Anfänger-Themen 20
L Methoden Wie Löse ich ext Methoden Aufruf Fehler? Java Basics - Anfänger-Themen 3
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
B Methoden Ausgeben Aufgabe Java Basics - Anfänger-Themen 15
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
T Methoden Verständnis Java Basics - Anfänger-Themen 14
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
N Klassen Warum kann meine Klasse nicht auf Methoden der anderen Klasse zugreifen? Java Basics - Anfänger-Themen 6
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
Kirby.exe Methoden Aufrufe Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
H Aufruf von Methoden durch Methoden Java Basics - Anfänger-Themen 3
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
H Wie kann ich durch Methoden definiren? Java Basics - Anfänger-Themen 8
D Methoden Scannervariablen in static Methoden Java Basics - Anfänger-Themen 5
P Verzweigungen und Methoden Java Basics - Anfänger-Themen 10
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
B Polymorphie Warum funktionieren polymorphe Referenzvariablen bei überschriebenen Methoden und bei nicht überschriebenen nicht? Java Basics - Anfänger-Themen 3
B Methoden Java Basics - Anfänger-Themen 1
T Körper Brechnung - Lokale Variablen in Methoden übergeben Java Basics - Anfänger-Themen 10
P Methoden richtig anwenden Java Basics - Anfänger-Themen 3
C Zusammenfassen von Methoden in einer Hilfsmethode Java Basics - Anfänger-Themen 19
A Methoden Serialisieren Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben