# Unterschied zwischen statisch und dynamisch



## Han (1. Aug 2005)

Hallo
Ich kenne noch nicht ganz so recht den Unterschied zwischen statisch und dynamisch.
Wir haben die beiden Begriffe folgendermaßen definiert:

dynamisch: bei Prozedureintritt erzeugt; danach unabhängig

statisch:bei Programmstart erzeugt; von Prozeduren unabhängig

und da sie oft mit Sichtbarkeitsregeln gekoppelt sind:

lokal: nur in der aktuellen Prozedur bekannt

global:überall bekannt


Der Unterschied zwischen lokal und global ist klar. Aber kann mir bitte jemand ein Beispiel zwischen den Unterschied von statisch und dynamisch nennen?

mfg,
Hannes


----------



## gast (1. Aug 2005)

grundsätzlich kann man sagen, dass etwas statisches immer etwas fest vorgegebenes ist und was dynamisches ist etwas was sich während der laufzeit eines programmes verändern kann. als beispiel kannst du dir eine liste vorstellen. wenn die liste statisch ist, dann weisst du bzw. der compiler schon zu beginn, was für elemente in der liste enthalten sind, z.b. eine bestimmte, feste anzahl an werten. wenn die liste dynamisch ist, entscheidet sich erst während des programmablaufs was für elemente in die liste aufgenommen werden bzw. später eventuell wieder entfertn werden. die 'länge' der liste variiert also, sie kann mal sehr viele elemente enthalten und später vielleicht gar kein element mehr. eine statische liste hätte aber immer die gleiche anzahl an elementen.
vielleicht hilft dir das ja ein bisschen.

gruß,
reinhold


----------



## Nova (1. Aug 2005)

Hallo,

Ich weiß nicht genau was du mit dynamisch und statisch meinst.
"Gast" beschreibt das was das Schlüsselwort "final" bewirkt, wobei das bei Objekten auch nicht 100%ig zutrifft.

Falls du das Schlüsselwort "static" meinst:
"static"-Variablen gibt es nur einmal, alle erzeugten Objekte benutzen diese Variable. Wenn ein Objekt die Variable verändert ist sie in allen Objekten verändert.
"static"-Methoden kann man dann nehmen wenn diese nicht auf ein bestimmtes Objekt zugreifen müssen (oder man müsste eine Referenz auf dieses Objekt vergeben).


mfg
Christian


----------



## Han (1. Aug 2005)

Hallo...danke für die Antworten.

Wenn ich beispielsweise static int n = 3 definiere, dann kann dieses n doch meiner Meinung auch dynamisch sein da sich der Wert verändern kann (da nicht mit final vordefiniert)......was ist also genau dynamisch?

mfg,
Hannes


----------



## Guest (1. Aug 2005)

Han hat gesagt.:
			
		

> Hallo...danke für die Antworten.
> 
> Wenn ich beispielsweise static int n = 3 definiere, dann kann dieses n doch meiner Meinung auch dynamisch sein da sich der Wert verändern kann (da nicht mit final vordefiniert)......was ist also genau dynamisch?
> 
> ...




nein, in diesem Fall kann sich der Wert nicht ändern. Jedenfalls nicht, wenn du eine Instanz der Klasse erzeugst
und versuchst über eine Methode die Wertzuweisung zu ändern. Der Wert einer statisch deklarierten und initialisierten Variable lässt sich nicht ändern. Das geht nur über eine statische Methode, oder einen Konstruktor. Der Unterschied zu final besteht darin, das sich eine mit dem Schlüsselwort final deklarierte Variable auch über eine Methode, oder den Konstruktor nicht ändern lässt.
Alles was statisch erzeugt wird gehört zur Klasse und kann zwar von einem Objekt der Klasse aufgerufen, aber nicht  im Wert verändert werden.
Warum ihr dazu noch etwas über lokale und globale Variablen gelernt habt erkläre ich so :
Eigentlich sind statische Variablen globale Variablen, weil jedes Objekt der Klasse  sie implementieren, nur eben nicht verändern kann, weil sie nur einmal zur Compilierzeit mit dem zugewiesenen Wert geladen werden. Von lokalen Variablen spricht man eigentlich, wenn Variablen in einem Block deklariert werden oder in einer Methode. Dann sind sie nur in diesem Block bzw in dieser Methode sichtbar, was aber natürlich wiederum nicht ausschließt, das du diese Methode von jedem Objekt der Klasse aufrufen kannst. 

LG
Gabi


----------



## messi (1. Aug 2005)

Gabi hat gesagt.:
			
		

> Der Wert einer statisch deklarierten und initialisierten Variable lässt sich nicht ändern. Das geht nur über eine statische Methode, oder einen Konstruktor. Der Unterschied zu final besteht darin, das sich eine mit dem Schlüsselwort final deklarierte Variable auch über eine Methode, oder den Konstruktor nicht ändern lässt.
> Alles was statisch erzeugt wird gehört zur Klasse und kann zwar von einem Objekt der Klasse aufgerufen, aber nicht  im Wert verändert werden.


Wus?

```
public class Test {
    static int n = 3;

    public void addiere(int summand) {
        n += summand;
    }
}
```
Warum sollte das nicht gehen?

Außerdem gibt es keine globalen Variablen. Es gibt nur (lokale) Variablen und Objekt-Eigenschaften oder Klassen-Member.


----------



## sisko78 (1. Aug 2005)

Was sollen denn im Java Kontext dynamisch bedeuten bzw. was hat das denn mit dem static Schlüsselwort zu tun? ???:L 
Kenne statisch vs dynamisch im Zusammenhang mit Typisierung bei verschiedenen Sprachen.


----------



## Guest (2. Aug 2005)

messi hat gesagt.:
			
		

> Gabi hat gesagt.:
> 
> 
> 
> ...


ok, du hast recht und was ich ausdrücken wollte war eigentlich etwas anderes. Wenn ich eine statische Variable ändere, ist der Wert beim nächsten Laden der Klasse gespeichert, also nicht mehr der ursprünglich zugewiesene Wert 3.
Als globale Variable bezeichne ich eigentlich eine nicht statische Variable, die außerhalb einer Methode aufgerufen wird, aber du hast in sofern Recht, als dass man in Java von Attributen und Variablen spricht, wobei ich gelernt habe, dass es statische Attribute gibt und objektlokale Attribute. Und davon abgegrenzt Variablen, die in Methodenrümpfen deklariert werden. 

LG
Gabi


----------



## Han (2. Aug 2005)

Danke...ist mir jetzt klar.
mfg,
Hannes


----------



## bygones (2. Aug 2005)

nachtrag:


> Der Wert einer statisch deklarierten und initialisierten Variable lässt sich nicht ändern. Das geht nur über eine statische Methode, oder einen Konstruktor. Der Unterschied zu final besteht darin, das sich eine mit dem Schlüsselwort final deklarierte Variable auch über eine Methode, oder den Konstruktor nicht ändern lässt.
> Alles was statisch erzeugt wird gehört zur Klasse und kann zwar von einem Objekt der Klasse aufgerufen, aber nicht im Wert verändert werden.


statische Variablen sind nicht objektbezogene Variablen, sonder Klassenbezogene. D.h. das ändern einer statischen Variable wirkt sich somit auf alle Instanzen der Klasse aus, da alle Instanzen die selbe Variable teilen. Ändern lassen sich aber die statischen Variablen immer.

Das Wort final macht Vartiablen zu Konstanten und diese können NICHT geändert werden !


----------

