Referenzvariablen - warum muss der Typ definiert werden?

Status
Nicht offen für weitere Antworten.

transsib

Mitglied
Hallo,

irgendwie schnalle ich es nicht - warum muss ich einer Referenzvariablen sagen von welchem Typ sie ist?

Aus der Insel:
Code:
Point p = new Point();

Weshalb muss ich dem 'p' ein 'Point' voranstellen? Durch 'new Point()' wird doch automatisch klar, dass der Typ von 'p' nur 'Point' sein kann, oder nicht? ???:L


Hier noch ein Codeschnipsel aus dem 'Currency Converter' Beispiel von Netbeans für JavaME:

Code:
private RecordStore   storedData;

public void startApp() {
        try {
            storedData = RecordStore.openRecordStore(storedDataStr, true);

Wenn ich das richtig verstehe, sage ich in Zeile 1, dass die Referenzvariable 'storedData' vom Typ 'RecordStore' sein soll!? Was passiert denn genau in Zeile 5? Da wird der 'storedDataStr' und der boolsche Wert 'true' in die Methode 'openRecordStore' der Klasse 'RecordStore' geschrieben und der Referenzvariablen 'storedData' zugewiesen!?

Verstehe ich das richtig? Für was ist die Geschichte in Zeile 5 gut? Warum muss nach dem Gleichzeichen 'RecordStore' benutzt werden, obwohl in Zeile 1 doch schon 'storedData' auf 'RecordStore' referenziert wurde?

Wäre
Code:
storedData = RecordStore.openRecordStore(storedDataStr, true);

nicht das Gleiche wie
Code:
storedData = storedData.openRecordStore(storedDataStr, true);
?

Ich bitte Euch um Erleuchtung... :D


Viele Grüße,

Oliver
 
M

maki

Gast
>> Durch 'new Point()' wird doch automatisch klar, dass der Typ von 'p' nur 'Point' sein kann, oder nicht?

Nein, siehe Polymorphie.

>> Für was ist die Geschichte in Zeile 5 gut?

Instanzmethoden (Objektmethoden) vs. Klassenmethoden
 

musiKk

Top Contributor
Das modernere C# hat sich dieser Problematik aber tatsächlich angenommen und das "var" keyword eingeführt, mit dem der Typ einer Variablen automatisch bestimmt wird.
 

transsib

Mitglied
Hi!

Vielen Dank für Eure Antworten!
Ich habe jetzt den ganzen Nachmittag herum gegoogelt und in meinen Java-Büchern gelesen :### - ich kapiere es trotzdem nicht. :(

Wenn ich mir dieses Beispiel ansehe

Code:
private RecordStore   storedData;

public void startApp() {
        try {
            storedData = RecordStore.openRecordStore(storedDataStr, true);

Glaube ich zwar zu wissen, was da gemacht wird, der Sinn verbirgt sich mir aber. Es geht mir dabei insbesondere um die erste Zeile - hier wird eine Referenzvariable mit der Bezeichnung 'storedData' definiert, die vom Typ der Klasse 'RecordStore' ist und als private deklariert.

Noch mal meine Frage - weshalb muss ich ihr den Typ der später zu verwendenden Klasse geben? Durch die Zuweisung einer der Klassenmethoden wird die Sache doch ohnehin klar!? Alle Beispiele die ich fand sehen im Prinzip so aus:

Code:
Klasse variable = new Klasse()

oder

Code:
Klasse variable = Klasse.methode()


Habt Ihr mir vielleicht ein Beispiel (mit Begründung), das so aussieht:

Code:
Schnurzelpurbsel variable = Klasse.methode()

?

Viele Grüße,

Oliver
 

0x7F800000

Top Contributor
Wildcard hat gesagt.:
Dinge die die Welt nicht braucht
:toll:
manchmal ist man eher froh, dass man nicht nur den Typen, sondern auch den gesamten namen des packages davor schreiben darf. Wieso sollte man das in die entgegengesetzte richtung weg von der übersichtlichkeit verändern... Leuten, die verstehen was die da tun macht es eh nichts aus, den Typen korrekt anzugeben.
 

0x7F800000

Top Contributor
transsib hat gesagt.:
Habt Ihr mir vielleicht ein Beispiel (mit Begründung), das so aussieht:
Code:
Schnurzelpurbsel variable = Klasse.methode()

etwa so etwas:
Code:
Oberklasse a=new Klasse(xyz);
Interface b=new KlasseDieInterfaceImplementiert(xyz);

ARadauer hat die stichwörter nicht umsonst hingeschrieben...
 
S

shad0w

Gast
Stell dir mal vor, du hast eine Vererbungshierarchie derart:

Cat extends Animal extends Object

Cat implements Meowable


Dann kannst du schreiben:

Object o = new Cat();

oder

Animal a = new Cat();

oder

Cat c = new Cat();

oder

Meowable m = new Cat();


Je nach dem, was du schreibst, hast du einen anderen Satz von Methoden verfügbar, auf die du über die Variable zugreifen kannst. Normalerweise nimmt man dann das Allgemeinste, was man braucht, d.h. wenn man nur die Methoden braucht, die in Object sind, dann nimmt man Object. Das dient der Fehlerreduzierung.
 
S

shad0w

Gast
Du hast in deinem ersten Posting gefragt: "Weshalb muss ich dem 'p' ein 'Point' voranstellen? Durch 'new Point()' wird doch automatisch klar, dass der Typ von 'p' nur 'Point' sein kann, oder nicht?"

Da steckte dein eigentlicher Denkfehler. Der Typ von p kann auch z.B. Object sein, also:

Object o = new Point();
 

transsib

Mitglied
@shad0w:

vielen Dank für Deine ausführliche Antwort - genau so ein Beispiel habe ich gemeint. Jetzt habe ich es wohl kapier.
Wenn eine Klasse von anderen Klassen abgeleitet ist oder sie implementiert, kann die Referenzvariable auch vom Typ einer dieser Ursprungsklassen sein. Richtig?

Viele Grüße,

Oliver
 

Schandro

Top Contributor
ja.

Andersrum geht es auch:

class A
class B extends A

einer Methode, die einen Parameter von Typ A erwartet, kannst du auch ein Object von B übergeben.
 
S

shad0w

Gast
Eigentlich richtig. Nur eine kleine Anmerkung: Klassen werden nicht implementiert, sondern man implementiert Interfaces.

Klassen und Interfaces zusammen nennt man Typen.

Eine Referenzvariable kann auf alles zeigen, was von ihrem eigenen oder einem ihrer Subtypen ist. Z.B. eine Referenzvariable vom Typ Object kann auf jedes Objekt zeigen. Dazu gehören z.B. auch Arrays:

Object o = new int[5]; //kompiliert und läuft

Anderes Beispiel, wo es nicht klappt:

Animal a = new Cat();
Cat c = a; //kompiliert nicht, denn Animal ist kein Subtyp von Cat!!

Stattdessen muss man casten:

Animal a = new Cat();
Cat c = (Cat)a; //kompiliert und läuft

Was passiert nun, wenn a tatsächlich nicht auf eine Cat zeigt, sondern einen Dog?

Animal a = new Dog();
Cat c = (Cat)a; //kompiliert, aber läuft nicht: du erhältst eine ClassCastException.

Es gibt noch mehr Besonderheiten, v.a. im Zusammenhang mit Arrays, aber das reicht erstmal.
 

Landei

Top Contributor
Das modernere C# hat sich dieser Problematik aber tatsächlich angenommen und das "var" keyword eingeführt, mit dem der Typ einer Variablen automatisch bestimmt wird.
Scala hat ebenfalls Typ-Inferenz, und zwar (soweit ich weiß) noch weitreichender als in C#. Ich finde dieses Feature richtig gut und denke, dass es Zeit wird, dass das auch in Java kommt...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Polymorphie Warum funktionieren polymorphe Referenzvariablen bei überschriebenen Methoden und bei nicht überschriebenen nicht? Java Basics - Anfänger-Themen 3
W Dynamischer und statischer Typ von Referenzvariablen Java Basics - Anfänger-Themen 13
T Belegung einer Referenzvariablen Java Basics - Anfänger-Themen 14
K Frage zu Referenzvariablen und deren Typen Java Basics - Anfänger-Themen 6
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
G Referenzvariablen Java Basics - Anfänger-Themen 15
H Referenzvariablen Java Basics - Anfänger-Themen 5
F Warum muss ich ein SSL cert immer manuell hinzufügen? Java Basics - Anfänger-Themen 46
_so_far_away_ Inventarisierungssystem brauche switch Cases und weiß nicht, wie ich e implementieren muss Java Basics - Anfänger-Themen 5
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
D Bitte um Hilfe muss es schnellstmöglich erledigen Java Basics - Anfänger-Themen 15
A OOP Bidirektionale Muss-Assoziation Java Basics - Anfänger-Themen 1
Aqtox Hallo ich muss für die Schule ein Wuerfell Duell erstellen jedoch habe ich ein fehler Java Basics - Anfänger-Themen 4
M Was muss ich verändern damit ich es so ausgegeben bekomme wie auf dem Foto? Java Basics - Anfänger-Themen 2
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
R Was muss ich an meinem Code ändern? Java Basics - Anfänger-Themen 2
L Worauf muss ich achten, wenn ich externe Bibliotheken für meine Anwendungen verwende? Java Basics - Anfänger-Themen 6
L Muss eine HttpURLConnection geschlossen werden? Java Basics - Anfänger-Themen 2
B Email versenden, muss Methode static sein? Java Basics - Anfänger-Themen 7
J Muss ich die externen jars mitgeben? Java Basics - Anfänger-Themen 8
A Wie erkennt die JVM welche class verwendet werden muss? Java Basics - Anfänger-Themen 3
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
B 4 Strings, Anfangsbuchstaben muss unterschiedlich sein Java Basics - Anfänger-Themen 12
A Doppele Ketten- da muss einer rein! Java Basics - Anfänger-Themen 6
J App.jar muss im Projekt App als Bibliothek vorhanden sein?! Java Basics - Anfänger-Themen 1
S Wie muss ich die Generische Methode schreiben? Java Basics - Anfänger-Themen 6
S Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..? Java Basics - Anfänger-Themen 4
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
X Muss man das immer so schreiben o.O Java Basics - Anfänger-Themen 3
Z Gleiches Verzeichnis für class und java unter Windows Muss? Java Basics - Anfänger-Themen 11
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
O Warum muss ich static? Java Basics - Anfänger-Themen 6
B Split, Exception - Obwohl es gehen MUSS Java Basics - Anfänger-Themen 3
B FileWriter close() muss? Java Basics - Anfänger-Themen 8
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Sound abspielen, wo muss die .wav liegen Java Basics - Anfänger-Themen 3
X Muss man Java können um Jython nutzen zu können? Java Basics - Anfänger-Themen 14
H Problem: Button muss zwei Mal angeklickt werden, bis Aktion ausgeführt wird Java Basics - Anfänger-Themen 4
S jcal4j/jlog4j Wo muss die Properties file rein? Java Basics - Anfänger-Themen 2
J Warum muss diese Methode static sein ?! Java Basics - Anfänger-Themen 7
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
S OOP Wie muss meine Klasse zu dieser main aussehen? Java Basics - Anfänger-Themen 5
D Muss ein Applet schreiben was Mittelwerte berechnet nur was mache ich falsch? Java Basics - Anfänger-Themen 11
T Warum muss diese Variable final deklariert werden? Java Basics - Anfänger-Themen 5
A Was muss ich ändern? Java Basics - Anfänger-Themen 2
E Object als Parameter das Unbekannt ist, aber ein bestimmtes Interface haben muss Java Basics - Anfänger-Themen 3
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
E Java-Programm mit Eclipse - wie muss ich anfangen. Java Basics - Anfänger-Themen 7
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G vector füllt sich immer weiter. wo muss ich ihn leeren? Java Basics - Anfänger-Themen 3
G Muss es immer extends sein ? Java Basics - Anfänger-Themen 9
F Muss ich TableCellEditor implementieren für checkbox abfrage Java Basics - Anfänger-Themen 3
N Muss ein thread aktive mit stop beendet werden? Java Basics - Anfänger-Themen 18
P 2. Jframe öffnen und 1. Jframe muss sich dann schließen ? Java Basics - Anfänger-Themen 4
S Tabelsorter von SUN, wie muss die MysQL Anbindung realisiert Java Basics - Anfänger-Themen 11
J Rekursiv muss dass laufen! Java Basics - Anfänger-Themen 11
S Muss Programm schreiben -BRAUCHE HILFE Java Basics - Anfänger-Themen 15
C Wie muss man hier aufrufen von 2 eigenen Klassen? Java Basics - Anfänger-Themen 6
F Wie muss ich mit Preferences umgehen. Java Basics - Anfänger-Themen 5
J Ich versteh den Fehler nich, was muss ich denn ändern? Java Basics - Anfänger-Themen 3
C Klasse muss auf Event in einer anderen Klasse reagieren Java Basics - Anfänger-Themen 7
G Class.forName: Wie muss die Klasse angegeben werden? Java Basics - Anfänger-Themen 3
M muß durch muss ersetzen Java Basics - Anfänger-Themen 7
G Wie muss classpath lauten? Package kompilieren/interpretiere Java Basics - Anfänger-Themen 4
ven000m try catch - was muss bei catch rein Java Basics - Anfänger-Themen 28
D Wert muss sich pro sek ändern aber wie? HELP! Java Basics - Anfänger-Themen 9
P wohin muss ich die packages kopieren? Java Basics - Anfänger-Themen 12
G wieso muss Textfield final sein? Java Basics - Anfänger-Themen 6
Linad Warum muss man Variablen einen Wert zuweisen? Java Basics - Anfänger-Themen 5
G Warum muss das Textfeld final sein? Java Basics - Anfänger-Themen 2
G JDOM: muss XML-Datei nach Änderung abgespeichert werden? Java Basics - Anfänger-Themen 2
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
D nextInt() nicht für Scanner definiert? Java Basics - Anfänger-Themen 2
P Ausnahme, wenn Attribut nicht definiert Java Basics - Anfänger-Themen 4
H Konstruktor nicht definiert wie mach ch es richtig?? Java Basics - Anfänger-Themen 24
H Fehler "Methode xy ist nicht definiert" Java Basics - Anfänger-Themen 2
G Apache Tomcat startet nicht da JAVA_HOME nicht definiert Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben