Java Quiz


#451

Doppelquiz!

Bitte nicht die Antwort nachschauen,
was wird ausgegeben werden?

for (int i = 0; i < 1; System.out.println(i++ + i++), System.out.println(i++ + " " + i++))
    ;
for (int i = 0; i < 1; System.out.println(++i + ++i), System.out.println(++i + " " + ++i))
    ;

(Und ja es muss ja etwas gemeines dabei sein. :wink: )

Vergesst bitte nicht, Details zu verstecken.


#452

Das weiß jeder fortgeschrittene Java Entwickler, aber ich mag die Frage trotzdem um eine kleine aber interessante WissenslĂŒcke zu stopfen, weil das gerne mal ĂŒbersehen oder vergessen wird im immer wiederkehrenden Kontext der Standard for-Schleife



#453

@TMII Hast du auch eine Antwort? Du kannst sie ja spoilern.


#454

Kompliziert das jetzt am Handy zu lösen aber man kann eine typische for-Schleife
for(int i = 0; i < n; i++)
genauso gut so schreiben
for(int i = 0; i++ < n; )


#455

Nun macht doch jemand mal ein paar VorschlÀge, was ausgegeben werden könnte!

1 2 3 4 ist es nicht, so viel mal vorab.


#456

1 2 3
3 3 4
wenn es dich glĂŒcklich macht :stuck_out_tongue:


#457

Weiter geht es. :slight_smile:

i lÀuft von 0 bis 63:

Was wird berechnet? Und was sollte man sinnvollerweise fĂŒr das ? als Bezeichnung wĂ€hlen?

String ? = (i + (i % 16) < 8 ? 0 : 1) % 2 == 0 ? "1" : "0";

#458

Sorry ich habe Klammern vergessen:

String ? = (i + ((i % 16) < 8 ? 0 : 1)) % 2 == 0 ? "1" : "0";

#459

Welcher String da rauskommt ist ja nicht so schwer zu ermitteln (auch ohne IDE).

Aber wofĂŒr das dann steht? Keine Ahnung. Hast du einen Tipp?


#460

Vorerst sicherlich nicht. Denn der Hauptaccount des Users ist noch bis (mind.) 1. MĂ€rz gesperrt.


#461

Danke fĂŒr die info. Dass es der Zweitaccount eines bekannten Users ist hatte ich mir schon fast gedacht :wink: Inzwischen hat er mir auf indirektem weg einen Tipp gegeben.

Ich hatte tatsĂ€chlich zuerst an ein Schachbrett gedacht. Fand das wegen der fehlenden ZeilenumbrĂŒche zu schrĂ€g gedacht.

Nach diesem Tipp ist das RĂ€tsel nicht mehr so interessant. Ich hatte gehofft, da steckt eine spannende Idee dahinter. Insofern braucht niemand mehr eine Brieftaube losschicken :slight_smile:


#462

Hatte ich vielleicht schonmal gepostet, aber 


class SomeClass
{
    public SomeClass(DangerousSelfReference dangerousSelfReference)
    {
        System.out.println("State: ");
        System.out.println("   a: "+dangerousSelfReference.getA());
        System.out.println("   b: "+dangerousSelfReference.getB());
        System.out.println("   c: "+dangerousSelfReference.getC());
        System.out.println("   d: "+dangerousSelfReference.getD());
        System.out.println(" ref: "+dangerousSelfReference.getRef());
    }
}

public class DangerousSelfReference
{
    public static void main(String[] args)
    {
        DangerousSelfReference d = new DangerousSelfReference();
    }

    private String a;
    private String b = "b";
    private final SomeClass ref = new SomeClass(this);
    private final String c = "c";
    private String d = "d";

    DangerousSelfReference()
    {
        a = "a";
    }

    String getA()
    {
        return a;
    }
    String getB()
    {
        return b;
    }
    String getC()
    {
        return c;
    }
    String getD()
    {
        return d;
    }
    SomeClass getRef()
    {
        return ref;
    }
}

Was ist die Ausgabe?


#463
Zusammenfassung

Ich Tipp Mal auf ref: null. Der Konstruktor wird ausgefĂŒhrt bevor die Referenz hinterlegt wird.


#464

Die Frage bezog sich auf den ganzen State:

State: 
   a: ???
   b: ???
   c: ???
   d: ???
 ref: ???

Aber die Teilantwort war schon richtig.


#465
Meine Idee

a=null // da der Konstruktor von DangerousSelfReference erst nachdem alle member variablen initialisiert worden sind ausgefĂŒhrt wird.
b=“b”
c=“c” //hier rate ich nur dass der compiler dies schon auflöst, da es final ist.
d=null //ist noch null da der Konstruktor von SomeClass zuerst ausgefĂŒhrt wird, da die members einfach von oben nach unten durcggegangen werden.
ref=null //Konstruktor wird vor der Zuweisung ausgefĂŒhrt.


#466

AFAIK hat sich das Verhalten zwischen der Oracle 8 und Oracle 9 JVM in diesem Fall geÀndert.
Ich meine zumindest das ein Ă€hnlicher Fall erst mit J9 zu einem Absturz gefĂŒhrt hatte, weil die Reihenfolge der Initialisierung sich Ă€nderte.


#467

@AmunRa Richtig.

Details

Das Beispiel hatte ich hier als Antwort gepostet:

https://stackoverflow.com/a/23264885/3182664

Ich finde, gerade die Tatsachen dass

  • b initialisiert ist und d nicht (weil er “von oben nach unten” durchgeht)
  • c initialisiert ist und d nicht (weil c dort final ist)

sind Sachen, bei denen man zumindest kurz zögern und (dann vielleicht richtig raten, aber) nur schwer “mit Sicherheit” die richtige Antwort geben könnte.


#468

hast du im Bytecode einmal kontrolliert,ob der compiler c ĂŒberhaupt anlegt und nicht einfach in der getc Methode inlined? Macht der compiler ĂŒberhaupt solche Optimierungen?


#469

Kontrolliert nicht, aber da man sich mit Reflection die Fields abholen kann (und mit JNI auch final fields Àndern kann) ist er da im Handlungsspielraum etwas eingeschrÀnkt



#470

Mal wieder ein kleines, klassisches Quiz-Schmankerl:

List<Object> list = new ArrayList<Object>();
list.add("Do you know what");
list.add(list);
list.add("contains?");
System.out.println(list);

Was passiert? Wird etwas ausgegeben? Wenn ja, was?