static Blocks und variablen

Panda9296

Bekanntes Mitglied
Hi Leute und zwar wollte ich mal genau wissen, warum statische variablen in static Blcoks keinen Modifer haben bzw. ob den überhaupt einer automatisch gesetzt wird, da ja eigentlich Klassenvariablen, genauso wie die globalen Variablen einen modifire besitzen
 

mrBrown

Super-Moderator
Mitarbeiter
Statische Variablen haben modifier, nicht anders als normale Variablen.

static initializer haben keine modifier, genauso wie normale Initializer – die brauchen aber auch keinen, sie werden völlig automatisch ausgeführt, man hat selbst keinen Zugriff darauf, also macht es auch gar keinen Sinn, den Zugriff zu beschränken.

statische variablen in static Blcoks
Statische Variablen stehen direkt in der Klasse, in Blöcken stehen nur lokale Variablen, die können maximal final sein.

Klassenvariablen, genauso wie die globalen Variablen
„Globale Variablen“ gibt’s in Java nicht. Klassenvariablen (also statische) werden nur oftmals so genannt.
 

mrBrown

Super-Moderator
Mitarbeiter
Globale variablen existieren von Anfang bis zum Ende eines Programms und sind überall verfügbar.
Klassen Variablen erfüllen diese Kriterien wenn sie public definiert sind. Von daher würde ich sagen globale Variablen existieren in Java.
Oder man nennt sie wie üblich Klassenvariable oder statische Variable und spart sich den Namen, unter dem jeder was anderes versteht und der nicht wirklich gut passt 🤷‍♂️

Oder man zieht es ganz durch und ergänzt noch kontinental (protected), national (default) und regional (private).
 

httpdigest

