Sammelsarium an Grundlagen Grundlagen Fragen

milawe

Mitglied
Hallo,

ich habe vor Kurzem begonnen Java zu lernen und blicke schon jetzt nicht ganz durch. Hier ist eine Sammlung meiner bisherigen Fragen:

Grundlegende Fragen:

1. Wass ist der Unterschied zwischen Objekten und Klassen? Woher weiss man z.B. das out eine Objekt und nicht eine Klasse ist? Und würde passieren wenn man den static (stimmt es, dass er dazu sorgt das die main Funktion ohne Klassendeklarition einfügen kann)

2. Warum ist "String" eine Klasse und was versteht man unter: "Zwar wird diese Klasse (Strings) bevorzugt behandelt-das Plus kann Zeichenketten zusammenhöngen-, aber es ist immer noch ein Klassentyp."

3. Warum kann die Funktion println() keine UniCode Zeichen ausgeben? Gibt es ein Muster wann dies bei Funktionen der Fall ist? Und gibt es solche wo dieses Problem durch Darstellung der UniCode Zeichen mit ihrem Ascii ersatz behoben werden könnte?

4. Warum werden Variabeln deren Wert unverändert sein soll neben den Wort final mit dem Schlüsselwort static belegt? Und warum werden diese vor der main Funktion definiert? Die Deklaration mit final macht doch die Unveränderlichkeit klar? Will man damit "nur" den Zugriff ohne Einfügen der Klasse ermöglichen?
Was ist der Unterschied zwischen einer Methode und einer FUnktion? Wie findet man dieses heraus? Und warum ist println() z.B. eine Methode?


Zu Datentypen:

1. Warum werden bzw. können ausserhalb des Wertebereichs eines Datentyp liegende Zahlen trotzdem in dieses umgewandelt? Welchen Sinn hat dies? z.b byte m= (byte)200; oder m= 200y;
2. Warum ist bei den Ganzzahlendatentypen int,short,long und byte der Wertebereich im Positiven Bereich um 1 kleiner als im Negativen Bereich?
3. Warum ist folgendes eine wahre Aussage: System.out.println(2000000000F ==2000000000F+1);?


Zu Arrays:

1. Warum werden Arrays von Zahlen als UniCode dargestellt, obwohl sie doch nur eine Aneinanderreihung von Zahlen sind und diese ja nicht in UNicode umgewandelt werden?
 

M.L.

Top Contributor
Ein Versuch:
1.) Eine Klasse ist eine Blaupause für ein beliebiges Objekt. IdR wird ein beliebiges Objekt im Quellcode instanziiert.
2.) Das Zitat stammt wohl vom Openbook ? Siehe http://openbook.rheinwerk-verlag.de/javainsel/02_001.html Zum Warum: weil es sich um eine Vorgabe des JDK handelt
3.) Siehe Openbook zu Java9, Abschnitt 2.1.4: http://openbook.rheinwerk-verlag.de...02_001.htm#mjecb61a9b6f9af4b3942699e5e3bd68d1
4.) Java kennt nur Methoden: https://stackoverflow.com/questions/155609/whats-the-difference-between-a-method-and-a-function
(in anderen Programmiersprachen hängt die Unterscheidung u.a. davon ab, ob eine Klasse im Hintergrund steht)
 
K

kneitzel

Gast
Ok, das sind viele Fragen. Ich versuche mich mal daran:

Grundlegende Fragen

1. Eine Klasse beschreibt die späteren "Instanzen" dieser Klasse. Diese Instanzen werden oft einfach als Objekte bezeichnet. Kann man sich also in etwa so vorstellen wie Baupläne und die daraus gefertigten Objekte....

2. String ist eine Klasse, aber diese hat zum Teil ein spezielles Verhalten. So kann man Strings mit der + Operations aneinander ketten. Das funktioniert mit anderen Klassen und deren Instanzen nicht.

3. Die Funktion println ist eine Funktion von einer bestimmten Klasse. Die Aussage kann ich nicht 100% nachvollziehen. Wenn Du Dich auf System.out.println beziehst: Das ist ein PrintStream und der nutzt den Standard Zeichensatz der Platform. Und wenn der Standard Zeichensatz kein UTF kann, dann können die nicht angezeigt werden.

4. Konstanten sollen meist nicht mehr verändert werden. Daher wird das Schlüsselwort final verwendet. Und damit man diese Konstante auch ohne Instanz verwenden kann, wird auch meist static verwendet.
Und die Konstanten müssen nicht zwingend vor der main Funktion stehen. Sie können auch nach der Funktion kommen. Nur eben müssen diese innerhalb einer Klasse stehen und außerhalb einer Funktion, damit diese dann entsprechend zur Verfügung stehen.
Wenn man zwischen Methode und Funktion unterscheiden will, dann wird dies teilweise so gemacht, dass Methoden nichts zurück geben und Funktionen geben etwas zurück. Aber diese Unterscheidung gibt es bei Java in der Form nicht. Die Java Spezifikation (JLS) spricht in Kapitel 8.4 klar von "methods" daher wäre generell Methode der offizielle Ausdruck und die Methode kann hier Werte zurück geben.

Datentypen

1. Wenn Werte zu groß sind, dann können diese dennoch umgewandelt werden. Dabei wird aber dann sozusagen abgeschnitten. Es handelt sich um eine Umwandlung mit Verlust. (JLS 5.5 beschreibst das Casting und da gibt es bei primitiven Typen die "narrowing primitive conversion" und die "widening primitive conversion". Und dieses Umwandlung mit Verlust (narrowing) ist unter 5.1.3 im Detail erläutert. Unter dem Strich wird einfach weggelassen, was nicht passt.

2. Du hast ja eine Menge an Bits. Das erste Bit ist das Vorzeichen. Und dann hast Du x........ an Bits übrig. Also bei 8 Bits = 1 Byte hat man noch 7 Bits für den eigentlichen Wert. Aber bei positiven Vorzeichen (X Bit ist 0) hat man noch die 0. Somit hat man sowohl im positiven als auch im negativen Bereich die gleiche Anzahl an Werten (128 Werte), aber die positiven Werte fangen von 0 an (Also von 0-127) und die negativen Werte starten bei -1 und gehen daher bis zu -128.

Arrays

Also ein Array von Integers ist erst einmal ein Array von Integern. Nun ist es aber so, dass ein Zeichen auch als Integer dargestellt werden kann. Hintergrund ist, dass Strings / Zeichen intern als UTF-16 gespeichert werden. UTF-16 hat meistens 2 bytes aber kann bis zu 4 bytes benötigen. => 4 Bytes eines Integers.

Somit kann ein Array von Integern auch als UTF Zeichenreiche angesehen werden.
 

milawe

Mitglied
Vielen Dank für die ausführliche Antworten


M.L. zu 2) es stammt aus dem Openbook

kneitzel:

Ich verstehe glaub nun alles ausser die Erklärung zur Ausgabebeschränkung von prinln und der Ausgabe der Arrays als UTF Zeichenreihe. Ich bin gerade verwirrt. Der Unicode Standard 4.0 wurde doch so implementiert das für Zeichen die grösser als 16bit sind zwei Zeichen aufgewendet werden. Warum werden die Zahlen in Zeichen umgewandelt, sind wurden doch explizit als Zahlen deklariert? Ich sehe gerade nur Bahnhof.


Jedoch glaube ich langsam die Begriffe method, object und class zu verstehen. Stimmt mein folgender Gedankengang:
Die Ausdrucksanweisung System.out.println(); Besteht einerseits aus dem Objekt out der Klasse System und der Methode println() der Klasse PrintStream. Man kann doch jedes Objekt mit Methoden anderer Klassen kombinieren? Muss man die integriert Methoden nicht mit Ihren Klassen definieren (PrintStream.prinln()) bzw. wäre auch System.out.PrintStream.println() korrekt?
 
Zuletzt bearbeitet:

temi

