Java 8 - OCA-Fragen: Probleme/Unklarheiten

Beowend

Mitglied
Hallo,
möchte nicht einen fremden Thread kapern, daher stelle ich meine Fragen hier rein.

What is the output of the following code?
public class InitializerBlocksExample {
static int x;
static {
x = 5;
System.out.println("Static Initializer Block: x = " + x);
}
{
x = 10;
System.out.println("Initializer Block: x = " + x);
}
public static void main(String[] args) {
System.out.println("Main Method: x = " + x);
}
}

(a) Static Initializer Block: x = 5
Initializer Block: x = 10
Main Method: x = 10
(b) Static Initializer Block: x = 5
Initializer Block: x = 10
Main Method: x = 5
(c) Static Initializer Block: x = 10
Initializer Block: x = 10
Main Method: x = 10
(d) Static Initializer Block: x = 10
Initializer Block: x = 10
Main Method: x = 5
Answer: (a) Static Initializer Block: x = 5, Initializer Block: x = 10, Main Method: x = 10

So laut KI!

Da allerdings kein Obj. der Klasse instanziert wird, greift der Instanz Initializer nicht. Daher müsste doch die Ausgabe folgend lauten, oder?:

Static Initializer Block: x = 5
Main Method: x = 5

also keine der oben angegebenen Antworten ist richtig!
 

Beowend

Mitglied
What is the output of the following code?

public class MyClass {

static {

System.out.println("Static block 1");

}

static {

System.out.println("Static block 2");

}

{

System.out.println("Instance block 1");

}

{

System.out.println("Instance block 2");

}

public MyClass() {

System.out.println("Constructor");

}

public static void main(String[] args) {

new MyClass();

}

}

A. Static block 1, Static block 2, Instance block 1, Instance block 2, Constructor

B. Static block 1, Instance block 1, Static block 2, Instance block 2, Constructor

C. Instance block 1, Instance block 2, Static block 1, Static block 2, Constructor

D. Instance block 1, Static block 1, Instance block 2, Static block 2, Constructor

Answer: B (sagt die KI...)

Ich sage: A! korrekt?
 

Beowend

Mitglied
Zwei weitere komische Antworten der KI:

Can instance initializer blocks throw exceptions?

a) Yes, any type of exception can be thrown from an instance initializer block

b) No, instance initializer blocks cannot throw exceptions

c) Yes, but only checked exceptions can be thrown from an instance initializer block

d) Yes, but only unchecked exceptions can be thrown from

Answer is b) No, instance initializer blocks cannot throw exceptions.

Ist a) nicht die korrekte Antwort?




Which of the following statements about instance initializer blocks is true?

a) Instance initializer blocks are used to initialize instance variables.

b) Instance initializer blocks are executed before the constructor.

c) Instance initializer blocks can access static variables.

d) Instance initializer blocks can access local variables.

Answer: b) Instance initializer blocks are executed before the constructor.

a) ,b) und c) sehe ich hier als richtig.
 

KonradN

Super-Moderator
Mitarbeiter
also keine der oben angegebenen Antworten ist richtig!
Probiere es doch einfach aus - Du hast einen ausführbaren Code, also kannst Du es direkt testen.

Ich weiss nicht, was Du für eine KI verwendest, aber wenn Du ChatGPT und Co verwendest, dann solltest Du wissen, dass da auch Antworten frei erfunden werden oder so ... Das ist also keine verlässliche Quelle für irgendwelche Informationen!

Da allerdings kein Obj. der Klasse instanziert wird, greift der Instanz Initializer nicht. Daher müsste doch die Ausgabe folgend lauten, oder?:

Static Initializer Block: x = 5
Main Method: x = 5
Genau, das hast Du richtig erkannt.
 

Beowend

Mitglied
Tatsächlich verwendet ich ChatGPT. Und ich sehe da soviele falsche Antworten. Leider doch keine wirklich alternative Quelle um mir Fragenblöcke zur OCA-Prüfung generieren zu lassen.
Danke dir für deine Hilfe :)
 

KonradN

Super-Moderator
Mitarbeiter
Ich sage: A! korrekt?
Ich sage: Ausprobieren!

Du kannst alles einfach ausprobieren und ich würde Dir raten, das auch im Detail zu machen.