Top Contributor
Naja, hier wurde einfach der nicht ganz präzise und unqualifizierte Begriff "Modifier" verwendet.
In Java gibt es zwei verschiedene Arten von Modifier:
- Access Control Modifier: private, package, public
- Non-Access Modifiers: static, final, abstract, synchronized, volatile
Du meinst mit "Modifier" die "Access Control Modifier". Und ja, lokale Variablen haben davon keinen.
@mrBrown meint wahrscheinlich aber alle Modifier (also auch Non-Access Control Modifier) wie z.B. final (bzw. auch _nur_ final bei lokalen Variablen.
 

mrBrown

Super-Moderator
Mitarbeiter
@mrBrown meint wahrscheinlich aber alle Modifier (also auch Non-Access Control Modifier) wie z.B. final (bzw. auch _nur_ final bei lokalen Variablen.
In dem Fall meinte ich tatsächlich nur, dass normale Instanzvariablen die gleichen (bis auf static natürlich) Modifier wie statische Variablen haben können.
Aber ja, du hast das deutlich besser formuliert ausgedrückt :)
 
B

BestGoalkeeper

Gast
Typstaticstatic finalnon-staticlocal or Blockparameters
BezeichnungKlassenvariableKonstanteInstanzvariableLokale VariableParameter
Access Modifierallealleallekeinekeine
Non-Access Modifierallealleallenur finalnur final
Sichtbarkeitab Deklarationab Deklarationab DeklarationBlockMethode

Noch welche vergessen?
 

Panda9296

Bekanntes Mitglied
Also erstmal danke für die unterhaltsame Diskussion, allerdings gibt es sehr wohl Klassenvariablen, globale bzw. Instanzvariablen und lokale Variablen. Da die Frage für mein Exam noch nicht ausreichend beantwortet wurde, habe ich auch nochmal versucht, die Frage zu beantworten. Eine Variable, die in einem Gültigkeitsbereich eines statischen Feldes deklariert wurde ist auch nur in diesem Feld gültig:

Java:
static
{
    int a = 4;
}
Es ist richtig, dass lokale Variablen keinen Modifire haben. Jedoch ist es so, dass diese Variable nicht lokal ist. Sie wird deklariert und initialisiert, sobald die Klasse aufgerufen wird.

eine Klassenvariable bezeichnet zumindest Oracle im Prüfungsvorbereitungsbuch wie folgt:

Java:
public static int b= 3;
 
K

kneitzel

Gast
Es ist richtig, dass lokale Variablen keinen Modifire haben. Jedoch ist es so, dass diese Variable nicht lokal ist. Sie wird deklariert und initialisiert, sobald die Klasse aufgerufen wird.

eine Klassenvariable bezeichnet zumindest Oracle im Prüfungsvorbereitungsbuch wie folgt:

Java:
public static int b= 3;

Also wenn es um die korrekten Bezeichnungen geht, die Oracle verwendet, dann ist die Java Language Specification der Ort, den ich zum Nachschlagen der Begriffe nutzen würde.

Was für Variablen es gibt, ist in 4.12.3 definiert ("Kinds of Variables")
- class variables: Das sind Variablen, die direkt in einer Klasse mit static oder in einem Interface ohne static deklariert wurden.
- instance variables: Variablen in Klassen ohne static
- array components: Elemente eines Arrays
- Method parameters
- Constructor parameters
- Lambda parameters
- Exception parameter
- Local Variables: "Whenever the flow of control enters a block (§14.2) or for statement (§14.14),...."

Dann ist nur noch die Frage: Was ist ein "block"? Da wird man direkt auf 14.2 verwiesen: "A block is a sequence of statements, local class declarations, and local variable declaration statements within braces."

Somit ist hoffentlich auch aus Sicht von Oracle ganz klar: Du hast einen (Statischen) Block und in diesem - wie auch schon von @thecain geschrieben - eine lokale Variable.
 
K

kneitzel

Gast
Bitte vergiss den Begriff lokale Variablen, besonders dass du es in Zusammmenhang mit Instanzvariablen bringst ist Unsinn.
Hast Du Dich da verschrieben? Meintest Du nicht eher, dass er den Begriff globale Variablen vergessen soll? Denn die bringt er ja in Zusammenhang mit Instanzvariablen - dabei wären es die Klassenvariablen, die man auch als globale Variablen bezeichnen könnte (wobei ich das im Java Bereich auch eigentlich nie höre - das sind und bleiben einfach statische Variablen :) ).
 

mrBrown

Super-Moderator
Mitarbeiter
Hast Du Dich da verschrieben? Meintest Du nicht eher, dass er den Begriff globale Variablen vergessen soll? Denn die bringt er ja in Zusammenhang mit Instanzvariablen - dabei wären es die Klassenvariablen, die man auch als globale Variablen bezeichnen könnte (wobei ich das im Java Bereich auch eigentlich nie höre - das sind und bleiben einfach statische Variablen :) ).
Ha, ja, das sollte natürlich global heißen 😅
 

Blender3D

Top Contributor
dabei wären es die Klassenvariablen, die man auch als globale Variablen bezeichnen könnte (wobei ich das im Java Bereich auch eigentlich nie höre - das sind und bleiben einfach statische Variablen
Im Script der Ludwig Maximilian Unversität München wird im Bereich Java von Globalen Variablen gesprochen.
Siehe Seite 4 https://www.dbs.ifi.lmu.de/Lehre/EIP/WS1617/skript/script-kap06-3.pdf
Dann hast Du auch einmal im Bereich Java davon gehört. ;)
 

mihe7

Top Contributor
Im Script der Ludwig Maximilian Unversität München wird im Bereich Java von Globalen Variablen gesprochen.
Siehe Seite 4 https://www.dbs.ifi.lmu.de/Lehre/EIP/WS1617/skript/script-kap06-3.pdf
Dann hast Du auch einmal im Bereich Java davon gehört. ;)
Dass das in einem Skript der LMU steht, macht die Aussage aber nicht richtiger. Man kann mittels public static in vielen Fällen Klassenvariablen haben, die sich praktisch wie globale Variablen verhalten. Nur funktioniert das nicht immer, so dass Klassenvariable und globale Variable schlicht nicht gleichwertig sind.
 
