Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#25

Re: Delphi mit Java komunizieren

  Alt 31. Jul 2006, 10:15
Felder und Methoden, ja, dass sind einfach nur Bezeichnungen in der OOP. Ein Feld entspricht eigentlich einer normalen Variablen in einer Klasse, Methoden sind wiederum entweder Prozeduren oder Funktionen in einer Klasse. Das ist es grob gesagt auch schon.
Das Beispiel mit den Feldern solltest du eigentlich in sauberen Code so gut wie nie brauchen. Zwar unterstützt Java keine Properties, aber natürlich gibt es auch hier getter und setter (und bei Beans entspricht das den Properties).
Jedenfalls gilt für guten Java Code, dass eigentlich alle Variablen private sind und du über Methoden auf diese zugreifst. Damit kann man schon eine unterschiedliche Sichtbarkeit (für's Schreiben und Lesen) ermöglichen (hat natürlich noch andere Vorteile).
Andererseits kennt Java auch keine direkten Konstanten bzw. man hat kein const Präfix sondern setzt eine Variable static final (entspricht dem Konstanten).

Ja, damit wären wir auch schon bei static. Statische Variablen und Methoden haben eine Besonderheit, sie werden an einer festen Adresse angelegt. Egal wer auf eine solche Methode/Variable zugreift, es handelt sich immer um die selbe!
Code:
class TestClass {

  static int staticFoo = 0;

  int foo = 0;

}

class Test {

  public static void main(String[] args) {
    TestClass tc1 = new TestClass();
    TestClass tc2 = new TestClass();

    tc1.foo++; // tc1.foo = 1, tc2.foo = 0
    tc1.foo++; // tc1.foo = 2, tc2.foo = 0

    tc1.staticFoo++; // tc1.staticFoo = 1, tc2.staticFoo = 1
    tc2.staticFoo++; // tc1.staticFoo = 2, tc2.staticFoo = 2
   
    TestClass.staticFoo++; // tc1.staticFoo = 3, tc2.staticFoo = 3
  }
}
Das wäre sehr einfaches Beispiel für static vs. non-static. Wichtig ist, dass du die nicht als sauberes Beispiel auffässt! Da sind einige Sachen nicht schön!
Bei statischen Variablen bzw. Methoden handelt es sich um Dinge, die für diese Klasse einzigartig sind. Legst du mit new eine neue Instanz einer Klasse an (oder nimm Create in Delphi), dann wird für diese neue Instanz eigener Speicher reserviert. Das ist auch in den meisten Fällen gewollt. Als gutes Beispiel bietet sich hier ein Bank an, es möchte sicherlich jeder Kunde auf sein Konto zugreifen und nicht alle auf eins (da würden die Staatsschulden wohl das Gemeinschaftskonto etwas tiefrot aussehen lassen). Das heißt, jede Variable (z.B. der Kontostand) wird einzeln für ein bestimmtes Objekt geändert und gespeichert. Wie gesagt, dass ist das was du normalerweise in Programmen hast.
Deswegen benötigt man auch einen neue Instanz, hat man keine neue Instanz erzeugt, wurde noch gar kein Speicher reserviert, wo also sollen die Daten hin? Legt man keine Instanz an, erwartet einen unter Java die NullPointerException (EAccessViolation unter Delphi).
Jetzt gibt es aber Dinge, die möchte man statisch haben. Statisch heißt, dass der Speicher automatisch beim Laden der Klasse angelegt wird und für diese Klasse eine feste Position hat. Es gibt auch hier zwei einfache Beispiele:
1) Die public static void main(String[] args), eine statische Methode.
Warum ist die statisch? Nun ja, wenn du das Programm startest, kannst du ja noch keine Instanz von irgendwas erzeugt haben, da bietet sich also ein statischer Einsprungpunkt an.
2) Konstanten. Diese haben die Form final static <DatenTyp> <Name> = <Wert>
Wenn ich eine Konstante habe, dann sollte sie für alle Instanzen gleich sein. Greifen wir nochmal das Beispiel des Kontos auf und sagen wir, dass ein Kontotyp als Zahl gespeichert wird. Dann steht die 1 immer für ein Girokonto und die 2 immer für ein Sparbuch, egal wessen Konto ich gerade betrachte.
Der final Teil in der Konstante sorgt dafür, dass diese auch an einer festen Adresse im Speicher steht und nicht verändert werden kann (bringt auch einige Vorteile bei Zugriff auf diese Variable).

Wichtig ist, dass man trotzdem statische Variablen/Methoden vermeidet. Man sollte sich immer überlegen, ob sie nötig sind. Es gibt wie gesagt Gründe für den Einsatz, aber man möchte ja auch nicht unnötig Speicher reserviert halten. Vorallem kann es auch zu Problemen kommen, wenn man nicht merkt dass eine Variable statisch ist (s.Bsp. Konto), würde hier versehentlich alles auf ein Konto geschrieben werden...

Für statische Methoden/Variablen gilt auch, dass der Aufruf immer direkt mit dem vorangestellten Klassennamen erfolgt. Hier erkennt man dann schnell, ob es sich um eine statische oder nicht statische Variable handelt. Nochmal am Bsp. von oben:
Code:
class TestClass {

  static int staticFoo = 0;

  int foo = 0;

}

class Test {

  public static void main(String[] args) {
    // RICHTIG:
    // Vorangestellter Klassenname macht deutlich dass es um eine statische Variable geht
    TestClass.staticFoo++;
   
    // FALSCH:
    // sollte zwar klappen, führt aber zu einem Warning!
    // ausserdem kann keiner erkennen dass diese Variable statisch ist!
    TestClass tc1 = new TestClass();
    tc1.staticFoo++;

    // AUCH FALSCH:
    // foo ist eine Instanz Variable, solch ein Aufruf ist also nicht möglich!
    TestClass.foo++;  
  }
}
Ja, was das Programm angeht, so denke ich solltest du damit eigentlich auf jedes (auch komplexe) Java Programm zugreifen können. Wie du siehst gibt es immer die Unterscheidung zwischen statisch und nicht statisch (die ich dir hoffentlich näher bringen konnte). Der Rest ist ja eigentlich nur dass Aufrufen einer Methode oder das Lesen einer Variable, aus mehr bestehen Programme ja eigentlich wieder nicht.
In meinem Beispiel ist es allerdings auf primitive Datentypen beschränkt. Natürlich kannst du auch Intanzen als Rückgabetyp bekommen. Wie man mit denen weiterarbeitet, findest du dann wiederum auf den JNI Seiten. Dort werden auch alle verwendeten Funktionen (ausser dem anlegen der JVM und JNIEnv in Delphi) erklärt. Beispielcode ist dort zwar in C, aber die Erklärungen sind auch immer ohne Code verständlich (soviel gibt es dort imho auch gar nicht). Eine Sache die noch ganz wichtig ist, Java-Strings sind Klassen! Wenn du einen String an Java übergeben willst bzw. umgekehrt, wirst du von der JNIEnv die Methoden JavaStringToString und StringToJavaString verwenden müssen (glaube die hießen so).
Ja, wie gesagt, die Basis für das Arbeiten mit Java-Programmen solltest du haben, aber ein wenig musst du dann auch noch selbst machen Ausser du zahlst gut!
  Mit Zitat antworten Zitat