Can instance initializer blocks throw exceptions?
Probiere es aus - also einfach einmal das Beispiel aus der ersten Frage nehmen und da eine Exception einfügen:
Java:
public class InitializerBlocksExample {
    static int x;
    static {
        x = 5;
        System.out.println("Static Initializer Block: x = " + x);
        if (x == 5) throw new RuntimeException("Test");
    }
    {
        x = 10;
        System.out.println("Initializer Block: x = " + x);
    }
    public static void main(String[] args) {
        System.out.println("Main Method: x = " + x);
    }
}

Geht es? Oder geht es nicht?
Wenn es geht: Was für eine Exception ist es? Es sind ja zwei Arten von Exceptions genannt worden. Was müsste man noch testen? Was könnte man also ausprobieren?

d) Instance initializer blocks can access local variables.
Das ist generell nicht falsch. Das müssen aber natürlich lokale Variablen des instance initializer blocks sein.
Java:
    {
        x = 10;
        System.out.println("Initializer Block: x = " + x);
        int y = 10;
        System.out.println("y := " + y);
    }

Die Frage ist also etwas ungünstig gestellt, aber generell geht es so es eine lokale Variable innerhalb des Blocks ist.

Tatsächlich verwendet ich ChatGPT. Und ich sehe da soviele falsche Antworten. Leider doch keine wirklich alternative Quelle um mir Fragenblöcke zur OCA-Prüfung generieren zu lassen.
Danke dir für deine Hilfe :)
Da ist halt wirklich wichtig, dass Du selbst Dinge ausprobierst. Spiel damit herum. Nur durch das Schreiben von Code lernt man auch wirklich Java. Da führt also kein Weg dran vorbei.
 

Beowend

Mitglied
und weiter gehts, knobelt ChatGPT das wirklich aus? Totaler Nonsens:

Which of the following statements about instance initializer blocks is false?

a) Instance initializer blocks are executed for each instance of a class.

b) Instance initializer blocks can be used to assign initial values to instance variables.

c) Instance initializer blocks can throw checked exceptions.

d) Instance initializer blocks cannot have a return type.

Answer: c) Instance initializer blocks can throw checked exceptions.

Hier ist keine der Antworten falsch, richtig?
 

Beowend

Mitglied
Tatsächlich teste und schreibe ich den Code via IntelliJ. Wobei ich hier JavaSDK 20 einsetze und Prüfung läuft unter Java 8!
Kann ja sein, dass sich von Java 8 -> Java 20 so viel verändert hat!
Müsste dazu die wirklichen extremen Änderungen kennen, um dann ggf. SDK 8 nach zu installieren und zu nutzen.

Generell bin ich ein Freund vom selber schreiben, komme ja noch aus der alten Schule: "Wer schreibt, der bleibt!"
Mit fast 60 sollte es so sein. Und dennoch hoffe ich manchmal ohne die Daddelmaschine auskommen zu können. Einfach in die Sonne setzen, Frageblöcke durchgehen und kontrollieren, wo es tatsächlich noch bei mir klemmt. Mein Englisch ist auch ein wenig eingestaubt ^^
 

KonradN

Super-Moderator
Mitarbeiter
Dann lass und doch einfach einmal zu jeder Antwort paar Gedanken machen...
Which of the following statements about instance initializer blocks is false?

a) Instance initializer blocks are executed for each instance of a class.
Hier ist die Frage doch einfach:
a) Was macht denn ein instance initalizer block?
b) Kannst Du einen Code schreiben, der diese Aussage / Antwort bestätigt?

b) Instance initializer blocks can be used to assign initial values to instance variables.
Das wird ggf. durch das obrige bereits beantwortet. Aber falls nicht: Schreibe Code, der das zeigt und führe ihn aus!

c) Instance initializer blocks can throw checked exceptions.
a) Wie sind denn die Anforderungen für checked exceptions in Java? Was erfordern diese?
b) Kannst Du es mit Code ausprobieren?