K

kneitzel

Gast
Im Script der Ludwig Maximilian Unversität München wird im Bereich Java von Globalen Variablen gesprochen.
Siehe Seite 4 https://www.dbs.ifi.lmu.de/Lehre/EIP/WS1617/skript/script-kap06-3.pdf
Dann hast Du auch einmal im Bereich Java davon gehört. ;)
Vielen Dank, dass Du dafür sorgen willst, dass ich auch davon gehört habe. Wobei ich schon zuvor davon gehört habe: Hier im Forum im Thread :)

Ich wundere mich doch etwas, das eine Uni das so angeht.
Aber beim überfliegen graut es mir etwas.

Angefangen von kleinen Fehlern:

Der Code:
Java:
public class MitGlobalerVar {
    public static int sum = 0;
    
    public static void add(int x) {
        sum = sum + x;
    }
    
    public static void main(String[] args) {
        int sum = 0;
        add(3);
        add(5);
        add(7);
        System.out.println("Summe: "+sum);
    }
}

Soll die Ausgabe "Summe: 15" haben - und das glaube ich kaum :)

(Etwas später im Script wird auch explizit erwähnt, dass eine lokale Variable wie eine "globale" Variable heißen kann und dass diese lokale Variable dann die globale versteckt ...)

Und was ist mit:
"Tatsächlich muss man globale Größen und Methoden anderer Module (Klassen) explizit laden.
Dies funktioniert in Java mit der Anweisung import, die wir in Zusammenhang mit Packages noch kennen lernen werden"

Also die Namensgebung ist ungeschickt, denn hier wird das Wort Modul für Klasse verwendet. Aber ok - das Script ist vielleicht älter und stammt aus Zeiten vor Java 9, wo es noch keine Module gab. (==> Zeigt aber sehr schön auf, das es gute Grunde gibt, eben KEINE neuen Wörter zu verwenden. Die JLS definiert klare Worte und diese kann man doch bitte nutzen. Gerne eingedeutscht. Aber dann wird aus class variable nur eine Klassenvariable. Vielleicht bekommt Java ja in zukünftigen Versionen noch globale Variablen?)

Denn natürlich muss man andere Klassen nicht explizit laden. Auch wenn diese in einem anderen Package sind.

Und das ist nur, was mir beim überfliegen von ein paar wenigen Seiten direkt ins Auge gefallen ist.

Aber bei aller Kritik ist mir natürlich klar: Das war nur eine kurzer Hinweis, dass dies tatsächlich an manch einer Stelle so gelehrt wird und sollte nie eine Aussage sein bezüglich Korrektheit oder so ... Daher lasse ich am besten jede weitere "Analyse" und freue mich, dass ich das am frühen Morgen und nicht am späten Abend gelesen habe ... Die Alpträume sind mir damit hoffentlich erspart geblieben :)
 
B

BestGoalkeeper

Gast
imperativ->prozedural->Java basics ist doch kein Widerspruch :)

Wenn imperative Konzepte im Vordergrund stehen sollen, dann schreibt man alles mit static in eine Klasse; und ignoriert die Klasse sowie das static einfach...
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn imperative Konzepte im Vordergrund stehen sollen, dann schreibt man alles mit static in eine Klasse; und ignoriert die Klasse sowie das static einfach...
Wenn imperative Konzepte im Vordergrund stehen, nimmt man einfach nicht Java sondern eine Sprache, die dabei weniger Overhead erfordert :)

Wenn man alle zwei Sätze schreiben muss "das kommt erst später" hat man doch ganz offensichtlich die falsche Sprache...
 

Devanther

Top Contributor
Was ist der Unterschied zwischen private static, public static und Instanzvariablen(Variablen die man ohne static Keyword deklariert)?

Ich habe das schon sehr oft im Code gesehen, aber ich weiss es immer noch nicht -.-
 
