Verständnisfrage

  • 4 Antworten
  • Letztes Antwortdatum
M

mitch_HD2

Fortgeschrittenes Mitglied
1
Abend zusammen,
ich hätte da mal eine Verständnis frage...

habe 2 klassen

Klasse A
Methode 1

Klasse B
Methode 2

wenn ich nun auf Methode 1 in der Klasse B zugreifen will, dann kann ich es ja wie folgt machen:
Klasse A.Methode1();

oder
Klasse A KLA = new klasse A();
KLA.Methode1();


was ist der unterschied? und was sollte ich wofür verwenden?
danke:)
 
Mit new wird eine Referenz angelegt. Das heißt es wird Speicher auf dem Heap reserviert. Wenn man ohne new arbeitet und eine Vielzahl an Variablen existieren läuft man Gefahr den Stack zu "überfüllen". -> Stackoverflow.

PRO und CONTRA:
Der Speicher kann auf dem Stack schneller angesprochen werden, ist aber (stark) begrenzt. Beim Heap sieht das anders aus. In Java kümmert sich der Garbage Collector um die Speicherverwaltung. Ist leichter zu programmieren, dafür hinsichtlich der Performance (bzw. der Möglichkeiten) schlechter.
C++ hat "out of the box" keinen GB, somit muss sich der Programmierer selbst um das Freigeben des Speichers selbst kümmern (Aufruf durch delete).
 
In deiner ersten Variante

Code:
KlasseA.methode1()

muss die Methode als static deklariert sein, z.B.

Code:
class KlasseA {
    public static void methode1() { 
        ... 
    }
}

Was das genau bedeutet, kannst du HIER nachlesen.

Schlussendlich wählt man das, was im Kontext am meisten Sinn ergibt. Einfach gesagt: statische Methoden sind Methoden einer Klasse, nicht-statische Methoden sind Methoden eines Objekts der Klasse.

Ich weiss ehrlich gesagt nicht, wie ich das verständlicher erklären kann :razz:
 
Der Standard bei Java ist das man eine Methode nur vom dazugehörigen Objekt aufgerufen werden kann.

Code:
MyObject myObject = new MyObject();

myObject.doMethode();
Der Aufruf einer Methode ohne ein Objekt nennt man ein statischen Methodenaufruf.

Code:
MyObject.doMethode();
In der Regel sollte man den ersten Fall benutzen. Statische Methoden und Variablen mit den Modifikator public sind global. Und widersprechen dem Konzept der Kapselung.

Die Speicherverwaltung ist unter Android organisiert als bei Java. Kellerautomat wäre hier das Stichwort.
Das Performanceproblem ergibt sich mehr daraus, das C und C++ maschinennahe Befehle unterstützen.
 
Um nochmal an einem Beispiel klar zu machen was der unterschied ist.

Code:
public class Auto {

    static String staticKennzeichen = "XX -XX 1234";
    String kennzeichen;

    public Auto(String newKennzeichen) {
        kennzeichen = newKennzeichen;
    }

    public static String getStaticKennzeichen() {
        return staticKennzeichen;
    }

    public String getKennzeichen() {
        return kennzeichen;
    }

}

Dann machst du:

Auto a = new Auto("AA-AA 1111");
Auto b = new Auto("BB-BB 2222");

a.getKennzeichen() gibt "AA-AA 1111" zurück.
b.getKennzeichen() gibt "BB-BB 2222" zurück.

a.getStaticKennzeichen und b.getStaticKennzeichen geben beide aber immer
"XX-XX 1234" zurück.
Das sollte man aber nicht machen sondern dann direkt
Auto.getStaticKennzeichen() aufrufen.

Es gibt einige DesignPattern bei denen man statische Methoden braucht.
Ausserdem nutzt man statische Methode oftmals für Helfer Klassen.
z.B. (ein vollkommen wahlloses Beispiel)
wenn du eine Methode brauchst die dir 2 Strings zusammen fügt (ja das braucht man nicht wirklich ist nur ein Beispiel).
Die könnte dann static sein damit man nicht jedes mal ein neues Objekt erzeugen muss.

Ein wenig zum lesen:
Klasse (Programmierung)
Objekt (Programmierung)
 
Zurück
Oben Unten