Top Contributor
Stimmt mein folgender Gedankengang:
Die Ausdrucksanweisung System.out.println(); Besteht einerseits aus dem Objekt out der Klasse System und der Methode println() der Klasse PrintStream. Man kann doch jedes Objekt mit Methoden anderer Klassen kombinieren? Muss man die integriert Methoden nicht mit Ihren Klassen definieren (PrintStream.prinln()) bzw. wäre auch System.out.PrintStream.println() korrekt?

"out" ist eine statisches Feld der Klasse "System". Da es den Datentyp "PrintStream" hat, verfügt es über alle öffentlichen Methoden und Felder dieser Klasse.

Du kannst nicht frei kombinieren. Du kannst nur nutzen, was dir die jeweilige Klasse als öffentliche Methoden oder Felder zur Verfügung stellt.

Edit (weil es eine wichtige Ergänzung ist):

println ist eine Methode von PrintStream, die nicht statisch ist. Das bedeutet, man braucht eine Instanz. Somit kann ich nicht PrintStream.println aufrufen. Das wäre also wie der Bauplan: der Bauplan zeigt Türen an, aber um durch eine Tür zu gehen, die da eingezeichnet ist, braucht das fertige Haus das nach dem Bauplan gebaut wurde.

Aber out in System bekommt ja eine Referenz auf so eine Instanz (Also sowas wie eine Adresse von einem Haus). Somit kannst da die Instanz nutzen.



