ein paar algemeiner fragen von anfänger

hallo an alle,

könnt ihr bitte mir mal helfen folgende Fragen zu beantworten?
bin Anfänger in java und ein bisschen durcheinander mit Haufen von ähnlichen Begriffen.

also Fragen:
1.was ist in java mit einem Feld gemeint? gibt es Klassen ohne Felder?
2. was ist ein Interface? wozu dienen sie?
3. was ist eine Instanzvariable und eine Klassenvariable?
4. müssen alle Exceptions programmtechnisch abgefangen werden oder nicht? (was ist eine Exception ist mir klar)
5. worin liegt der Unterschied zwischen den Begriffen Referenz, Objekt, Instanz, Exemplar und Klassentyp?

Danke im Voraus.

Hallo,

ich antworte mal mehr oder weniger frei auf dem Kopf. Das wird nicht alles absolut exakt sein.

  1. Ein „Feld“ im Zusammenhang mit Klassen ist vermutlich eine öffentliche (public) Instanzvariable. Öffentliche Instanzvariablen kann man verwenden, aber „üblicherweise“ wird diese Funktionalität über Setter/Getter-Methoden realisiert und der Wert selbst als nicht-öffentliche (private oder besser: protected) Instanzvariable gespeichert. (Also myObject.setAge(17); statt myObject.age = 17;.)

  2. Beim Erklären von Interfaces beziehungsweise in der Abgrenzung zur Vererbung tut sich alle Welt schwer. Meine spontane Definition: Interfaces schreiben „Verbindlichkeiten“ fest, die eine Klasse erfüllen muss, wenn sie das Interface implementieren will. Das sind in der Regel Methoden, die entsprechend vorhanden sein müssen und die Funktionalität hinzufügen, die nicht unbedingt Teil einer Klassenhierarchie (Vererbung) ist, sondern eher eine Aussage darüber, ob und wie diese Klasse mit unabhängigen Objekten zusammenspielen kann. Ein Standard-Interface in Java ist Serializable. Jede Klasse, die dieses Interface implementiert, ist „serialisierbar“, das heißt, ihr Inhalt kann in eine Zeichenkette überführt und aus einer Zeichenkette wieder restauriert werden (etwa zur Speicherung). Dieses „Zusatzfeature“ hat aber grundsätzlich nichts mit dem eigentlichen Zweck der Klasse zu tun.

  3. Eine Instanzvariable ist eine Variable, die für jede Instanz einer Klasse (MyClass o = new MyClass():wink: einen eigenen Wert besitzt. Eine Klassenvariable ist eine Variable, die für alle Instanzen einer Klasse denselben Wert besitzt (nennt sich auch statische Variable).

  4. Grundsätzlich: Ja. Ich glaube, die Syntax schreibt vor, jede mögliche Exception in einem try-catch-Block zu fangen oder weiter nach oben zu werfen (per throws-Klausel in der Methodensignatur). Da kommt man nicht drumrum. Was im catch-Block dann tatsächlich an Programmlogik ausgeführt wird (auch etwa gar keine), bleibt aber dem Programmierer überlassen. Das ist schwer zu verallgemeinern. Nicht jede Exception ist unerwartet. Es gibt sicher Code, der bewusst Exceptions provoziert, um etwa das Ende eines Vorgangs oder ähnliches festzustellen. Eine Ausnahme dazu sind RuntimeExceptions, die glaube ich nicht abgefangen werden müssen (können?) und die auch automatisch von einer Methode zur aufrufenden durchgereicht werden.

  5. Hier wird’s wieder unübersichtlich. Eine Referenz ist ein Verweis auf ein Objekt, also grob eine Variable. Hier wären a und b Referenzen auf dieselbe Instanz: MyClass a = new MyClass(); MyClass b = a;. Eine Änderung an a (a.setAge(17)) würde den Wert auch in b ändern, da eben beide Variablen auf dasselbe zeigen. Die Begriffe „Objekt“ und „Instanz“ sind meiner Meinung nach im üblichen Sprachgebrauch quasi deckungsleich. Jedes Objekt ist eine Instanz irgendeiner Klasse. „Exemplar“ ist mir nicht geläufig. Vermutlich auch dasselbe. Mit „Klassentyp“ kann ich ohne Kontext auch nichts anfangen. Der Begriff erscheint mir unlogisch. Wahrscheinlich ist einfach „Klasse“ gemeint. „Objekttyp“ (der Typ eines Objekts, die Klasse) ginge schon eher.

Ich hoffe, das trägt mehr zur Klärung als zur weiteren Verwirrung bei. Um ein Gefühl für die Definitionen und Begrifflichkeiten zu entwickeln, bleibt letztlich nur lesen, lesen, lesen.

  1. Ein „Feld“ im Zusammenhang mit Klassen ist vermutlich eine öffentliche (public) Instanzvariable. Öffentliche Instanzvariablen kann man verwenden, aber „üblicherweise“ wird diese Funktionalität über Setter/Getter-Methoden realisiert und der Wert selbst als nicht-öffentliche (private oder besser: protected) Instanzvariable gespeichert. (Also myObject.setAge(17); statt myObject.age = 17;.)

Hm, dann verstehe ich immer noch nicht, ob es Klassen ohne Felder gibt. Wenn eine Instanzvariable durch private oder protected gekennzeichnet ist, bedeutet das, dass die keinen Felder besitzt oder bin ich falsch?
Bin mir immer noch nicht sicher, dass ich den Begriff „Feld“ richtig verstehe. Ich habe gegoogelt und überall steht dieser Begriff nur im Zusammenhang mit Arrays.
Außerdem eine weitere Frage - wozu dienen die Methoden getXX() und setXX()? Ich brauche eine einfache Erklärung, für „Fachsprache“ bin ich leider noch nicht soweit…

Ich hoffe, das trägt mehr zur Klärung als zur weiteren Verwirrung bei. Um ein Gefühl für die Definitionen und Begrifflichkeiten zu entwickeln, bleibt letztlich nur lesen, lesen, lesen.

Die Antwort ist sehr hilfreich, mehrmals danke!

und noch eine Frage dazu…

Kann ein return; auch mitten in einer Methode stehen und warum?

„Feld“ meint (u. a.) entweder Array oder durchaus auch manchmal Instanzvariable (egal mit welcher Sichtbarkeit). Das hängt vom Kontext ab. Es gibt problemlos Klassen ohne Instanzvariablen.

Hier ein Beispiel für Setter/Getter-Methoden (age) im Vergleich zu einem öffentlichen „Feld“/Instanzvariable (name). Bei Setter/Getter-Methoden lässt sich die Korrektheit der Eingabe prüfen und es kann gegebenenfalls weiterer Code ausgeführt werden. Das ist ein wesenticher Vorteil gegenüber der öffentlichen Instanzvariable.

MyPerson.java

[code]package temp;

/**
*

  • @author marc
    */
    public class MyPerson {

    /**

    • Alter der Person
    • Dieser Wert kann nur von Methoden der Klasse geändert werden.
      */
      protected int _age;

    /**

    • Name der Person
    • Dies ist ein „Feld“, das von außerhalb der Klasse geändert werden kann.
      */
      public String name;

    /**

    • Konstruktor, setzt Standardwerte
      */
      public MyPerson() {
      _age = 0;
      name = „“;
      }

    /**

    • Setter-Methode für Alter

    • @param newAge das neue Alter
      */
      public void setAge(int newAge) throws IllegalArgumentException {
      if (newAge > 150 || newAge < 0) {
      throw new IllegalArgumentException(
      „Das Alter muss zwischen 0 und 150 liegen.“);
      }

      _age = newAge;
      }

    /**

    • Getter-Methode für Alter
    • @return das aktuelle Alter
      */
      public int getAge() {
      return _age;
      }

    /**
    *

    • @return Beschreibung des Objekts als Zeichenkette
      */
      @Override
      public String toString() {
      return "Name: " + name + ", Alter: " + _age;
      }
      }[/code]

Main.java

[code]package temp;

/**
*

  • @author marc
    */
    public class Main {

    /**
    *

    • @param args
      */
      public static void main(String args) {
      MyPerson p = new MyPerson();

      p.name = „Peter“;
      p.setAge(18);

      // Hier wird alles korrekt ausgegeben
      System.out.println(p);

      // Dieser Befehl erzeugt eine Exception
      p.setAge(2000);
      }
      }[/code]

Kann es.

Hier eine weitere Methode für MyPerson:

[code] /**
* Gibt den umgedrehten Namen zurück
*
* „Peter“ => „reteP“
*
* @return umgedrehter Name
*/
public String getReversedName() {
// Name ist leer, nichts zurückgeben
if (name.equals(„“)) return „“;

    String tmp = "";
    int i;
    int c = name.length();

    for (i = c - 1; i >= 0; i--) {
        tmp += name.charAt(i);
    }

    return tmp;
}[/code]

Das Beispiel ist etwas sinnfrei, da die for-Schleife auch wunderbar mit einem leeren Namen funktionieren würde. Auf eine andere Idee bin ich aber gerade nicht gekommen. Man nutzt das return, um bei simplen (oder im weiteren Algorithmus zu Fehlern führenden) Fällen den Methodendurchlauf abzukürzen. Der Code nach dem return wird nicht mehr ausgeführt. Ob es stilistisch gut ist, an mehreren Stellen einer Methode ein return stehen zu haben, lasse ich mal dahingestellt. Ich würde gerade als Anfänger versuchen, eine Methode so zu schreiben, dass sie auf genau ein return in der letzten Zeile hinausläuft. Hier zum Beispiel:

[code] public String getReversedName() {
String tmp = „“;

    if (!name.equals("")) {
        int i;
        int c = name.length();

        for (i = c - 1; i >= 0; i--) {
            tmp += name.charAt(i);
        }
    }

    return tmp;
}[/code]

Oder noch kürzer:

[code] public String getReversedName() {
String tmp = „“;
int i;
int c = name.length();

    for (i = c - 1; i >= 0; i--) {
        tmp += name.charAt(i);
    }

    return tmp;
}[/code]

Danke! Es ist sehr gut erklärt!

Vielleicht noch eine letzte kleine Frage :slight_smile:

2 kleine Wörter - super und this (ää, Funktionen? oder wie heißen sie richtig)

Also, mit super() komme ich mehr oder weniger klar, das funktioniert im Zusammenhang mit Vererbung. Aber was macht this kann ich irgendwie nicht nachvollziehen… Mein Problem, dass ich immer noch verschiedene Begriffe verwechsle - Methode/Konstruktor, Objekt/Instanzvariable/Variable usw… Deswegen klingen für mich die meisten Erklärungen ziemlich verwirrend.

Ja, super() ruft in einer Methode einer abgeleiteten (also einer „erbenden“) Klasse die entsprechende Methode (bzw. den Konstruktor) der vererbenden Klasse auf.

this ist innerhalb von Instanzmethoden eine Referenz auf die Instanz. Nehmen wir mal den Konstruktor von MyPerson:

/** * Konstruktor, setzt Standardwerte */ public MyPerson() { _age = 0; name = ""; }

Hier werden mit _age und name zwei Instanzvariablen angesprochen. Was hier eigentlich geschieht, ist:

public MyPerson() { this._age = 0; this.name = ""; }

Java erkennt (im Gegensatz zu etwa PHP) hier aber von sich aus, dass _age und name Instanzvariablen sind, das this muss nicht hinzugesetzt werden (kann aber).

Manchmal muss this verwendet werden, um Eindeutigkeit bei gleichlautenden Variablennamen zu schaffen:

public MyPerson(int age, String name) { _age = age; this.name = name; }

noch eine Frage von mir diesmal zu Java 2D.

Ich lese gerade Kapitel über Fonts und ihre Eigenschaften… Hierzu eine Frage - gibt es Möglichkeit nicht nur eine „normale“ Italic-Schrift (also Kursiv) für die Oberflächen zu benutzen, sondern auch nach links geneigte Schrift zu erstellen?

Gibt es sowas überhaupt?

Java 2D sagt mir jetzt gerade nichts. Kannst du dazu einen Link oder Code posten?

[/URL][url]http://www.fh-wedel.de/~si/seminare/ws00/Ausarbeitung/11.java2d/java2d1.htm

Das ist 2D-Grafikverarbeitung

[code]import java.awt.;
import java.awt.event.
;
import java.awt.geom.AffineTransform;

public class MyFrame extends Frame {
public static void main(String args) {
new MyFrame(„Hallo Welt“, 600, 400);
}

public MyFrame(String fname, int sizex, int sizey) {
    super(fname);
    setSize(sizex, sizey);
    setVisible(true);

    addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            dispose();
            System.exit(0);
        }
    });
}

@Override
public void paint(Graphics g) {
    super.paint(g);

    Font font = new Font("Serif", Font.BOLD, 36);
    AffineTransform tx = new AffineTransform();
    tx.shear(0.5, 0);
    g.setFont(font.deriveFont(tx));
    g.drawString("Hallo Welt", 100, 100);
}

}[/code]

Quellen:

„java2d font slanted left“ wäre ein geeigneter Suchstring.

Super!! Vielen Dank für Ihre Hilfe!

Ich bin immer noch ein bisschen durcheinander mit Feldern… Also, ich hab verstanden, dass bei Feldern nicht nur um Arrays, sondern auch um Instanzvariablen geht.
Somit wird ein Feld geschaffen, sobald eine neue Instanz von einer entsprechenden Klasse abgeleitet wird.
Ist ein Feld quasi ein Speicherplatz für eine Informationeinheit oder bin ich auf dem falschen Weg?
Wenn es so ist, dann verstehe ich wieder nicht, warum es Klassen ohne Felder gibt.

Sie schreiben:

„Feld“ meint (u. a.) entweder Array oder durchaus auch manchmal Instanzvariable (egal mit welcher Sichtbarkeit). Das hängt vom Kontext ab. Es gibt problemlos Klassen ohne Instanzvariablen.

Was ist mit Klassen ohne Instanzvariablen gemeint? Klassen mit Klassenvariablen? Oder Klassen nur mit Methoden?

Wenn eine Variable von einem primitiven Datentyp deklariert wird, wird für sie auch ein Feld vereinbart?

Ich glaube, ich habe eine zufriedenstellende Erklärung zum „Feld“ gefunden:

  • Es ist zum einen einfach die deutsche Übersetzung von „Array“, bezeichnet also die entsprechende Datenstruktur. → engl.: array

  • Außerdem tritt es in der Bedeutung Datenfeld auf. Diese Bedeutung wird im Sprachgebrauch gerne auch für die einzelnen Elemente assoziativer Arrays (die spielen in Java keine so große Rolle wie in anderen Sprachen) oder eben die Instanzvariablen einer Klasse entlehnt. → engl.: field

Der Begriff ist insgesamt wohl einfach schwammig und dazu noch „lost in translation“, erspart es einem aber, sich Gedanken über einen exakteren Ausdruck machen zu müssen. Für das „Array“-Feld lässt sich relativ problemlos „Array“ sagen, im anderen Fall müssten schon so sperrige Begriffe wie „Instanzvariable“ oder „Element mit dem Schlüssel ‚xyz‘“ her. (Auch in Excel sagt man zu einer einzelnen Zelle ja gerne „Feld“, obwohl das eigentlich nicht korrekt ist. Anderes Beispiel: Die einzelnen Felder eines Spielfelds.)

Klassen ohne Instanzvariablen sind einfach Klassen, die nur Methoden und/oder Klassenvariablen enthalten – jedenfalls eben keine Instanzvariablen --, ja. Du fragtest, ob es sowas gibt. Ich wollte nur ausdrücken, dass es sowas gibt und dass das nichts Besonderes ist.

Ich glaube, du hebst zu sehr auf diesen schwammigen „Feld“-Begriff ab. Im Grunde kann man völlig auf den verzichten und nur von Arrays und Instanzvariablen reden. „Feld“ ist in diesem Zusammenhang nicht mehr als ein „umgangssprachlicher“ Hilfsbegriff für eine Instanzvariable. Ob es sich dabei um einen primitiven Datentyp handelt oder nicht, ist gleichgültig.

PS: Wir können ruhig beim Du bleiben, wenn es dir nichts ausmacht. :wink: Das ist in Foren meist so üblich.