K

kneitzel

Gast
Dann teil es auf in zwei Bereiche:
a) Sichtbarkeit (Access modifier): private, package-private (wenn nichts angegeben wurde), protected und public geben an, wie andere Klassen auf das Element zugreifen können. Eine Beschreibung hierzu findet sich z.B. unter https://o7planning.org/de/10319/zugriffsmodifikatoren-access-modifiers-in-java
b) static: Mit dem static Schlüsselwort gehört es zur Klasse, d.h. es ist keine Instanz notwendig. Ohne static Schlüsselwort gehört es zur Instanz. Siehe z.B. https://javabeginners.de/Grundlagen/Modifikatoren/static.php
 

mihe7

Top Contributor
zu b) kann man auch eine weniger technische Sichtweise einnehmen: eine Klassenvariable ist ein Attribut, das für die Gesamtheit (also nicht für jedes) der Objekte gilt. Wenn man so überlegt, wird es schon sehr schwer, vernünftige Beispiele zu finden: Konstanten, Zahl der Objekte in dieser Klasse, bestimmte Instanzen dieser Klasse (Null-Object, Singleton, ...) und dann hört es fast schon auf.
 

Devanther

Top Contributor
static: Mit dem static Schlüsselwort gehört es zur Klasse, d.h. es ist keine Instanz notwendig. Ohne static Schlüsselwort gehört es zur Instanz.

Wenn eine static Variable zur Klasse gehört, welche Vorteile hat es dann?
Statische Methoden kann man aufrufen ohne zuvor eine Instanz erzeugt zu haben, aber wie es es bei Variablen?
Was erreicht man mit Hilfe von static bei Variablen?
 

mihe7

Top Contributor
Wenn eine static Variable zur Klasse gehört, welche Vorteile hat es dann?
Statische Methoden kann man aufrufen ohne zuvor eine Instanz erzeugt zu haben, aber wie es es bei Variablen?
Was erreicht man mit Hilfe von static bei Variablen?
Das gleiche. Wie oben geschrieben: eine statische Variable (=Klassenvariable) ist ein Attribut, das sich nicht einem einzelnen Objekt sondern nur der Gesamtheit aller Objekte zuordnen lässt. Daher wird keine Instanz für den Zugriff darauf benötigt. Der Einsatz in der Objektorientierung ist aber sehr beschränkt, schließlich orientiert sich das Attribut gerade nicht mehr an Objekten :)
 

mihe7

Top Contributor
Vielleicht ein konkretes Beispiel: nehmen wir mal die Klasse Auto, dann sind Attribute wie VIN, Farbe etc. auf das einzelne Objekt bezogen, womit sie mit Instanzvariablen verwaltet werden. Wenn Du dagegen die Zahl der erstellten Auto-Objekte wissen, dann lässt sich dieses Attribut nicht auf ein Objekt der Klasse Auto abbilden. Vielmehr ist es ein Attribut, das die Gesamtheit der Objekte betrifft - es geht um die Kardinalität der Menge der Auto-Objekte. Die Kardinalität ist ein Attribut der Menge, nicht der einzelnen Elemente. Hier hilft dann eine statische Variable:
Java:
public class Auto {
    private static long count;
    private String vin;

    public Auto(String vin) {
        Auto.count++;
        this.vin = vin;
    }

    public String getVin() {
        return this.vin;
    }

    public static long numberOfInstances() {
        return Auto.count;
    }
}
 

Panda9296

Bekanntes Mitglied
Das gleiche. Wie oben geschrieben: eine statische Variable (=Klassenvariable) ist ein Attribut, das sich nicht einem einzelnen Objekt sondern nur der Gesamtheit aller Objekte zuordnen lässt. Daher wird keine Instanz für den Zugriff darauf benötigt. Der Einsatz in der Objektorientierung ist aber sehr beschränkt, schließlich orientiert sich das Attribut gerade nicht mehr an Objekten :)
Naja es eignet sich auch super als counter so wie ich das jetzt gelernt habe. Da diese Variable nicht für jedes Objekt zurückgesetzt wird.
 