Informationen über Methoden und Felder einer Klasse (aus dem JDK) kannst du immer der Java-Dokumentation entnehmen:
https://docs.oracle.com/javase/7/docs/api/java/lang/System.html
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also vom Verständnis her hast du verstanden, dass UTF-16 Zeichen aus 2 Byte (16 Bit) bestehen. Nur manchmal reicht das nicht, und dann werden 4 Byte benutzt ('2 Zeichen' aber das finde ich unglücklich formuliert, denn es geht ja weiter um die Darstellung von einem Zeichen.

Wenn du also so ein UTF Zeichen sicher unterbringen können willst, dann brauchst du 4 Bytes.

Evtl. hilft es Dir, die ein karriertes Blatt vorzustellen. Ein Kästchen ist ein Byte. Mit zwei Kästchen kannst du viele UTF-16 Zeichen abbilden. Nur wenn das nicht reicht, dann brauchst du manchmal das doppelte also vier Kästchen.

Wenn du also ein Stück Papier abschneiden sollst, auf das ein beliebiges UTF-16 codierten Zeichen ganz drauf passt: wie viele Kästchen müsste das gross sein?

Die 4 Kästchen, denn jedes Zeichen soll ganz drauf passen.

Nun könntest Du solche Schnipsel selbst zurechtschneiden. Aber genau solche 4 Kästchen große Schnipsel gibt es schon. Wenn es um einen int geht, dann sind das genau so 4 Kästchen.

Was du in die Kästchen schreibst ist Dir überlassen. Unter dem Strich steht in jedem Kästchen eine Zahl von 0 bis 255, so dass du 4 Zahlen hast. Was diese Zahlen bedeuten kannst du beliebig festlegen.

Das könnte eine große Zahl sein. Aber dann musst du noch genau definieren, wie sich die Zahl aus den Ziffern zusammen setzt (da gibt es unterschiedliche Ansätze, will dich nicht verwirren, aber wenn dich das interessiert: Little und Big Endian wären hier die Schlagwörter). Evtl ist es aber auch eine Zahl aus weniger Bits oder Bytes und Du hast noch eine Checksumme dabei?
Oder vielleicht sollen es 4 ASCII Zeichen sein, jedes mit einem Byte dargestellt.....
Oder oder oder ....

Für den Rechner sind es erst einmal 4 Byte. Und bei int gibt es noch eine Reihe von Operationen. So kann man mit den 4 Bytes gewisse Dinge machen ..

Aber was die Entwickler gesagt haben: wir haben da schon so tolle 4 Byte Blöcke, die verwenden wir einfach.

So wurde dann int verwendet um ein UTF Zeichen zu speichern.

Was das println angeht: Systeme kennen einen bestimmten Zeichensatz. Bei Windows ist das üblicherweise eine erweiterte Form von ASCII (es kommen noch Codepages dazu). Somit kann so ein Windows Terminal kein UTF anzeigen. Es kann nur die Zeichen anzeigen, die eben die aktuelle Codepage kann.

Bezüglich System.out.println hat Temi schon geantwortet. Wichtig ist mir auch die genaue Begriffsnutzung. Die Klasse System hat ein statisches Feld (static field) out vom Typ PrintStream. Da es public ist, kann man von außen zugreifen. println ist eine Methode von PrintStream, die nicht statisch ist. Das bedeutet, man braucht eine Instanz. Somit kann ich nicht PrintStream.println aufrufen. Das wäre also wie der Bauplan: der Bauplan zeigt Türen an, aber um durch eine Tür zu gehen, die da eingezeichnet ist, braucht das fertige Haus das nach dem Bauplan gebaut wurde.

Aber out in System bekommt ja eine Referenz auf so eine Instanz (Also sowas wie eine Adresse von einem Haus). Somit kannst da die Instanz nutzen.
 
K

kneitzel

Gast
Sehe gerade, dass ich eine Frage übersehen habe. Datentypen mit Fliesskomma werden als Exponent gespeichert. Ich zeige es Mal im 10er System: Also sowas wie 0,x + 10^y. Dabei haben x und y eine gewisse Genauigkeit, d.h. die Werte sind begrenzt.

Nun hast du z.B. x auf 5 Stellen, also z.b. 0,12345 ... Und das kannst du nun mit 10 hoch 10 multiplizieren.

Wenn du da nun eine 1 addiert. Dann wäre das sowas wie 0,123450001 Mal 10 hoch 10. Aber wir haben nur 5 Stellen, daher ist das weiterhin nur 0,12345 Mal 10^10.

Bei float in deinem Beispiel ist es ebenso.

Hier ist nur noch wichtig: der Computer nutzt natürlich nicht das 10er System. Zahlen müssen im dualen System abgebildet werden. Das geht aber nicht 1:1 auf Grund der festgelegten Genauigkeit. Daher ist 0,5 nicht 0,5 sondern ein Wert ganz dicht dran (ich meine 0,4999999) und wenn man dann etwas anzeigt, dann rundet man auf etwas, das weniger genau ist als der Typ (so dass es doch wieder zu 0,500 oder so wird).
 

temi

Top Contributor
Jedoch glaube ich langsam die Begriffe method, object und class zu verstehen.

Bitte beachten, dass hier vermutlich mit "object" das Objekt im Sinne von Instanz einer Klasse gemeint ist. Das ist keinesfalls zu verwechseln mit der Klasse "Object", welche die Basisklasse für alle Klassen in Java darstellt.

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

Java:
// Dies ist eine Klasse. Der Zusatz "extends Object" muss nicht geschrieben werden, weil in Java alle Klassen automatisch von Object erben
public class Foo extends Object {
   
    // Das ist eine Methode dieser Klasse.
    public void doSomething() {
        // ...
    }
}

// foo ist eine Instanz der Klasse Foo

Foo foo = new Foo();

// da die öffentliche Methode nicht statisch ist, kann sie nur auf die Instanz aufgerufen werden

foo.doSomething(); // geht

Foo.doSomething(); // geht nicht!
 
Zuletzt bearbeitet:

milawe

Mitglied
Hmmh im Openbook steht das out ein Objekt ist? Was ist den der Unterschied zwischen einem Feld und einem Objekt? Meint man mit Feld ein Array das wiederum ein Objekt ist?
Kann ich sagen das println() da es keine statische Funktion ist eine Instanz(Objekt) benötigt und dieses durch out gegeben ist welches wiederum selbst als Objekt von Klasse deklariert wurde?
 
K

kneitzel

Gast
Also out ist eine Referenz auf eine Instanz (auf ein Objekt). Aber out selbst ist ein Feld einer Klasse,

Eine Klasse kann verschiedene Elemente haben:
- fields (Feld) dies sind Variablen die zu der Klasse (bei static) oder zu den Instanzen (wenn nicht static) gehören. Out ist also eine statische Variable die eine Referenz auf einen PrintStream (Der Type der Variablen) beinhalten kann.
- methods (Methoden) sind dann die Methoden der Klasse (static) oder Instanzen (non static).
- member types - Innerhalb einer Klasse können Unter-Typen definiert werden, also z.B. innere Klassen.
- constructors (Konstruktoren) - Dienen der Initialisierung von neuen Instanzen einer Klasse.
Das ist erst einmal eine absolute Grobeinteilung. Die Java Language Specification erwähnt noch etwas mehr... Aber das lasse ich an dieser Stelle erst einmal weg.

Also haben wir eine Klasse System. Diese Klasse hat ein "public static" field "out" vom Typ "PrintStream". In diesem field wird dann eine Referenz auf eine Instanz gespeichert.

Hier macht die JVM mit dem Java Framework einiges für Dich. Wenn Du Deine eigene Klasse hättest, dann hättest Du evtl. sowas wie hier:
Java:
public class SomeTestClass {
    // Hier ist myReference: ein Feld vom Typ SomeType welches zu der Klasse SomeTestClass gehört.
    public static SomeType myReference;
    
    static {
        // Statischer Initializer - ignorier das etwas. Den habe ich oben in der Liste nicht erwähnt ...
        // Aber hier siehst Du: Es wird eine neue Instance von SomeType erzeugt.
        // und eine Reference dazu wird in myReference gespeichert.
        myReference = new SomeType();
    }
}
 

temi

Top Contributor
Was ist den der Unterschied zwischen einem Feld und einem Objekt? Meint man mit Feld ein Array das wiederum ein Objekt ist?

Ein Feld ist einfach nur eine Variable einer Klasse. Es kann eine einfache int-Variable, aber genauso als Typ eine beliebige Klasse sein.

Beispiel:
Java:
classe Foo {
    private int simpelInt; // eine einfache Integervariable
    private Map<Integer, String> other; // auch ein Feld, aber diesmal vom Typ "Map<Integer, String>"
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
brypa Java Grundlagen Java Basics - Anfänger-Themen 97
T Java Grundlagen Java Basics - Anfänger-Themen 13
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
C Mein Video zu Java Grundlagen Java Basics - Anfänger-Themen 8
G Grundlagen der PS-Java Java Basics - Anfänger-Themen 8
J OOP Theoretische Grundlagen Java Basics - Anfänger-Themen 5
G OOP [Eilig] Biete 10€ für Lösung von 2 Grundlagen-Aufgaben Java Basics - Anfänger-Themen 6
B Lernzeit für C++ und Java Grundlagen Java Basics - Anfänger-Themen 11
G Grundlagen sitzen nicht bzw. nicht intelligent genug Java Basics - Anfänger-Themen 7
D Erste Schritte JEE Grundlagen lernen Java Basics - Anfänger-Themen 3
W Variablen Pointer Grundlagen Java Basics - Anfänger-Themen 30
J Compiler-Fehler Probleme bei Grundlagen Java Basics - Anfänger-Themen 12
B Grundlagen von Methoden an folgendem Beispiel Java Basics - Anfänger-Themen 52
D Quelle für Java-Grundlagen gesucht Java Basics - Anfänger-Themen 16
J Anfängerfrage zu Grundlagen von Packages Java Basics - Anfänger-Themen 7
D Grundlagen - Operatoren Java Basics - Anfänger-Themen 5
B Grundlagen zu Java Java Basics - Anfänger-Themen 18
G Grundlagen Bild laden und zeichen (anzeigen) Java Basics - Anfänger-Themen 2
7 Applets - einfachste Grundlagen Java Basics - Anfänger-Themen 24
M [Suche] Grundlagen der Java-Programmierung Java Basics - Anfänger-Themen 17
C Grundlagen: Methoden Java Basics - Anfänger-Themen 4
A Grundlagen Array Java Basics - Anfänger-Themen 4
T Grundlagen ganz am Anfang Java Basics - Anfänger-Themen 12
O Vererbung Grundlagen Java Basics - Anfänger-Themen 4
megachucky JDBC-Grundlagen: Verständnisprobleme Java Basics - Anfänger-Themen 31

Ähnliche Java Themen

Neue Themen


Oben