d) Instance initializer blocks cannot have a return type.
Hier ist es einfach mal umgedreht: Hast Du irgend eine Möglichkeit, so einem Block einen Return Type zu geben?
Answer: c) Instance initializer blocks can throw checked exceptions.
Hier ist keine der Antworten falsch, richtig?
Also Du kannst davon ausgehen, dass bei so Fragen dann wirklich eine Antwort falsch sein muss. In der Prüfung also zur Not überlegen, bei welcher Du Dir das am ehesten vorstellen könntest. Und wenn Die Antwort c richtig ist, dann kannst Du ja ein Java Code schreiben, der eine checked Exception wirft. Probiere es doch einmal aus! (Und das ist ja auch schon das Thema in #3!)
 

KonradN

Super-Moderator
Mitarbeiter
Tatsächlich teste und schreibe ich den Code via IntelliJ. Wobei ich hier JavaSDK 20 einsetze und Prüfung läuft unter Java 8!
Dann teste mit Java 8! Also einfach in IntelliJ einstellen. Bei einem neuen Projekt einfach die Java 8 Version auswählen. Wenn es noch nicht auf Deinem Rechner ist, dann kann IntelliJ Dir das herunter laden.

Prinzipiell kannst Du aber auch Java 20 nutzen und einfach Source Level auf Java 8 setzen.

Kann ja sein, dass sich von Java 8 -> Java 20 so viel verändert hat!
Ja, es hat sich einiges getan. Aber nicht in diesen Kern Themen. Wenn es um switch statements geht, da gab es einiges Neues und es gibt einige neue Konstrukte. Aber ich denke, Du wirst nicht auf eine Frage kommen, wo eine Antwort sich grundlegend ändern dürfte (Aber ich habe die Fragen nicht im Kopf - also mag sein. Daher ist das Vorgehen, das ich genannt habe, auf jeden Fall anzuraten).

Generell bin ich ein Freund vom selber schreiben, komme ja noch aus der alten Schule: "Wer schreibt, der bleibt!"
Mit fast 60 sollte es so sein. Und dennoch hoffe ich manchmal ohne die Daddelmaschine auskommen zu können. Einfach in die Sonne setzen, Frageblöcke durchgehen und kontrollieren, wo es tatsächlich noch bei mir klemmt. Mein Englisch ist auch ein wenig eingestaubt ^^
Ja, das kann ich nachvollziehen. Ich bin z.B. ein Bücher Liebhaber. Aber es ist leider so, dass man sich ohne Computer so Dinge nicht erarbeiten kann. Man muss das wirklich ausprobieren. Ich neige dazu, dann mit Stift und Papier Dinge aufzuschreiben um diese dann im Anschluss gezielt auszuprobieren.
 

Beowend

Mitglied
Hier noch so ein Beispiel (und tatsächlich widerspricht sich ChatGPT selbst :rolleyes:)

1.
What is the order of execution for initialization elements in a Java class?

A. Static variables, static initializer blocks, instance variables, instance initializer blocks, constructors.

B. Static variables, instance variables, static initializer blocks, instance initializer blocks, constructors.

C. Instance variables, instance initializer blocks, static variables, static initializer blocks, constructors.

D. Instance variables, static initializer blocks, instance initializer blocks, static variables, constructors.

Answer: B


Explanation: The order of execution for initialization elements in a Java class is: static variables and static initializer blocks (in the order they appear), followed by instance variables and instance initializer blocks (in the order they appear), and finally constructors.

Lol, in der Erklärung kommt schon der Widerspruch zur angegebenen Lösung!

2.
What is the order of initialization in Java?

A. Static variables, static initializer blocks, instance variables, instance initializer blocks, constructors.

B. Instance variables, instance initializer blocks, static variables, static initializer blocks, constructors.

C. Static initializer blocks, static variables, instance initializer blocks, instance variables, constructors.

D. Static variables, instance variables, static initializer blocks, instance initializer blocks, constructors.

Answer: C

Und hier wäre dann wohl A. richtig, oder?. ==> Puh, jetzt bin ich total verwirrt!
 

Beowend

Mitglied
Ja, das kann ich nachvollziehen. Ich bin z.B. ein Bücher Liebhaber. Aber es ist leider so, dass man sich ohne Computer so Dinge nicht erarbeiten kann. Man muss das wirklich ausprobieren. Ich neige dazu, dann mit Stift und Papier Dinge aufzuschreiben um diese dann im Anschluss gezielt auszuprobieren.
Oh ja, ich auch! Ich war wirklich sauer und traurig, dass mein Kursunternehmen nur Bücher in digitaler Form bereitgestellt hatte.
Habe mir dann doch das ein oder andere Buch selbst gekauft. Klar kommt man ohne PC nicht aus, aber wie du schriebst, kann man schon vieles ohne machen oder auf Papier und dann erst durchtesten.
 

Beowend

Mitglied
Hier eine Frage, die ich jetzt nicht wirklich vom Sinn her verstehe.

Which of the following is true regarding the accessibility of instance initializer blocks?

A. Instance initializer blocks can have any access modifier.

B. Instance initializer blocks can only have public access.

C. Instance initializer blocks can only have private access.

D. Instance initializer blocks cannot have any access modifier.

Answer: D

Variable können doch Access Modifyer haben:
private static String name;
private String adresse;

Meinen die jetzt, ob man im Initializer den Modifyer ändern kann, oder wenn keiner zuvor angegeben, einen hinhzufügen?
 

White_Fox

Top Contributor
Hier noch so ein Beispiel (und tatsächlich widerspricht sich ChatGPT selbst :rolleyes:)
Naja, davor sind Menschen auch nicht gefeit, und Chatty lernt auch nur von Menschen. ;)


Hier eine Frage, die ich jetzt nicht wirklich vom Sinn her verstehe.

Which of the following is true regarding the accessibility of instance initializer blocks?
Ist mit instance initializer block der Konstruktor gemeint? Der kann jeden Zugriffsmodifizierer haben, der kann durchaus auch private sein (kann man machen, wenn man ein Singleton bauen will).
 

KonradN

Super-Moderator
Mitarbeiter
Im Thread sind doch an vielen Stellen schon vorgekommen. Daher bin ich gerade etwas entsetzt.

Nehmen wir einfach mal eine Aussage aus #11:
Explanation: The order of execution for initialization elements in a Java class is: static variables and static initializer blocks (in the order they appear), followed by instance variables and instance initializer blocks (in the order they appear), and finally constructors.

Also ist doch bereits klar, dass instance initializer blocks keine constructors sein können.

Nehmen wir einfach mal etwas Code aus dem Thread und fügen paar Kommentare ein. Einfach den Code aus dem ersten Post:
Java:
public class InitializerBlocksExample {
    static int x; // static variable. Wird als erstes initialisiert! (Da hier kein Wert zugewiesen wird, wäre hier eine Zuweisung von 0!)

    // static initializer block - Kommt an zweiter Stelle ...
    static {
        // Zuweisung mal raus genommen - dann sieht man: x = 0!
        System.out.println("Static Initializer Block: x = " + x);
    }
    
    int y; // Mal eine instance Variable hinzugefügt. Diese wird auch initialisiert - Step 3.

    // instance initializer block
    {
        x = 10;
        System.out.println("Initializer Block: x = " + x);
        System.out.println("Initializer Block: y = " + y);
    }

    // Jetzt gibt es natürlich hier noch keinen Konstruktor, aber den kann man natürlich noch einfügen ...
    // Das lasse ich aber einfach einmal ...
    
    public static void main(String[] args) {
        System.out.println("Main Method: x = " + x);
    }
}

Damit ist der Begriff hoffentlich geklärt, oder? Man kann das natürlich auch in der JLS nachlesen in Kapitel 8.6:
Chapter 8. Classes (oracle.com)

Also kann man nun schauen: Kann man vor die geschweifte Klammer ein public, private oder ähnliches davor packen?
Man kann sich auch überlegen, was das für eine Bedeutung haben sollte? Was könnte man damit denn ausdrücken wollen? (Vielleicht habt ihr ja eine super Idee für ein JEP?)
Die JLS zeigt da aber auch recht deutlich - so ein instance initializer block ist einfach nur ein block. Also kein Modifier!
 

KonradN

Super-Moderator
Mitarbeiter
Ach so - wir haben jetzt natürlich die Reihenfolge noch nicht im Detail benannt. Es kann natürlich sein, dass erst alle Variablen initialisiert werden und dann die Blöcke ablaufen. Das Problem ist, dass wir die Initialisierung erst einmal nicht in der Ausgabe sehen. Also bauen wir uns eine kleine Methode, damit wir eine Ausgabe bekommen:

Java:
    public static int initWithOutput(int value, String message) {
        System.out.println(message);
        return value;
    }

Diese Methode können wir nun in der Initialisierung nutzen. Machen wir also ein kleines Beispiel, das uns dann die ganze Reihenfolge zeigt:
Java:
public class InitializerBlocksExample {
    static int x = initWithOutput(5, "initialization of x!");

    static {
        System.out.println("Static Initializer Block: x = " + x);
    }

    int y = initWithOutput(10, "initialization of y!");
    {
        System.out.println("Initializer Block: y = " + y);
    }

    public InitializerBlocksExample() {
        System.out.println("Constructor");
    }
    
    public static int initWithOutput(int value, String message) {
        System.out.println(message);
        return value;
    }

    public static void main(String[] args) {
        new InitializerBlocksExample();
    }
}

Und dann bekommen wir natürlich auch die Ausgabe, die wir erwartet haben:
Code:
initialization of x!
Static Initializer Block: x = 5
initialization of y!
Initializer Block: y = 10
Constructor

Aber da kann man sich natürlich auch einfach paar Gedanken zu machen. Wieso ist das so?

Wenn wir mit einer Klasse etwas machen wollen, dann muss diese Klasse als erstes geladen werden. Es wird also eine Instanz von Class erzeugt vom Classloader. Dabei wird die Klasse auch initialisiert, d.h. die statischen Elemente werden initialisiert. Es kommen also die ersten zwei Dinge, die wir in der Ausgabe sehen. Es hobt keinerlei Instanz, daher kann auch noch keine Variable initialisiert werden.

Dann wird die Instanz erzeugt. Da kann dann auch erst die Initialisierung der Instanz erfolgen.
 

KonradN

Super-Moderator
Mitarbeiter
Das können wir natürlich auch direkt einmal austesten - ich kann ja viel vom Pferd erzählen, aber das hat ja keinen Wert, wenn man das nicht auch direkt ausprobieren und dann so nachvollziehen kann.

Also müssen wir erst einmal die main Methode in eine andere Klasse verschieben. Also machen wir eine Klasse Main mit einer main Methode.
Dann schreiben wir eine erste Ausgabe: "Start!"
Dann laden wir die Testklasse. Hier erwarten wir die erste Ausgabe.
Dann kann Main etwas schreiben
Und dann erzeugen wir eine Instanz der Testklasse...

Das sieht dann z.B. so aus:
Java:
package de.kneitzel;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println("Start!");
        Class testclass = Class.forName("de.kneitzel.TestClass");
        System.out.println("==============");
        new TestClass();
    }
}

Die TestClass wäre dann der Code so wie zuvor:
Java:
package de.kneitzel;

public class TestClass {
    static int x = initWithOutput(5, "initialization of x!");

    static {
        System.out.println("Static Initializer Block: x = " + x);
    }

    int y = initWithOutput(10, "initialization of y!");
    {
        System.out.println("Initializer Block: y = " + y);
    }

    public TestClass() {
        System.out.println("Constructor");
    }
    
    public static int initWithOutput(int value, String message) {
        System.out.println(message);
        return value;
    }
}

Das kann man dann ausführen:
Code:
Start!
initialization of x!
Static Initializer Block: x = 5
==============
initialization of y!
Initializer Block: y = 10
Constructor

Damit haben wir dann die Bestätigung, dass die vorherigen Überlegungen richtig waren.

Wichtig: Das hätte man auch alles direkt an der JLS zeigen können. Die JLS definiert das alles auch ganz klar und deutlich. Aber darauf habe ich verzichtet, denn hier sind zwei wichtige Punkte:
a) Gesunder Menschenverstand - wenn man nur etwas verstanden hat, was denn da abläuft, dann erklärt es sich von ganz alleine. Wenn die Klasse noch nicht geladen worden wäre, dann würde das new TestClass() eben auch genau so ein Laden der Klasse durchführen, wie es eben der explizite Aufruf getan hat.
b) Ich will vor allem Code zeigen, damit deutlich wird, wie man damit spielen könnte. Das soll also eine Grundlage sein, die dazu auffordern soll, da noch etwas mehr mit zu spielen! Mach da paar mehr Anpassungen!

An der Stelle evtl. noch ein kleiner Hinweis: Die Klasse hätte vielleicht der eine oder andere so geholt:
Class testclass = TestClass.class;

Die Entwickler haben aber einige Performance Optimierungen gemacht und da ist dann klar: Das ist nichts, das vor dem Aufruf gemacht werden muss. Bei dem Aufruf mit dem Class.forName wird der Zusammenhang aber nicht erkannt und daher wird da nichts optimiert und wir erhalten unsere erwartete Ausgabe.
 

Beowend

Mitglied
Nehmen wir einfach mal eine Aussage aus #11:


Also ist doch bereits klar, dass instance initializer blocks keine constructors sein können.
Das kam auch nicht von mir, mir ist der Unterschied zwischen Initializern und Konstruktoren bewußt.

Ich wollte in #11 lediglich aufzeigen, dass sich ChatGPT total selbst widerspricht, selbst bei einer Aufgabe in der Erklärung :cool:
 

Beowend

Mitglied
An der Stelle evtl. noch ein kleiner Hinweis: Die Klasse hätte vielleicht der eine oder andere so geholt:
Class testclass = TestClass.class;
Frage: Wieso überhaupt die Zeile? Geht doch auch ohne.

Java:
package chapter1;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println("Start!");
        //Class testclass = Class.forName("chapter1.TestClass");
        System.out.println("==============");
        new TestClass();
    }
}

class TestClass {
    static int x = initWithOutput(5, "initialization of x!");

    static {
        System.out.println("Static Initializer Block: x = " + x);
    }

    int y = initWithOutput(10, "initialization of y!");
    {
        System.out.println("Initializer Block: y = " + y);
    }

    public TestClass() {
        System.out.println("Constructor");
    }

    public static int initWithOutput(int value, String message) {
        System.out.println(message);
        return value;
    }
}

Start!
==============
initialization of x!
Static Initializer Block: x = 5
initialization of y!
Initializer Block: y = 10
Constructor
 

KonradN

Super-Moderator
Mitarbeiter
Es ging dabei einfach um eine saubere Trennung, was wann passiert. Einmal halt das Laden der Klasse und dann die Erstellung der Instanz.

Das ist also nur zur Demonstration.
 

Beowend

Mitglied
Verstanden, du wolltest die Klasse ansich erstmal laden.

Jetzt ne andere Aufgabe, wobei mir die Lösung nicht wirklich klar ist:

Java:
   public class MyApp {

    String myStr = "7007";

    public void doStuff(String str){
        int myNum = 0;
        try{
            String myStr = str;
            myNum = Integer.parseInt(myStr);
        } catch (NumberFormatException ne){
            System.err.println("Error");
        }
        System.out.println("myStr: " + myStr + ", myNum: " + myNum);
    }

    public static void main(String[] args) {
        MyApp obj = new MyApp();
        obj.doStuff("9009");
    }
}

What is the result?
A. myStr: 9009, myNum: 9009
B. myStr: 7007, myNum: 7007
C. myStr: 7007, myNum: 9009
D. Compilation fails

Ich hätte tatsächlich auf A. gesetzt.
 

Beowend

Mitglied
Ich meine, weil myStr innerhalb try/catch nur dort gültig ist. Also wird by der Methode ansich aufgerufen über die Instanz die Instanzvariable myStr benutzt.
 

KonradN

Super-Moderator
Mitarbeiter
Innerhalb des try Blocks wird die Instanzvariable myStr mit einer lokalen Variable myStr verdeckt. Die Änderung erfolgt daher auf der lokalen Variablen myStr und die Instanzvariable myStr bleibt unverändert.

Bei der Ausgabe wird dann aber wieder auf die Instanzvariable zugegriffen und daher ist myStr die unveränderte 7007.

Wichtig: Die lokale Variable ist nicht im catch Block, wie man bei Deinem Text meinen könnte. Also:
Java:
{
    // Start des Blocks ist hier!
    String myStr; // Deklaration lokale Variable ...
    // Hier ist die Variable dann gültig...
}   // Hier endete die Gültigkeit!

Wichtig: Eine lokale Variable muss initialisiert werden, ehe man sie lesen kann. Hier ist die Frage, wie man "Variable ist gültig" definiert. Wenn man damit auch meint, dass die Variable einen gültigen Inhalt hat, dann würde es erst mit der Initialisierung anfangen.
 

Beowend

Mitglied
Mal ne ganz blöde Anfängerfrage:
In den Frageblöcken kommt immer wieder mal die Frage nach der korrekten Reihenfolge der Zugriffsmodifikatoren (Methoden, Felder..) oder man Methoden vor oder nach dem Konstruktor, Instanz Variable vor oder nach Klassenvariablen definiert usw.

Gilt das Prinzip wenig -> mehr (private, protected, public) oder umgekehrt?
Instanzvariable vor Klassenvariable oder umgekehrt?
Methoden vor oder nach Konstruktor?
 

KonradN

Super-Moderator
Mitarbeiter
Ach je, da ist die Frage, auf was sich so Fragen im Detail beziehen. Prinzipiell ist es Java egal, in welcher Reihenfolge Du die Elemente der Klasse platzierst.

Aber es macht natürlich Sinn, sich hier eine Systematik zu überlegen, damit man in großen Klassen findet, was man braucht.

Was es von Oracle "offiziell" gibt, ist evtl. Code Conventions for the Java Programming Language: 3. File Organization (oracle.com)
Da ist bezüglich der Methoden klar gesagt:
These methods should be grouped by functionality rather than by scope or accessibility. For example, a private class method can be in between two public instance methods. The goal is to make reading and understanding the code easier.
und genau dem schließe ich mich auch an.

Was halt in der Klasse in der Regel als Ordnung vorliegt (Und auch da auf der verlinkten Seite zu finden ist):
  • statische Variablen (in der Regel sind das dann public static final Konstanten).
  • Instanzvariablen
  • Konstruktoren
  • Methoden

Aber ich möchte nicht ausschließen, dass es da ggf. noch andere Dokumentationen gibt und sich so Fragen dann drauf beziehen.
 

Beowend

Mitglied
Richtig, Java ist es schnurze. Dennoch gibbet diese "blöden" Fragen in der OCA-Prüfung.
Und wie sieht es mit den Sichtbarkeiten (private, protced, public) aus? eng nach weit oder weit nach eng?
Diese Punkte könnten u.U. entscheidend sein :rolleyes:
 

KonradN

Super-Moderator
Mitarbeiter
Auf der verlinkten Seite sagt Oracle klar: egal.

Hast Du mal nach der genauen Frage gesucht in Google bzw. woher hast Du die Frage?

Wenn es eine Antwort sein muss und es kein egal oder nach Funktionalität gibt, dann würde ich von weit nach eng sagen. Also erst public, dann protected, package private und private.
 

Beowend

Mitglied
Hatte per AI die OCA-Fragen zu dem Thema generieren lassen. Ohne jetzt wirklich auf richtige/falsche Antwort Gewichtung zu legen.
Da kamen halt die Fragen zu obig genannten Themen vor.
 

tauchen

Mitglied
Wieso führst du die Snippets nicht einfach selber aus, sondern fragst hier jedes Mal nach? Programmieren lernt man am einfachsten durch programmieren.

CGPT ist auch immer nur so gut wie die Eingabe...
 

KonradN

Super-Moderator
Mitarbeiter
Hatte per AI die OCA-Fragen zu dem Thema generieren lassen. Ohne jetzt wirklich auf richtige/falsche Antwort Gewichtung zu legen.
Da kamen halt die Fragen zu obig genannten Themen vor.
Bei sowas hilft es nur, die Dokumentation zu lesen, die Oracle bereit stellt. Und da habe ich ja etwas gefunden. Mehr ist da nicht möglich.

ChatGPT erzeugt halt nicht nur Wahrheiten. Inhalte sind daher immer zu prüfen. Als Grundlage für Recherchen ist es natürlich gut. Aber das Ergebnis muss halt sein, auf den Inhalten von ChatGPT aufzusetzen und dann eigenes Wissen zu generieren aus vertrauenswürdigen Quellen und eben nicht Aussagen von ChatGPT als Wissen / Wahrheit anzunehmen.

Da ist übrigens ChatGPT Plus sehr gut - das bietet auch ein Browsing Modus an und das hilft, dann auch Quellen zu bekommen. Alternativ kann man sich bei Bing registrieren. Wenn man da freigeschaltet wird, dann bekommst Du (zumindest teilweise) auch Links. Aber die Freischaltung scheint gewisse Zeit zu brauchen (Ein Account von mir wurde schon freigeschaltet aber mein aktueller Account ist auch nach Wochen noch nicht freigeschaltet).
 

Ähnliche Java Themen

Neue Themen


Oben