mrBrown

Super-Moderator
Mitarbeiter
Naja es eignet sich auch super als counter so wie ich das jetzt gelernt habe. Da diese Variable nicht für jedes Objekt zurückgesetzt wird.
Jein, das ist zwar eine einfache Lösung, hat allerdings auch ziemliche Nachteile. Eine einfache Grundregel für statische Felder ist, dass die keinen veränderbaren Zustand haben sollten, damit fährt man nahezu nie falsch.
 

Panda9296

Bekanntes Mitglied
Jein, das ist zwar eine einfache Lösung, hat allerdings auch ziemliche Nachteile. Eine einfache Grundregel für statische Felder ist, dass die keinen veränderbaren Zustand haben sollten, damit fährt man nahezu nie falsch.
Okay danke und nützlicher Tipp. In der Vorbereitung auf das OCA finde ich immer wieder diese statischen Blöcke und auch statische Variablen als Counter. Vielleicht abe rauch nur, da es so am einfachsten ist, das abzufragen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
T Static kann nicht verändert werden Allgemeine Java-Themen 3
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B static Variable / Unterklasse Allgemeine Java-Themen 2
I Was macht static { ... } ? Allgemeine Java-Themen 8
G static inner Klassen Allgemeine Java-Themen 7
G static und dynamic linking? Allgemeine Java-Themen 32
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
G static- Methoden überschreiben Allgemeine Java-Themen 10
E Geschwindigkeit static Allgemeine Java-Themen 6
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
G Java-Befehle Native und Static Allgemeine Java-Themen 2
conan2 static-Block in Klassen Allgemeine Java-Themen 6
M JNI, static.a mit load.Library laden? Allgemeine Java-Themen 2
K Static Members von Superklasse für JEDEN Erben Allgemeine Java-Themen 6
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
M static-Methode vorschreiben Allgemeine Java-Themen 5
S singleton vs. static Allgemeine Java-Themen 7
G Object mit static Feldern speichern Allgemeine Java-Themen 9
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
P Singleton vs static Allgemeine Java-Themen 19
J parameterized und static fields Allgemeine Java-Themen 4
A Static reference to non-static field Allgemeine Java-Themen 10
S static umgehen Allgemeine Java-Themen 5
G static oder nicht Allgemeine Java-Themen 4
J Problem mit static/non-static Allgemeine Java-Themen 2
G getAppletContext() in static Methode Allgemeine Java-Themen 3
m@nu Programm-Models in Static-Objekten speichern Allgemeine Java-Themen 5
J Nicht-static variable in static variable kopieren - wie? Allgemeine Java-Themen 14
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
G static vor einem array Allgemeine Java-Themen 2
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
A JSP & static-Variablen Allgemeine Java-Themen 3
B Static Import: Syntaxfrage Allgemeine Java-Themen 2
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11
Z auf static Methode aus anderen Package zugreifen? Allgemeine Java-Themen 7
N this im public static void Allgemeine Java-Themen 3
C Communication zwischen zwei Projekte - static objects Allgemeine Java-Themen 4
S static mit abstract und in interface Allgemeine Java-Themen 10
B warum keine nested blocks Allgemeine Java-Themen 2
Final_Striker Exceptionhandling: Richtige Verwendung des Try/Catch Blocks Allgemeine Java-Themen 14
M Zurücksetzen eines try-Blocks Allgemeine Java-Themen 2
A Kein finally ausführen trotz verlassen des try blocks? Allgemeine Java-Themen 14
C Erste Schritte Variablen in abhängigkeit von Git branch Allgemeine Java-Themen 7
Fabiator Variablen Variablen Zählen Allgemeine Java-Themen 3
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Fehler bei Variablen Allgemeine Java-Themen 2
N File Path mit Variablen angeben Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben